mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-31 04:50:29 -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
 |