mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-31 13:00:26 -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
 |