mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-30 20:40:20 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			132 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*---------------------------------------------------------------------------*\
 | |
| 
 | |
|   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 ND                2                           /* diversity factor ND 1 is no diveristy, ND we have orginal plus
 | |
|                                                          one copy */
 | |
| #define NSW               4                           /* number of sync window frames */
 | |
| #define COHPSK_ND         2                           /* diversity factor   */
 | |
| #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"
 | |
| 
 | |
| namespace FreeDV
 | |
| {
 | |
| 
 | |
| 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*ND];      /* phase estimates for this frame of rx data symbols     */
 | |
|     float        amp_[NSYMROW][COHPSK_NC*ND];           /* amplitude estimates for this frame of rx data symbols */
 | |
|     COMP         rx_symb[NSYMROWPILOT][COHPSK_NC*ND];   /* demodulated symbols                                   */
 | |
|     float        f_est;
 | |
|     COMP         rx_filter_memory[COHPSK_NC*ND][COHPSK_NFILTER];
 | |
|     COMP         ct_symb_buf[NCT_SYMB_BUF][COHPSK_NC*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*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*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_NC][COHPSK_NSYM],
 | |
|                                  COMP phase_tx[], COMP freq[],
 | |
|                                  COMP *fbb_phase, COMP fbb_rect);
 | |
| void fdm_downconvert_coh(COMP rx_baseband[COHPSK_NC][COHPSK_M+COHPSK_M/P], int Nc, COMP rx_fdm[], COMP phase_rx[], COMP freq[], int nin);
 | |
| void rx_filter_coh(COMP rx_filt[COHPSK_NC+1][P+1], int Nc, COMP rx_baseband[COHPSK_NC+1][COHPSK_M+COHPSK_M/P], COMP rx_filter_memory[COHPSK_NC+1][COHPSK_NFILTER], 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);
 | |
| 
 | |
| } // FreeDV
 | |
| 
 | |
| #endif
 |