diff options
| author | Author Name <[email protected]> | 2023-07-07 12:20:59 +0930 |
|---|---|---|
| committer | David Rowe <[email protected]> | 2023-07-07 12:29:06 +0930 |
| commit | ac7c48b4dee99d4c772f133d70d8d1b38262fcd2 (patch) | |
| tree | a2d0ace57a9c0e2e5b611c4987f6fed1b38b81e7 /src/cohpsk_internal.h | |
shallow zip-file copy from codec2 e9d726bf20
Diffstat (limited to 'src/cohpsk_internal.h')
| -rw-r--r-- | src/cohpsk_internal.h | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/src/cohpsk_internal.h b/src/cohpsk_internal.h new file mode 100644 index 0000000..20c479e --- /dev/null +++ b/src/cohpsk_internal.h @@ -0,0 +1,124 @@ +/*---------------------------------------------------------------------------*\ + + FILE........: cohpsk_internal.h + AUTHOR......: David Rowe + DATE CREATED: March 2015 + + Functions that implement a coherent PSK FDM modem. + +\*---------------------------------------------------------------------------*/ + +/* + Copyright (C) 2015 David Rowe + + All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 2.1, as + published by the Free Software Foundation. This program is + distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef __COHPSK_INTERNAL__ +#define __COHPSK_INTERNAL__ + +#define NCT_SYMB_BUF (2*NSYMROWPILOT+2) +#define COHPSK_ND 2 /* diversity factor ND 1 is no diveristy, ND we have original plus + one copy */ +#define NSW 4 /* number of sync window frames */ +#define COHPSK_M 100 /* oversampling rate */ +#define COHPSK_NSYM 6 +#define COHPSK_NFILTER (COHPSK_NSYM*COHPSK_M) +#define COHPSK_EXCESS_BW 0.5 /* excess BW factor of root nyq filter */ +#define COHPSK_NT 5 /* number of symbols we estimate timing over */ + +#include "fdmdv_internal.h" +#include "kiss_fft.h" + +struct COHPSK { + COMP ch_fdm_frame_buf[NSW*NSYMROWPILOT*COHPSK_M]; /* buffer of several frames of symbols from channel */ + float pilot2[2*NPILOTSFRAME][COHPSK_NC]; + float phi_[NSYMROWPILOT][COHPSK_NC*COHPSK_ND]; /* phase estimates for this frame of rx data symbols */ + float amp_[NSYMROW][COHPSK_NC*COHPSK_ND]; /* amplitude estimates for this frame of rx data symbols */ + COMP rx_symb[NSYMROWPILOT][COHPSK_NC*COHPSK_ND]; /* demodulated symbols */ + float f_est; + COMP rx_filter_memory[COHPSK_NC*COHPSK_ND][COHPSK_NFILTER]; + COMP ct_symb_buf[NCT_SYMB_BUF][COHPSK_NC*COHPSK_ND]; + int ct; /* coarse timing offset in symbols */ + float rx_timing; /* fine timing for last symbol in frame */ + int nin; /* number of samples to input for next symbol */ + float f_fine_est; + COMP ff_rect; + COMP ff_phase; + COMP ct_symb_ff_buf[NSYMROWPILOT+2][COHPSK_NC*COHPSK_ND]; + int sync; + int sync_timer; + + int frame; + float ratio; + + float sig_rms; + float noise_rms; + + struct FDMDV *fdmdv; + + int verbose; + + int *ptest_bits_coh_tx; + int *ptest_bits_coh_rx[2]; + int *ptest_bits_coh_end; + + /* counting bit errors using pilots */ + + int npilotbits; + int npilotbiterrors; + + /* optional log variables used for testing Octave to C port */ + + COMP *rx_baseband_log; + int rx_baseband_log_col_index; + int rx_baseband_log_col_sz; + + COMP *rx_filt_log; + int rx_filt_log_col_index; + int rx_filt_log_col_sz; + + COMP *ch_symb_log; + int ch_symb_log_r; + int ch_symb_log_col_sz; + + float *rx_timing_log; + int rx_timing_log_index; + + /* demodulated bits before diversity combination for test/instrumentation purposes */ + + float rx_bits_lower[COHPSK_BITS_PER_FRAME]; + float rx_bits_upper[COHPSK_BITS_PER_FRAME]; + + /* tx amplitude weights for each carrier for test/instrumentation */ + + float carrier_ampl[COHPSK_NC*COHPSK_ND]; + + /* Flag enabling simple freq est mode */ + int freq_est_mode_reduced; +}; + +void bits_to_qpsk_symbols(COMP tx_symb[][COHPSK_NC*COHPSK_ND], int tx_bits[], int nbits); +void qpsk_symbols_to_bits(struct COHPSK *coh, float rx_bits[], COMP ct_symb_buf[][COHPSK_NC*COHPSK_ND]); +void tx_filter_and_upconvert_coh(COMP tx_fdm[], int Nc, const COMP tx_symbols[], + COMP tx_filter_memory[][COHPSK_NSYM], + COMP phase_tx[], COMP freq[], + COMP *fbb_phase, COMP fbb_rect); +void fdm_downconvert_coh(COMP rx_baseband[][COHPSK_M+COHPSK_M/P], int Nc, COMP rx_fdm[], COMP phase_rx[], COMP freq[], int nin); +void frame_sync_fine_freq_est(struct COHPSK *coh, COMP ch_symb[][COHPSK_NC*COHPSK_ND], int sync, int *next_sync); +void fine_freq_correct(struct COHPSK *coh, int sync, int next_sync); +int sync_state_machine(struct COHPSK *coh, int sync, int next_sync); +int cohpsk_fs_offset(COMP out[], COMP in[], int n, float sample_rate_ppm); + +#endif |
