mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-31 04:50:29 -04:00 
			
		
		
		
	
		
			
	
	
		
			201 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			201 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /*---------------------------------------------------------------------------*\
 | ||
|  | 
 | ||
|  |   FILE........: fdmdv_internal.h | ||
|  |   AUTHOR......: David Rowe | ||
|  |   DATE CREATED: April 16 2012 | ||
|  | 
 | ||
|  |   Header file for FDMDV internal functions, exposed via this header | ||
|  |   file for testing. | ||
|  | 
 | ||
|  | \*---------------------------------------------------------------------------*/ | ||
|  | 
 | ||
|  | /*
 | ||
|  |   Copyright (C) 2012 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 __FDMDV_INTERNAL__
 | ||
|  | #define __FDMDV_INTERNAL__
 | ||
|  | 
 | ||
|  | #include "codec2/comp.h"
 | ||
|  | #include "codec2_fdmdv.h"
 | ||
|  | #include "codec2_fft.h"
 | ||
|  | 
 | ||
|  | /*---------------------------------------------------------------------------*\
 | ||
|  | 
 | ||
|  |                                DEFINES | ||
|  | 
 | ||
|  | \*---------------------------------------------------------------------------*/ | ||
|  | 
 | ||
|  | #ifndef PI
 | ||
|  | #define PI             3.141592654
 | ||
|  | #endif
 | ||
|  | #define FS                    8000  /* sample rate in Hz                                                    */
 | ||
|  | #define T                 (1.0/FS)  /* sample period in seconds                                             */
 | ||
|  | #define RS                      50  /* symbol rate in Hz                                                    */
 | ||
|  | #define NC                      20  /* max number of data carriers (plus one pilot in the centre)           */
 | ||
|  | #define NB                       2  /* Bits/symbol for QPSK modulation                                      */
 | ||
|  | #define RB              (NC*RS*NB)  /* bit rate                                                             */
 | ||
|  | #define M_FAC                  (FS/RS)  /* oversampling factor                                                  */
 | ||
|  | #define NSYM                     6  /* number of symbols to filter over                                     */
 | ||
|  | #define NFILTER            (NSYM*M_FAC) /* size of tx/rx filters at sample rate M                               */
 | ||
|  | 
 | ||
|  | #define FSEP                    75  /* Default separation between carriers (Hz)                             */
 | ||
|  | 
 | ||
|  | #define NT                       5  /* number of symbols we estimate timing over                            */
 | ||
|  | #define P                        4  /* oversample factor used for initial rx symbol filtering output        */
 | ||
|  | #define Q                     (M_FAC/4) /* oversample factor used for initial rx symbol filtering input         */
 | ||
|  | #define NRXDEC                  31  /* number of taps in the rx decimation filter                           */
 | ||
|  | 
 | ||
|  | #define NPILOT_LUT                 (4*M_FAC)    /* number of pilot look up table samples                 */
 | ||
|  | #define NPILOTCOEFF                   30    /* number of FIR filter coeffs in LP filter              */
 | ||
|  | #define NPILOTBASEBAND (NPILOTCOEFF+M_FAC+M_FAC/P)  /* number of pilot baseband samples reqd for pilot LPF   */
 | ||
|  | #define NPILOTLPF                  (4*M_FAC)    /* number of samples we DFT pilot over, pilot est window */
 | ||
|  | #define MPILOTFFT                    256
 | ||
|  | 
 | ||
|  | #define NSYNC_MEM                6
 | ||
|  | 
 | ||
|  | #define NRX_FDM_MEM (NFILTER+M_FAC+M_FAC/P)           /* size of rx filter memory            */
 | ||
|  | #define NRXDECMEM   (NRXDEC+M_FAC+M_FAC/P)            /* size of rx decimation filter memory */
 | ||
|  | 
 | ||
|  | /* averaging filter coeffs */ | ||
|  | 
 | ||
|  | #define TRACK_COEFF              0.5
 | ||
|  | #define SNR_COEFF                0.9       /* SNR est averaging filter coeff */
 | ||
|  | 
 | ||
|  | namespace FreeDV | ||
|  | { | ||
|  | 
 | ||
|  | /*---------------------------------------------------------------------------*\
 | ||
|  | 
 | ||
|  |                                STRUCT for States | ||
|  | 
 | ||
|  | \*---------------------------------------------------------------------------*/ | ||
|  | 
 | ||
|  | struct FDMDV { | ||
|  | 
 | ||
|  |     int   Nc; | ||
|  |     float fsep; | ||
|  | 
 | ||
|  |     /* test data (test frame) states */ | ||
|  | 
 | ||
|  |     int  ntest_bits; | ||
|  |     int  current_test_bit; | ||
|  |     int *rx_test_bits_mem; | ||
|  | 
 | ||
|  |     /* Modulator */ | ||
|  | 
 | ||
|  |     int   old_qpsk_mapping; | ||
|  |     int   tx_pilot_bit; | ||
|  |     COMP  prev_tx_symbols[NC+1]; | ||
|  |     COMP  tx_filter_memory[NC+1][NSYM]; | ||
|  |     COMP  phase_tx[NC+1]; | ||
|  |     COMP  freq[NC+1]; | ||
|  |     float freq_pol[NC+1]; | ||
|  | 
 | ||
|  |     /* Pilot generation at demodulator */ | ||
|  | 
 | ||
|  |     COMP pilot_lut[NPILOT_LUT]; | ||
|  |     int  pilot_lut_index; | ||
|  |     int  prev_pilot_lut_index; | ||
|  | 
 | ||
|  |     /* freq offset estimation states */ | ||
|  | 
 | ||
|  |     codec2_fft_cfg fft_pilot_cfg; | ||
|  |     COMP pilot_baseband1[NPILOTBASEBAND]; | ||
|  |     COMP pilot_baseband2[NPILOTBASEBAND]; | ||
|  |     COMP pilot_lpf1[NPILOTLPF]; | ||
|  |     COMP pilot_lpf2[NPILOTLPF]; | ||
|  |     COMP S1[MPILOTFFT]; | ||
|  |     COMP S2[MPILOTFFT]; | ||
|  | 
 | ||
|  |     /* baseband to low IF carrier states */ | ||
|  | 
 | ||
|  |     COMP  fbb_rect; | ||
|  |     float fbb_pol; | ||
|  |     COMP  fbb_phase_tx; | ||
|  |     COMP  fbb_phase_rx; | ||
|  | 
 | ||
|  |     /* freq offset correction states */ | ||
|  | 
 | ||
|  |     float foff; | ||
|  |     COMP foff_phase_rect; | ||
|  |     float foff_filt; | ||
|  | 
 | ||
|  |     /* Demodulator */ | ||
|  | 
 | ||
|  |     COMP  rxdec_lpf_mem[NRXDECMEM]; | ||
|  |     COMP  rx_fdm_mem[NRX_FDM_MEM]; | ||
|  |     COMP  phase_rx[NC+1]; | ||
|  |     COMP  rx_filter_mem_timing[NC+1][NT*P]; | ||
|  |     float rx_timing; | ||
|  |     COMP  phase_difference[NC+1]; | ||
|  |     COMP  prev_rx_symbols[NC+1]; | ||
|  | 
 | ||
|  |     /* sync state machine */ | ||
|  | 
 | ||
|  |     int  sync_mem[NSYNC_MEM]; | ||
|  |     int  fest_state; | ||
|  |     int  sync; | ||
|  |     int  timer; | ||
|  | 
 | ||
|  |     /* SNR estimation states */ | ||
|  | 
 | ||
|  |     float sig_est[NC+1]; | ||
|  |     float noise_est[NC+1]; | ||
|  | 
 | ||
|  |     /* channel simulation */ | ||
|  | 
 | ||
|  |     float sig_pwr_av; | ||
|  | }; | ||
|  | 
 | ||
|  | /*---------------------------------------------------------------------------*\
 | ||
|  | 
 | ||
|  |                               FUNCTION PROTOTYPES | ||
|  | 
 | ||
|  | \*---------------------------------------------------------------------------*/ | ||
|  | 
 | ||
|  | void bits_to_dqpsk_symbols(COMP tx_symbols[], int Nc, COMP prev_tx_symbols[], int tx_bits[], int *pilot_bit, int old_qpsk_mapping); | ||
|  | void tx_filter(COMP tx_baseband[NC+1][M_FAC], int Nc, COMP tx_symbols[], COMP tx_filter_memory[NC+1][NSYM]); | ||
|  | void fdm_upconvert(COMP tx_fdm[], int Nc, COMP tx_baseband[NC+1][M_FAC], COMP phase_tx[], COMP freq_tx[], | ||
|  |                    COMP *fbb_phase, COMP fbb_rect); | ||
|  | void tx_filter_and_upconvert(COMP tx_fdm[], int Nc, COMP tx_symbols[], | ||
|  |                              COMP tx_filter_memory[NC+1][NSYM], | ||
|  |                              COMP phase_tx[], COMP freq[], COMP *fbb_phase, COMP fbb_rect); | ||
|  | void generate_pilot_fdm(COMP *pilot_fdm, int *bit, float *symbol, float *filter_mem, COMP *phase, COMP *freq); | ||
|  | void generate_pilot_lut(COMP pilot_lut[], COMP *pilot_freq); | ||
|  | float rx_est_freq_offset(struct FDMDV *f, COMP rx_fdm[], int nin, int do_fft); | ||
|  | void lpf_peak_pick(float *foff, float *max, COMP pilot_baseband[], COMP pilot_lpf[], codec2_fft_cfg fft_pilot_cfg, COMP S[], int nin, int do_fft); | ||
|  | void fdm_downconvert(COMP rx_baseband[NC+1][M_FAC+M_FAC/P], int Nc, COMP rx_fdm[], COMP phase_rx[], COMP freq[], int nin); | ||
|  | void rxdec_filter(COMP rx_fdm_filter[], COMP rx_fdm[], COMP rxdec_lpf_mem[], int nin); | ||
|  | void rx_filter(COMP rx_filt[NC+1][P+1], int Nc, COMP rx_baseband[NC+1][M_FAC+M_FAC/P], COMP rx_filter_memory[NC+1][NFILTER], int nin); | ||
|  | void down_convert_and_rx_filter(COMP rx_filt[NC+1][P+1], int Nc, COMP rx_fdm[], | ||
|  |                                 COMP rx_fdm_mem[], COMP phase_rx[], COMP freq[], | ||
|  |                                 float freq_pol[], int nin, int dec_rate); | ||
|  | float rx_est_timing(COMP  rx_symbols[], int Nc, | ||
|  | 		    COMP  rx_filt[NC+1][P+1], | ||
|  | 		    COMP  rx_filter_mem_timing[NC+1][NT*P], | ||
|  | 		    float env[], | ||
|  | 		    int   nin, | ||
|  |                     int   m); | ||
|  | float qpsk_to_bits(int rx_bits[], int *sync_bit, int Nc, COMP phase_difference[], COMP prev_rx_symbols[], COMP rx_symbols[], int old_qpsk_mapping); | ||
|  | void snr_update(float sig_est[], float noise_est[], int Nc, COMP phase_difference[]); | ||
|  | int freq_state(int *reliable_sync_bit, int sync_bit, int *state, int *timer, int *sync_mem); | ||
|  | float calc_snr(int Nc, float sig_est[], float noise_est[]); | ||
|  | 
 | ||
|  | } // FreeDV
 | ||
|  | 
 | ||
|  | #endif
 |