merged some prev changes and freq est ported to complex. 2 and 4fsk modems work...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Sun, 20 Nov 2016 23:58:11 +0000 (23:58 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Sun, 20 Nov 2016 23:58:11 +0000 (23:58 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2904 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/src/freedv_api.c
codec2-dev/src/fsk.c
codec2-dev/src/fsk.h
codec2-dev/src/fsk_demod.c
codec2-dev/src/fsk_get_test_bits.c

index 28244da47446a7d3e28532f5befefad2f071bef1..81d3f3368883f6300912e49b310ce1a14040a085 100644 (file)
@@ -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; i<n; i++) {
+        demod_comp[i].real = demod_in[i];
+        demod_comp[i].imag = 0.0;;        
+    }
+
     if(f->mode == 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);
index 7f6a15c21059df9130c159466315b337eb715e70..eaf73326fd3f9c1a3c2bced5641d882246f3a502 100644 (file)
@@ -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;i<memold;i++)fsk->samp_old[i]=0;
-    
-    fsk->fft_cfg = kiss_fftr_alloc(fsk->Ndft,0,NULL,NULL);
+    for(i=0;i<memold;i++) {
+        fsk->samp_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;i<memold;i++)fsk->samp_old[i]=0;
+    for(i=0;i<memold;i++) {
+        fsk->samp_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;i<Ndft/2;i++)fsk->fft_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; i<fft_samps; i++){
                        hann = 1-cosf((2*M_PI*(float)(i))/((float)fft_samps-1));
                        
-                       fftin[i] = (kiss_fft_scalar)0.5*hann*fsk_in[i+Ndft*j];
+                       fftin[i].r = 0.5*hann*fsk_in[i+Ndft*j].real;
+                       fftin[i].i = 0.5*hann*fsk_in[i+Ndft*j].imag;
                }
                /* Zero out the remaining slots */
                for(; i<Ndft;i++){
-                       fftin[i] = 0;
+                       fftin[i].r = 0;
+                       fftin[i].i = 0;
                }
                
                /* Do the FFT */
-               kiss_fftr(fft_cfg,fftin,fftout);
+               kiss_fft(fft_cfg,fftin,fftout);
                
                /* Find the magnitude^2 of each freq slot and stash away in the real
                * value, so this only has to be done once. Since we're only comparing
@@ -543,7 +550,7 @@ void fsk_demod_freq_est(struct FSK *fsk, float fsk_in[],float *freqs,int M){
     #endif
 }
 
-void fsk2_demod(struct FSK *fsk, uint8_t rx_bits[], float rx_sd[], float fsk_in[]){
+void fsk2_demod(struct FSK *fsk, uint8_t rx_bits[], float rx_sd[], COMP fsk_in[]){
     int N = fsk->N;
     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);
        }
index 9058fd5ad0b78faef2ffb81215a08dbd624cc7fc..cda02ddabb444fed4b4087e2929fd25c7d024afc 100644 (file)
@@ -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
index b0433d3a2d3acc9443fd03b5ca85cd0f2934471b..0aa9960b39f997e85d3bcad76243957b993df284 100644 (file)
@@ -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<fsk_nin(fsk);i++){
-            modbuf[i] = ((float)rawbuf[i])/FDMDV_SCALE;
+            modbuf[i].real = ((float)rawbuf[i])/FDMDV_SCALE;
+            modbuf[i].imag = 0.0;
         }
         if(soft_dec_mode){
             fsk_demod_sd(fsk,sdbuf,modbuf);
index 058251cf0698e928c5123bc0fe2974ea47a59db0..876b62059c9cb2e8507a99b6f24b75dce8d2f6ef 100644 (file)
@@ -67,8 +67,8 @@ int main(int argc,char *argv[]){
     bitbuf = (uint8_t*)alloca(sizeof(uint8_t)*FSK_FRAME_SIZE);
     
     /* Write out sync frame and sequence */
-    for(i=0; i<FSK_FRAME_SIZE; ){
-       bitbuf[i++] = rand()&0x1;
+    for(i=0; i<FSK_FRAME_SIZE; i++){
+       bitbuf[i] = rand()&0x1;
     }
     for(i=0;i<sizeof(init);i++){
        bitbuf[FSK_FRAME_SIZE-sizeof(init)+i]=init[i];
@@ -90,4 +90,6 @@ int main(int argc,char *argv[]){
     
     cleanup:
     fclose(fout);
+
+    return 0;
 }