From cc4277f89159305df72b882ad9b66393a7024f50 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Sun, 20 Nov 2016 23:58:11 +0000 Subject: [PATCH] merged some prev changes and freq est ported to complex. 2 and 4fsk modems work on simple cmd line tests, so thats a gd start git-svn-id: https://svn.code.sf.net/p/freetel/code@2904 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/src/freedv_api.c | 13 ++++- codec2-dev/src/fsk.c | 92 ++++++++++++++++-------------- codec2-dev/src/fsk.h | 8 +-- codec2-dev/src/fsk_demod.c | 8 ++- codec2-dev/src/fsk_get_test_bits.c | 6 +- 5 files changed, 74 insertions(+), 53 deletions(-) diff --git a/codec2-dev/src/freedv_api.c b/codec2-dev/src/freedv_api.c index 28244da4..81d3f336 100644 --- a/codec2-dev/src/freedv_api.c +++ b/codec2-dev/src/freedv_api.c @@ -866,9 +866,18 @@ int freedv_floatrx_fsk(struct freedv *f, float demod_in[], int *valid) { int i; int n_ascii; char ascii_out; - + + /* DR: 21/11/16 - temp code while porting fsk_demod to complex */ + + int n = fsk_nin(f->fsk); + COMP demod_comp[n]; + for(i=0; imode == FREEDV_MODE_2400A || f->mode == FREEDV_MODE_800XA){ - fsk_demod(f->fsk,(uint8_t*)f->tx_bits,demod_in); + fsk_demod(f->fsk,(uint8_t*)f->tx_bits,demod_comp); f->nin = fsk_nin(f->fsk); }else{ fmfsk_demod(f->fmfsk,(uint8_t*)f->tx_bits,demod_in); diff --git a/codec2-dev/src/fsk.c b/codec2-dev/src/fsk.c index 7f6a15c2..eaf73326 100644 --- a/codec2-dev/src/fsk.c +++ b/codec2-dev/src/fsk.c @@ -190,15 +190,18 @@ struct FSK * fsk_create_hbr(int Fs, int Rs,int P,int M, int tx_f1, int tx_fs) memold = (4*fsk->Ts); fsk->nstash = memold; - fsk->samp_old = (float*) malloc(sizeof(float)*memold); + fsk->samp_old = (COMP*) malloc(sizeof(COMP)*memold); if(fsk->samp_old == NULL){ free(fsk); return NULL; } - for(i=0;isamp_old[i]=0; - - fsk->fft_cfg = kiss_fftr_alloc(fsk->Ndft,0,NULL,NULL); + for(i=0;isamp_old[i].real = 0; + fsk->samp_old[i].imag = 0; + } + + fsk->fft_cfg = kiss_fft_alloc(fsk->Ndft,0,NULL,NULL); if(fsk->fft_cfg == NULL){ free(fsk->samp_old); free(fsk); @@ -303,15 +306,18 @@ struct FSK * fsk_create(int Fs, int Rs,int M, int tx_f1, int tx_fs) memold = (4*fsk->Ts); fsk->nstash = memold; - fsk->samp_old = (float*) malloc(sizeof(float)*memold); + fsk->samp_old = (COMP*) malloc(sizeof(COMP)*memold); if(fsk->samp_old == NULL){ free(fsk); return NULL; } - for(i=0;isamp_old[i]=0; + for(i=0;isamp_old[i].real = 0.0; + fsk->samp_old[i].imag = 0.0; + } - fsk->fft_cfg = kiss_fftr_alloc(Ndft,0,NULL,NULL); + fsk->fft_cfg = kiss_fft_alloc(Ndft,0,NULL,NULL); if(fsk->fft_cfg == NULL){ free(fsk->samp_old); free(fsk); @@ -370,7 +376,7 @@ void fsk_set_nsym(struct FSK *fsk,int nsyms){ free(fsk->fft_cfg); free(fsk->fft_est); - fsk->fft_cfg = kiss_fftr_alloc(Ndft,0,NULL,NULL); + fsk->fft_cfg = kiss_fft_alloc(Ndft,0,NULL,NULL); fsk->fft_est = (float*)malloc(sizeof(float)*fsk->Ndft/2); for(i=0;ifft_est[i] = 0; @@ -423,7 +429,7 @@ void fsk_set_est_limits(struct FSK *fsk,int est_min, int est_max){ * freqs - Array for the estimated frequencies * M - number of frequency peaks to find */ -void fsk_demod_freq_est(struct FSK *fsk, float fsk_in[],float *freqs,int M){ +void fsk_demod_freq_est(struct FSK *fsk, COMP fsk_in[],float *freqs,int M){ int Ndft = fsk->Ndft; int Fs = fsk->Fs; int nin = fsk->nin; @@ -433,18 +439,17 @@ void fsk_demod_freq_est(struct FSK *fsk, float fsk_in[],float *freqs,int M){ float max; float tc; int imax; - kiss_fftr_cfg fft_cfg = fsk->fft_cfg; + kiss_fft_cfg fft_cfg = fsk->fft_cfg; int freqi[M]; int f_min,f_max,f_zero; /* Array to do complex FFT from using kiss_fft */ - /* It'd probably make more sense here to use kiss_fftr */ #ifdef DEMOD_ALLOC_STACK - kiss_fft_scalar *fftin = (kiss_fft_scalar*)alloca(sizeof(kiss_fft_scalar)*Ndft); - kiss_fft_cpx *fftout = (kiss_fft_cpx*) alloca(sizeof(kiss_fft_cpx)*(Ndft/2)+1); + kiss_fft_cpx *fftin = (kiss_fft_cpx*)alloca(sizeof(kiss_fft_cpx)*Ndft); + kiss_fft_cpx *fftout = (kiss_fft_cpx*)alloca(sizeof(kiss_fft_cpx)*Ndft); #else - kiss_fft_scalar *fftin = (kiss_fft_scalar*)malloc(sizeof(kiss_fft_scalar)*Ndft); - kiss_fft_cpx *fftout = (kiss_fft_cpx*) malloc(sizeof(kiss_fft_cpx)*((Ndft/2)+1)); + kiss_fft_cpx *fftin = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx)*Ndft); + kiss_fft_cpx *fftout = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx)*Ndft); #endif fft_samps = Ndft; @@ -462,15 +467,17 @@ void fsk_demod_freq_est(struct FSK *fsk, float fsk_in[],float *freqs,int M){ for(i=0; iN; int Ts = fsk->Ts; int Rs = fsk->Rs; @@ -568,7 +575,7 @@ void fsk2_demod(struct FSK *fsk, uint8_t rx_bits[], float rx_sd[], float fsk_in[ COMP dphift; float rx_timing,norm_rx_timing,old_norm_rx_timing,d_norm_rx_timing,appm; int using_old_samps; - float *sample_src; + COMP *sample_src; COMP *f1_intbuf,*f2_intbuf; @@ -603,7 +610,7 @@ void fsk2_demod(struct FSK *fsk, uint8_t rx_bits[], float rx_sd[], float fsk_in[ fsk->f1_est = f_est[0]; fsk->f2_est = f_est[1]; } - + /* Back the stored phase off to account for re-integraton of old samples */ dphi1 = comp_exp_j(-2*(Nmem-nin-(Ts/P))*M_PI*((fsk->f1_est)/(float)(Fs))); dphi2 = comp_exp_j(-2*(Nmem-nin-(Ts/P))*M_PI*((fsk->f2_est)/(float)(Fs))); @@ -634,8 +641,8 @@ void fsk2_demod(struct FSK *fsk, uint8_t rx_bits[], float rx_sd[], float fsk_in[ dphi2 = comp_exp_j(2*M_PI*(f_est[1]/(float)(Fs))); } /* Downconvert and place into integration buffer */ - f1_intbuf[dc_i]=fcmult(sample_src[dc_i],phi1_c); - f2_intbuf[dc_i]=fcmult(sample_src[dc_i],phi2_c); + f1_intbuf[dc_i]=cmult(sample_src[dc_i],phi1_c); + f2_intbuf[dc_i]=cmult(sample_src[dc_i],phi2_c); modem_probe_samp_c("t_f1_dc",&f1_intbuf[dc_i],1); modem_probe_samp_c("t_f2_dc",&f2_intbuf[dc_i],1); @@ -662,8 +669,8 @@ void fsk2_demod(struct FSK *fsk, uint8_t rx_bits[], float rx_sd[], float fsk_in[ dphi2 = comp_exp_j(2*M_PI*((f_est[1])/(float)(Fs))); } /* Downconvert and place into integration buffer */ - f1_intbuf[cbuf_i+j]=fcmult(sample_src[dc_i],phi1_c); - f2_intbuf[cbuf_i+j]=fcmult(sample_src[dc_i],phi2_c); + f1_intbuf[cbuf_i+j]=cmult(sample_src[dc_i],phi1_c); + f2_intbuf[cbuf_i+j]=cmult(sample_src[dc_i],phi2_c); modem_probe_samp_c("t_f1_dc",&f1_intbuf[cbuf_i+j],1); modem_probe_samp_c("t_f2_dc",&f2_intbuf[cbuf_i+j],1); @@ -696,11 +703,11 @@ void fsk2_demod(struct FSK *fsk, uint8_t rx_bits[], float rx_sd[], float fsk_in[ fsk->f2_est = f_est[1]; /* Stash samples away in the old sample buffer for the next round of bit getting */ - memcpy((void*)&(fsk->samp_old[0]),(void*)&(fsk_in[nin-nstash]),sizeof(float)*nstash); + memcpy((void*)&(fsk->samp_old[0]),(void*)&(fsk_in[nin-nstash]),sizeof(COMP)*nstash); /* Fine Timing Estimation */ /* Apply magic nonlinearity to f1_int and f2_int, shift down to 0, - * exract angle */ + * extract angle */ /* Figure out how much to spin the oscillator to extract magic spectral line */ dphift = comp_exp_j(2*M_PI*((float)(Rs)/(float)(P*Rs))); @@ -873,7 +880,7 @@ void fsk2_demod(struct FSK *fsk, uint8_t rx_bits[], float rx_sd[], float fsk_in[ #endif } -void fsk4_demod(struct FSK *fsk, uint8_t rx_bits[], float fsk_in[]){ +void fsk4_demod(struct FSK *fsk, uint8_t rx_bits[], COMP fsk_in[]){ int N = fsk->N; int Ts = fsk->Ts; int Rs = fsk->Rs; @@ -898,7 +905,7 @@ void fsk4_demod(struct FSK *fsk, uint8_t rx_bits[], float fsk_in[]){ COMP dphift; float rx_timing,norm_rx_timing,old_norm_rx_timing,d_norm_rx_timing,appm; int using_old_samps; - float *sample_src; + COMP *sample_src; COMP *f1_intbuf,*f2_intbuf,*f3_intbuf,*f4_intbuf; float f_est[M],fc_avg,fc_tx; float meanebno,stdebno,eye_max; @@ -981,10 +988,10 @@ void fsk4_demod(struct FSK *fsk, uint8_t rx_bits[], float fsk_in[]){ dphi4 = comp_exp_j(2*M_PI*((f_est[3])/(float)(Fs))); } /* Downconvert and place into integration buffer */ - f1_intbuf[dc_i]=fcmult(sample_src[dc_i],phi1_c); - f2_intbuf[dc_i]=fcmult(sample_src[dc_i],phi2_c); - f3_intbuf[dc_i]=fcmult(sample_src[dc_i],phi3_c); - f4_intbuf[dc_i]=fcmult(sample_src[dc_i],phi4_c); + f1_intbuf[dc_i]=cmult(sample_src[dc_i],phi1_c); + f2_intbuf[dc_i]=cmult(sample_src[dc_i],phi2_c); + f3_intbuf[dc_i]=cmult(sample_src[dc_i],phi3_c); + f4_intbuf[dc_i]=cmult(sample_src[dc_i],phi4_c); modem_probe_samp_c("t_f1_dc",&f1_intbuf[dc_i],1); modem_probe_samp_c("t_f2_dc",&f2_intbuf[dc_i],1); @@ -1019,10 +1026,10 @@ void fsk4_demod(struct FSK *fsk, uint8_t rx_bits[], float fsk_in[]){ dphi4 = comp_exp_j(2*M_PI*((f_est[3])/(float)(Fs))); } /* Downconvert and place into integration buffer */ - f1_intbuf[cbuf_i+j]=fcmult(sample_src[dc_i],phi1_c); - f2_intbuf[cbuf_i+j]=fcmult(sample_src[dc_i],phi2_c); - f3_intbuf[cbuf_i+j]=fcmult(sample_src[dc_i],phi3_c); - f4_intbuf[cbuf_i+j]=fcmult(sample_src[dc_i],phi4_c); + f1_intbuf[cbuf_i+j]=cmult(sample_src[dc_i],phi1_c); + f2_intbuf[cbuf_i+j]=cmult(sample_src[dc_i],phi2_c); + f3_intbuf[cbuf_i+j]=cmult(sample_src[dc_i],phi3_c); + f4_intbuf[cbuf_i+j]=cmult(sample_src[dc_i],phi4_c); modem_probe_samp_c("t_f1_dc",&f1_intbuf[cbuf_i+j],1); modem_probe_samp_c("t_f2_dc",&f2_intbuf[cbuf_i+j],1); @@ -1066,7 +1073,7 @@ void fsk4_demod(struct FSK *fsk, uint8_t rx_bits[], float fsk_in[]){ fsk->f4_est = f_est[3]; /* Stash samples away in the old sample buffer for the next round of bit getting */ - memcpy((void*)&(fsk->samp_old[0]),(void*)&(fsk_in[nin-nstash]),sizeof(float)*nstash); + memcpy((void*)&(fsk->samp_old[0]),(void*)&(fsk_in[nin-nstash]),sizeof(COMP)*nstash); /* Fine Timing Estimation */ /* Apply magic nonlinearity to f1_int and f2_int, shift down to 0, @@ -1286,7 +1293,7 @@ void fsk4_demod(struct FSK *fsk, uint8_t rx_bits[], float fsk_in[]){ } -void fsk_demod(struct FSK *fsk, uint8_t rx_bits[], float fsk_in[]){ +void fsk_demod(struct FSK *fsk, uint8_t rx_bits[], COMP fsk_in[]){ if(fsk->mode == 4){ fsk4_demod(fsk,rx_bits,fsk_in); }else{ @@ -1294,10 +1301,11 @@ void fsk_demod(struct FSK *fsk, uint8_t rx_bits[], float fsk_in[]){ } } -void fsk_demod_sd(struct FSK *fsk, float rx_sd[],float fsk_in[]){ +void fsk_demod_sd(struct FSK *fsk, float rx_sd[], COMP fsk_in[]){ if(fsk->mode == 4){ - //TODO: Add 4FSK soft decision - //fsk4_demod(fsk,rx_bits,fsk_in); + assert(0); + //TODO: Add 4FSK soft decision + //fsk4_demod(fsk,rx_bits,fsk_in); }else{ fsk2_demod(fsk,NULL,rx_sd,fsk_in); } diff --git a/codec2-dev/src/fsk.h b/codec2-dev/src/fsk.h index 9058fd5a..cda02dda 100644 --- a/codec2-dev/src/fsk.h +++ b/codec2-dev/src/fsk.h @@ -61,10 +61,10 @@ struct FSK { COMP phi2_c; COMP phi3_c; COMP phi4_c; - kiss_fftr_cfg fft_cfg; /* Config for KISS FFT, used in freq est */ + kiss_fft_cfg fft_cfg; /* Config for KISS FFT, used in freq est */ float norm_rx_timing; /* Normalized RX timing */ - float *samp_old; /* Tail end of last batch of samples */ + COMP *samp_old; /* Tail end of last batch of samples */ int nstash; /* How many elements are in there */ float *fft_est; /* Freq est FFT magnitude */ @@ -163,7 +163,7 @@ uint32_t fsk_nin(struct FSK *fsk); * uint8_t rx_bits[] - Buffer for Nbits unpacked bits to be written * float fsk_in[] - nin samples of modualted FSK */ -void fsk_demod(struct FSK *fsk, uint8_t rx_bits[],float fsk_in[]); +void fsk_demod(struct FSK *fsk, uint8_t rx_bits[],COMP fsk_in[]); /* * Demodulate some number of FSK samples. The number of samples to be @@ -173,6 +173,6 @@ void fsk_demod(struct FSK *fsk, uint8_t rx_bits[],float fsk_in[]); * float rx_bits[] - Buffer for Nbits soft decision bits to be written * float fsk_in[] - nin samples of modualted FSK */ -void fsk_demod_sd(struct FSK *fsk, float rx_bits[],float fsk_in[]); +void fsk_demod_sd(struct FSK *fsk, float rx_bits[],COMP fsk_in[]); #endif diff --git a/codec2-dev/src/fsk_demod.c b/codec2-dev/src/fsk_demod.c index b0433d3a..0aa9960b 100644 --- a/codec2-dev/src/fsk_demod.c +++ b/codec2-dev/src/fsk_demod.c @@ -43,7 +43,8 @@ int main(int argc,char *argv[]){ FILE *fin,*fout; uint8_t *bitbuf; int16_t *rawbuf; - float *modbuf,*sdbuf; + COMP *modbuf; + float *sdbuf; int i,j,Ndft; int soft_dec_mode = 0; stats_loop = 0; @@ -116,12 +117,13 @@ int main(int argc,char *argv[]){ bitbuf = (uint8_t*)malloc(sizeof(uint8_t)*fsk->Nbits); } rawbuf = (int16_t*)malloc(sizeof(int16_t)*(fsk->N+fsk->Ts*2)); - modbuf = (float*)malloc(sizeof(float)*(fsk->N+fsk->Ts*2)); + modbuf = (COMP*)malloc(sizeof(COMP)*(fsk->N+fsk->Ts*2)); /* Demodulate! */ while( fread(rawbuf,sizeof(int16_t),fsk_nin(fsk),fin) == fsk_nin(fsk) ){ for(i=0;i