Clean up of fsk/fmfsk test;
authorbaobrien <baobrien@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 5 Apr 2016 02:07:44 +0000 (02:07 +0000)
committerbaobrien <baobrien@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 5 Apr 2016 02:07:44 +0000 (02:07 +0000)
Fixed issue with fmfsk clock offset hadling;
a bit of freedv_api work;

git-svn-id: https://svn.code.sf.net/p/freetel/code@2770 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/fmfsk.m
codec2-dev/octave/tfmfsk.m
codec2-dev/octave/tfsk.m
codec2-dev/src/fmfsk.c
codec2-dev/src/fmfsk_demod.c
codec2-dev/src/freedv_api.c
codec2-dev/src/fsk.c

index 5f1e64fe43d7723688a872135de319f34fc76813..4b3cc91068fc13acc3dd73c603fafacaff7efbf6 100644 (file)
@@ -123,10 +123,10 @@ function [rx_bits states] = fmfsk_demod(states,rx)
     %If rx timing is too far out, ask for more or less sample the next time
     % around to even it all out
     next_nin = N;
-    if norm_rx_timing > 0;
+    if norm_rx_timing > -.2;
        next_nin += Ts/2;
     end
-    if norm_rx_timing < -.8;
+    if norm_rx_timing < -.65;
        next_nin -= Ts/2;
     end
 
@@ -252,7 +252,7 @@ function fmfsk_run_sim(EbNodB,timing_offset=0,de=0,of=0,hpf=0)
   tx = tx(10:length(tx));
 
   if(timing_offset>0)
-    tx = resample(tx, 1000, 1001); % simulated 1000ppm sample clock offset
+    tx = resample(tx, 1000,1001); % simulated 1000ppm sample clock offset
   end
   
 
index 8af56c0793b11a84356feb9a0b238d5d6f3c27ec..8d22b62d1af5c58ccc4803b499194df036a74859 100644 (file)
@@ -293,7 +293,7 @@ function stats = tfmfsk_run_sim(EbNodB,timing_offset=0,de=0,of=0,hpf=0,df=0,M=2)
   tx = analog_fm_mod(fm_states, tx_pmod);
   
   if(timing_offset>0)
-    tx = resample(tx, 1000, 1001); % simulated 1000ppm sample clock offset
+    tx = resample(tx, 2000, 1999); % simulated 1000ppm sample clock offset
   end
   
   %Add frequency drift
@@ -328,7 +328,7 @@ function stats = tfmfsk_run_sim(EbNodB,timing_offset=0,de=0,of=0,hpf=0,df=0,M=2)
   rx_bits = obits;
   ber = 1;
   ox = 1;
-  for offset = (1:100)
+  for offset = (1:400)
     nerr = sum(xor(rx_bits(offset:length(rx_bits)),tx_bits(1:length(rx_bits)+1-offset)));
     bern = nerr/(bitcnt-offset);
     if(bern < ber)
@@ -342,7 +342,7 @@ function stats = tfmfsk_run_sim(EbNodB,timing_offset=0,de=0,of=0,hpf=0,df=0,M=2)
   ber = 1;
   rx_bits = cbits;
   ox = 1;
-  for offset = (1:100)
+  for offset = (1:400)
     nerr = sum(xor(rx_bits(offset:length(rx_bits)),tx_bits(1:length(rx_bits)+1-offset)));
     bern = nerr/(bitcnt-offset);
     if(bern < ber)
@@ -353,6 +353,10 @@ function stats = tfmfsk_run_sim(EbNodB,timing_offset=0,de=0,of=0,hpf=0,df=0,M=2)
   end
   offset = ox;
   berc = ber;
+  
+  printf("C BER %f in test %s\n",berc,test_name);
+  printf("Oct BER %f in test %s\n",bero,test_name);
+  
   stats.berc = berc;
   stats.bero = bero;
   
@@ -431,19 +435,20 @@ function pass = test_fmfsk_battery()
     end
 endfunction
 
-function plot_fsk_bers(M=2)
+function plot_fmfsk_bers(M=2)
     %Range of EbNodB over which to test
     ebnodbrange = (8:14);
     ebnodbs = length(ebnodbrange);
     
     %Replication of other parameters for parcellfun
+    %Turn on all of the impairments
     timingv     = repmat(1  ,1,ebnodbs);
     driftv      = repmat(1  ,1,ebnodbs);
     hpfv        = repmat(1  ,1,ebnodbs);
     deempv      = repmat(1  ,1,ebnodbs);
     outfv       = repmat(1  ,1,ebnodbs);
     
-    statv = pararrayfun(nproc(),@tfmfsk_run_sim,ebnodbrange,timingv,deempv,outfv,hpfv,driftv);
+    statv = pararrayfun(nproc(),@tfmfsk_run_sim,ebnodbrange,timingv,deempv,outfv,hpfv,driftv);    
     %statv = arrayfun(@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,Mv);
     
     for ii = (1:length(statv))
@@ -469,6 +474,5 @@ function plot_fsk_bers(M=2)
 endfunction
 
 
-%test_fsk_battery
-%plot_fsk_bers(2)
-%plot_fsk_bers(4)
+test_fmfsk_battery
+plot_fmfsk_bers(2)
index c2759dc95968284f5cc27a0300460f2374f9df60..841f076ecfc8f304924d35b9273ed3012feb123f 100644 (file)
@@ -207,7 +207,7 @@ function test_stats = fsk_demod_xt(Fs,Rs,f1,fsp,mod,tname,M=2)
         end
     end
     
-    close all
+    %close all
     
     % One part-per-thousand allowed on important parameters
     pass = 1;
@@ -321,7 +321,7 @@ endfunction
 % This throws some channel imparment or another at the C and octave modem so they 
 % may be compared.
 function stats = tfsk_run_sim(test_frame_mode,EbNodB,timing_offset,fading,df,dA,M=2)
-  frames = 60;
+  frames = 90;
   %EbNodB = 10;
   %timing_offset = 2.0; % see resample() for clock offset below
   %fading = 0;          % modulates tx power at 2Hz with 20dB fade depth, 
@@ -582,8 +582,8 @@ function plot_fsk_bers(M=2)
     Mv     = repmat(M,1,ebnodbs);
     
     
-    %statv = pararrayfun(floor(.5*nproc()),@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,Mv);
-    statv = arrayfun(@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,Mv);
+    statv = pararrayfun(floor(nproc()),@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,Mv);
+    %statv = arrayfun(@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,Mv);
     
     for ii = (1:length(statv))
         stat = statv(ii);
@@ -610,6 +610,6 @@ function plot_fsk_bers(M=2)
 endfunction
 
 
-%test_fsk_battery
-%plot_fsk_bers(2)
-%plot_fsk_bers(4)
+test_fsk_battery
+plot_fsk_bers(2)
+plot_fsk_bers(4)
index 29d1678da1f3e5f9d545e8fdf116e1882a5c9456..054e0a263f54eeeabf7524388333d3422ca3665f 100644 (file)
@@ -235,9 +235,9 @@ void fmfsk_demod(struct FMFSK *fmfsk, uint8_t rx_bits[],float fmfsk_in[]){
     /* Request fewer or greater samples next time, if fine timing is far
      * enough off. This also makes it possible to tolerate clock offsets */
     next_nin = N;
-    if(norm_rx_timing > 0)
+    if(norm_rx_timing > -.2)
         next_nin += Ts/2;
-    if(norm_rx_timing < -.8)
+    if(norm_rx_timing < -.65)
         next_nin -= Ts/2;
     fmfsk->nin = next_nin;
     
@@ -302,7 +302,7 @@ void fmfsk_demod(struct FMFSK *fmfsk, uint8_t rx_bits[],float fmfsk_in[]){
         for(k=0; k<fmfsk->stats->neyetr; k++)
             for(j=0; j<neyesamp; j++)                                 
                 fmfsk->stats->rx_eye[k][j] = rx_filt[k*neyesamp+neyeoffset+j];
-        
+               //fmfsk->stats->rx_eye[k][j] = fmfsk_in[k*neyesamp+neyeoffset+j];
         eye_max = 0;
         
         /* Normalize eye to +/- 1 */
index 320aaaf530091243fedc4db34d73ba20d885de08..63785143c79f44e1446e1e7188906421b17b2e04 100644 (file)
@@ -111,7 +111,7 @@ int main(int argc,char *argv[]){
         
        if(enable_stats && stats_ctr <= 0){
            fprintf(stderr,"{\"EbNodB\": %2.2f,\t\"ppm\": %d,",stats.snr_est,(int)stats.clock_offset);
-           fprintf(stderr,"\t\"f1_est\":%.1f,\t\"f2_est\":%.1f",0,0);
+           fprintf(stderr,"\t\"f1_est\":%.1f,\t\"f2_est\":%.1f",0.0,0.0);
            fprintf(stderr,",\t\"eye_diagram\":[");
            for(i=0;i<stats.neyetr;i++){
                fprintf(stderr,"[");
index a075d92eb905cc74f050ba4e7907477597ca7e7e..2144aefd46d85bbffe292fa765975bac5c46e489 100644 (file)
@@ -793,7 +793,9 @@ int freedv_rx(struct freedv *f, short speech_out[], short demod_in[]) {
 // float input samples version
 
 int freedv_floatrx_fsk_2400(struct freedv *f, float demod_in[], int *valid) {
+    /* Varicode and protocol bits */
     uint8_t vc_bits[2];
+    uint8_t proto_bits[3];
     short vc_bit;
     int i;
     int n_ascii;
@@ -807,7 +809,7 @@ int freedv_floatrx_fsk_2400(struct freedv *f, float demod_in[], int *valid) {
         f->nin = fmfsk_nin(f->fmfsk);
     }
     /* TODO: Protocol and varicode bits */
-    if(fvhff_deframe_bits(f->deframer,f->packed_codec_bits,NULL,NULL,(uint8_t*)f->tx_bits)){
+    if(fvhff_deframe_bits(f->deframer,f->packed_codec_bits,proto_bits,vc_bits,(uint8_t*)f->tx_bits)){
         /* Decode varicode text */
         for(i=0; i<2; i++){
             /* Note: deframe_bits spits out bits in uint8_ts while varicode_decode expects shorts */
@@ -817,6 +819,10 @@ int freedv_floatrx_fsk_2400(struct freedv *f, float demod_in[], int *valid) {
                 (*f->freedv_put_next_rx_char)(f->callback_state, ascii_out);
             }
         }
+        /* Pass proto bits on if callback is present */
+        if( f->freedv_put_next_proto != NULL){
+            (*f->freedv_put_next_proto)(f->proto_callback_state,(char*)proto_bits);
+        }
         *valid = 1;
         f->sync = 1;
         f->stats.sync = 1;
index db037814f4b5b0e93eab99c4610757ab77e268aa..4b411194b5ac2f198382492916263b587d2b6cc3 100644 (file)
@@ -774,9 +774,9 @@ void fsk2_demod(struct FSK *fsk, uint8_t rx_bits[], float fsk_in[]){
         for(j=0; j<neyesamp; j++)                                 
             fsk->stats->rx_eye[3][j] = cabsolute(f2_int[neyeoffset+neyesamp+j]);
         for(j=0; j<neyesamp; j++)                      
-            fsk->stats->rx_eye[4][j] = cabsolute(f1_int[2*neyeoffset+neyesamp+j]);
+            fsk->stats->rx_eye[4][j] = cabsolute(f1_int[neyeoffset+2*neyesamp+j]);
         for(j=0; j<neyesamp; j++)                                 
-            fsk->stats->rx_eye[5][j] = cabsolute(f2_int[2*neyeoffset+neyesamp+j]);    
+            fsk->stats->rx_eye[5][j] = cabsolute(f2_int[neyeoffset+2*neyesamp+j]);    
         
         eye_max = 0;
         /* Normalize eye to +/- 1 */