complex input fsk_demod running OK with test_ldpc_fsk_lib.m framework. gd BER and...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 21 Nov 2016 21:42:40 +0000 (21:42 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 21 Nov 2016 21:42:40 +0000 (21:42 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2905 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/ldpc_fsk_lib.m
codec2-dev/octave/test_ldpc_fsk_lib.m
codec2-dev/src/fsk.c
codec2-dev/src/fsk_demod.c
codec2-dev/unittest/tfsk.c

index db3e6353804cb9fb616968870453d5a17546d059..a47169dc798707c644cbcdeebfae304e225dfd0e 100644 (file)
@@ -264,7 +264,7 @@ function frame_rs232 = gen_sstv_frame
   % generate payload data bytes and checksum\r
 \r
   data = floor(rand(1,256)*256);\r
-  % data = zeros(1,256);\r
+  %data = zeros(1,256);\r
   checksum = crc16(data);\r
   data = [data hex2dec(checksum(3:4)) hex2dec(checksum(1:2))];\r
 \r
@@ -279,7 +279,7 @@ function frame_rs232 = gen_sstv_frame
 \r
   % pack back into bytes to match python code \r
 \r
-  lpacked_codeword = length(codeword)/8\r
+  lpacked_codeword = length(codeword)/8;\r
   packed_codeword = zeros(1,lpacked_codeword);\r
   for b=1:lpacked_codeword\r
     st = (b-1)*8 + 1;\r
index e5109cdd1218f1563f374428b29894a2eb661e0d..a0f6d92be4f2358421c1a7e88792fb503428575e 100644 (file)
@@ -449,10 +449,15 @@ function [n_uncoded_errs n_uncoded_bits] = run_sstv_sim(sim_in, EbNodB)
     rx = tx + noise_complex;\r
     SNRdB = 10*log10(var(tx)/var(noise_real));\r
     \r
-    printf("resampling ...\n");\r
+    printf("fract resampling ...\n");\r
     rx_resample_fract = fractional_resample(rx, 1.08331);\r
     save_rtlsdr("fsk_demod_resample.iq", rx_resample_fract);\r
 \r
+    % useful for HackRF\r
+    %printf("10X resampling ...\n");\r
+    %rx_resample_10M = resample(rx_resample_fract, 10, 1);\r
+    %save_rtlsdr("fsk_demod_10M.iq", rx_resample_10M);\r
+\r
     printf("run C cmd line chain - uncoded PER\n");\r
     system("cat fsk_demod_resample.iq | csdr convert_u8_f | csdr bandpass_fir_fft_cc 0.1 0.4 0.05 | csdr realpart_cf | csdr convert_f_s16 | ../unittest/tsrc - - 0.9230968 | ../build_linux/src/fsk_demod 2X 8 9600 1200 - - | ../src/drs232 - /dev/null -v");\r
 \r
@@ -460,7 +465,34 @@ function [n_uncoded_errs n_uncoded_bits] = run_sstv_sim(sim_in, EbNodB)
     system("cat fsk_demod_resample.iq | csdr convert_u8_f | csdr bandpass_fir_fft_cc 0.1 0.4 0.05 | csdr realpart_cf | csdr convert_f_s16 | ../unittest/tsrc - - 0.9230968 | ../build_linux/src/fsk_demod 2XS 8 9600 1200 - - | ../src/drs232_ldpc - /dev/null -v");\r
   end\r
 \r
-  if demod_type != 5\r
+  if demod_type == 6\r
+    % C demod with complex input driven simplfied csdr command line, just measure BER of demod\r
+\r
+    assert(states.tx_real == 0, "need complex signal for this test");\r
+    rx = tx + noise_complex;\r
+    SNRdB = 10*log10(var(tx)/var(noise_real));\r
+    save_rtlsdr("fsk_demod.iq", rx);\r
+    system("cat fsk_demod.iq | csdr convert_u8_f | csdr convert_f_s16 | ../build_linux/src/fsk_demod 2X 8 9600 1200 - fsk_demod.bin C");\r
+\r
+    f = fopen("fsk_demod.bin","rb"); rx_bit_stream = fread(f, "uint8")'; fclose(f);\r
+  end\r
+\r
+  if demod_type == 7\r
+    % C demod with complex input, measure uncoded and uncoded PER\r
+\r
+    assert(states.tx_real == 0, "need complex signal for this test");\r
+    rx = tx + noise_complex;\r
+    SNRdB = 10*log10(var(tx)/var(noise_real));\r
+    save_rtlsdr("fsk_demod.iq", rx);\r
+\r
+    printf("run C cmd line chain - uncoded PER\n");\r
+    system("cat fsk_demod.iq | csdr convert_u8_f | csdr convert_f_s16 | ../build_linux/src/fsk_demod 2X 8 9600 1200 - - C | ../src/drs232 - /dev/null -v");\r
+\r
+    printf("run C cmd line chain - LDPC coded PER\n");\r
+    system("cat fsk_demod.iq | csdr convert_u8_f | csdr convert_f_s16 | ../build_linux/src/fsk_demod 2XS 8 9600 1200 - - C | ../src/drs232_ldpc - /dev/null -v");\r
+  end\r
+\r
+  if (demod_type != 5) && (demod_type != 7)\r
     % state machine. Look for SSTV UW.  When found count bit errors over one frame of bits\r
 \r
     state = "wait for uw";\r
@@ -793,13 +825,12 @@ if demo == 10
   \r
 end\r
 \r
-\r
 % Measure PER of complete coded and uncoded system\r
 \r
 if demo == 11\r
   sim_in.frames = 100;\r
   EbNodB = 7;\r
-  sim_in.demod_type = 5;\r
+  sim_in.demod_type = 7;\r
   run_sstv_sim(sim_in, EbNodB);\r
 end\r
 \r
index eaf73326fd3f9c1a3c2bced5641d882246f3a502..0dd4c3ce713e9814364f338fa5cf7aba5dffb104 100644 (file)
@@ -641,8 +641,8 @@ void fsk2_demod(struct FSK *fsk, uint8_t rx_bits[], float rx_sd[], COMP fsk_in[]
             dphi2 = comp_exp_j(2*M_PI*(f_est[1]/(float)(Fs)));
         }
         /* Downconvert and place into integration buffer */
-        f1_intbuf[dc_i]=cmult(sample_src[dc_i],phi1_c);
-        f2_intbuf[dc_i]=cmult(sample_src[dc_i],phi2_c);
+        f1_intbuf[dc_i]=cmult(sample_src[dc_i],cconj(phi1_c));
+        f2_intbuf[dc_i]=cmult(sample_src[dc_i],cconj(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);
@@ -669,8 +669,8 @@ void fsk2_demod(struct FSK *fsk, uint8_t rx_bits[], float rx_sd[], COMP 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]=cmult(sample_src[dc_i],phi1_c);
-            f2_intbuf[cbuf_i+j]=cmult(sample_src[dc_i],phi2_c);
+            f1_intbuf[cbuf_i+j]=cmult(sample_src[dc_i],cconj(phi1_c));
+            f2_intbuf[cbuf_i+j]=cmult(sample_src[dc_i],cconj(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);
index 0aa9960b39f997e85d3bcad76243957b993df284..96f287c818fca83bcc1e2e0cf59663b1b9e9093e 100644 (file)
@@ -48,11 +48,15 @@ int main(int argc,char *argv[]){
     int i,j,Ndft;
     int soft_dec_mode = 0;
     stats_loop = 0;
-    
+    int complex_input = 1;
     
     if(argc<7){
-        fprintf(stderr,"usage: %s (2|4|2X|4X|2XS) P SampleFreq SymbolFreq InputModemRawFile OutputOneBitPerCharFile [S]\n",argv[0]);
-        exit(1);
+        fprintf(stderr,"usage: %s (2|4|2X|4X|2XS) P SampleFreq SymbolFreq InputModemRawFile OutputOneBitPerCharFile [S] [C]\n",argv[0]);
+        fprintf(stderr, "2   - 2FSK low bit rate\n4   - 4FSK low bit rate\n2X  - 2FSK high bit rate\n4   - 4FSK high bit rate\n2XS - high bit rate soft decision output\n\n");
+         fprintf(stderr, "P   - timing estimator window size, see README_fsk\n");
+         fprintf(stderr, "S   - dump demod stats to stderr for plotting with octave/fskdemodgui.py\n");
+         fprintf(stderr, "C   - complex (two sample) input\n");
+       exit(1);
     }
     
     /* Extract parameters */
@@ -99,7 +103,8 @@ int main(int argc,char *argv[]){
         goto cleanup;
     }
     
-    /* Check for and enable stat printing */
+    /* Check for and enable stat printing and complex input */
+    /* TODO: design better command line arguments */
     if(argc>7){
         if(strcmp(argv[7],"S")==0){
             enable_stats = 1;
@@ -108,22 +113,45 @@ int main(int argc,char *argv[]){
             stats_loop = (int)(.125/loop_time);
             stats_ctr = 0;
         }
+        if(strcmp(argv[7],"C")==0){
+            complex_input = 2;
+        }
     }
-    
+    if(argc>8){
+        if(strcmp(argv[8],"S")==0){
+            enable_stats = 1;
+            fsk_setup_modem_stats(fsk,&stats);
+            loop_time = ((float)fsk_nin(fsk))/((float)Fs);
+            stats_loop = (int)(.125/loop_time);
+            stats_ctr = 0;
+        }
+        if(strcmp(argv[8],"C")==0){
+            complex_input = 2;
+        }
+    }
+       
     /* allocate buffers for processing */
     if(soft_dec_mode){
         sdbuf = (float*)malloc(sizeof(float)*fsk->Nbits);
     }else{
         bitbuf = (uint8_t*)malloc(sizeof(uint8_t)*fsk->Nbits);
     }
-    rawbuf = (int16_t*)malloc(sizeof(int16_t)*(fsk->N+fsk->Ts*2));
+    rawbuf = (int16_t*)malloc(sizeof(int16_t)*(fsk->N+fsk->Ts*2)*complex_input);
     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].real = ((float)rawbuf[i])/FDMDV_SCALE;
-            modbuf[i].imag = 0.0;
+    while( fread(rawbuf,sizeof(int16_t)*complex_input,fsk_nin(fsk),fin) == fsk_nin(fsk) ){
+        if (complex_input == 1) {
+            for(i=0;i<fsk_nin(fsk);i++){
+                modbuf[i].real = ((float)rawbuf[i])/FDMDV_SCALE;
+                modbuf[i].imag = 0.0;
+            }
+        }
+        else {
+            for(i=0;i<fsk_nin(fsk);i++){
+                modbuf[i].real = ((float)rawbuf[2*i])/FDMDV_SCALE;
+                modbuf[i].imag = ((float)rawbuf[2*i+1])/FDMDV_SCALE;
+            }
         }
         if(soft_dec_mode){
             fsk_demod_sd(fsk,sdbuf,modbuf);
index 0c350d7b4279bd409d2574f2f7a99317281ef9dc..dbc80faa15aaaf55bcd3e9997cd70b8a9d755171 100644 (file)
@@ -191,7 +191,14 @@ int main(int argc,char *argv[]){
         /* Demod-only test */
         if(test_type == TEST_DEMOD){
             while( fread(modbuf,sizeof(float),fsk_nin(fsk),fin) == fsk_nin(fsk) ){
-                fsk_demod(fsk,bitbuf,modbuf);
+                /* DR 21/11/16 temp code during port to complex */
+                int n = fsk_nin(fsk);
+                COMP modbuf_comp[n];
+                for(i=0; i<n; i++) {
+                    modbuf_comp[i].real = modbuf[i];
+                    modbuf_comp[i].imag = 0.0;
+                }
+                fsk_demod(fsk,bitbuf,modbuf_comp);
                 fwrite(bitbuf,sizeof(uint8_t),fsk->Nbits,fout);
             }
         }
@@ -200,7 +207,14 @@ int main(int argc,char *argv[]){
             bitbufp = bitbuf;
             modbufp = modbuf;
             while( modbufp < modbuf + modbufsize){
-                fsk_demod(fsk,bitbuf,modbuf);
+                /* DR 21/11/16 temp code during port to complex */
+                int n = fsk_nin(fsk);
+                COMP modbuf_comp[n];
+                for(i=0; i<n; i++) {
+                    modbuf_comp[i].real = modbuf[i];
+                    modbuf_comp[i].imag = 0.0;
+                }
+                fsk_demod(fsk,bitbuf,modbuf_comp);
                 modbufp += fsk_nin(fsk);
             }
         }