Added eye diagram plotting to fmfsk; made eye plot in fskdemodgui more flexible
authorbaobrien <baobrien@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 23 Mar 2016 18:16:17 +0000 (18:16 +0000)
committerbaobrien <baobrien@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 23 Mar 2016 18:16:17 +0000 (18:16 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2754 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/fsk_horus.m
codec2-dev/octave/fskdemodgui.py
codec2-dev/octave/tfsk.m
codec2-dev/src/fmfsk.c
codec2-dev/src/fmfsk_demod.c
codec2-dev/src/fsk.c
codec2-dev/src/modem_stats.h

index 5a5f7528dd6d32f28d304f8b238ad9f60e4f8014..5b864543f497fb21d3258a159a3f477849d9f1a1 100644 (file)
@@ -250,7 +250,7 @@ function states = est_freq(states, sf, ntones)
   % scale averaging time constant based on number of samples 
 
   tc = 0.95*Ndft/Fs;
-
+  %tc = .95;
   % Update mag DFT  ---------------------------------------------
 
   numffts = floor(length(sf)/Ndft);
index 68562b172140f4b3124b19e473b8f3d5dc07f530..20419029128cfa4d128e604d177059f10743ad90 100644 (file)
@@ -56,7 +56,7 @@ fest_plot.setLabel('bottom','Time (seconds)')
 eye_plot.disableAutoRange()
 eye_plot.setYRange(0,1)
 eye_plot.setXRange(0,15)
-
+eye_xr = 15
 
 # Data arrays...
 ebno_data = np.zeros(history_size)*np.nan
@@ -73,7 +73,7 @@ fest4_curve = fest_plot.plot(x=history_scale,y=fest_data[3,:],pen='m') # f4 = Ma
 
 # Plot update function. Reads from queue, processes and updates plots.
 def update_plots():
-       global timeout,timeout_counter,eye_plot,ebno_curve, ppm_curve, fest1_curve, fest2_curve, ebno_data, ppm_data, fest_data, in_queue
+       global timeout,timeout_counter,eye_plot,ebno_curve, ppm_curve, fest1_curve, fest2_curve, ebno_data, ppm_data, fest_data, in_queue, eye_xr
 
        try:
                if in_queue.empty():
@@ -102,8 +102,8 @@ def update_plots():
 
        # Try reading in the other 2 tones.
        try:
-               new_fest1 = in_data['f3_est']
-               new_fest2 = in_data['f4_est']
+               new_fest3 = in_data['f3_est']
+               new_fest4 = in_data['f4_est']
                fest_data[2,-1] = new_fest3
                fest_data[3,-1] = new_fest4
        except:
@@ -128,6 +128,7 @@ def update_plots():
        #Now try reading in and plotting the eye diagram
        try:
                eye_data = np.array(in_data['eye_diagram'])
+
                #eye_plot.disableAutoRange()
                eye_plot.clear()
                col_index = 0
@@ -135,7 +136,12 @@ def update_plots():
                        eye_plot.plot(line,pen=(col_index,eye_data.shape[0]))
                        col_index += 1
                #eye_plot.autoRange()
-
+               
+               #Quick autoranging for x-axis to allow for differing P and Ts values
+               if eye_xr != len(eye_data[0]) - 1:
+                       eye_xr = len(eye_data[0]) - 1
+                       eye_plot.setXRange(0,len(eye_data[0])-1)
+                       
        except Exception as e:
                pass
 
index 6d7692ad1543b953956223c45c899dfa3f35b27a..c2759dc95968284f5cc27a0300460f2374f9df60 100644 (file)
@@ -565,7 +565,7 @@ endfunction
 
 function plot_fsk_bers(M=2)
     %Range of EbNodB over which to plot
-    ebnodbrange = (3:13);
+    ebnodbrange = (4:13);
     
     berc = ones(1,length(ebnodbrange));
     bero = ones(1,length(ebnodbrange));
@@ -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(.5*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);
index 17e64216bc97ce32542217cee151a9a1e375c128..29d1678da1f3e5f9d545e8fdf116e1882a5c9456 100644 (file)
@@ -142,7 +142,7 @@ void fmfsk_mod(struct FMFSK *fmfsk, float fmfsk_out[],uint8_t bits_in[]){
  * float fsk_in[] - nin samples of modualted FMFSK from an FM radio
  */
 void fmfsk_demod(struct FMFSK *fmfsk, uint8_t rx_bits[],float fmfsk_in[]){
-    int i,j;
+    int i,j,k;
     int Ts          = fmfsk->Ts;
     int Fs          = fmfsk->Fs;
     int Rs          = fmfsk->Rs;
@@ -161,6 +161,9 @@ void fmfsk_demod(struct FMFSK *fmfsk, uint8_t rx_bits[],float fmfsk_in[]){
     int next_nin;
     float apeven,apodd;     /* Approx. prob of even or odd stream being correct */
     float currv,mdiff,lastv;
+    int neyesamp;
+    int neyeoffset;
+    float eye_max;
     uint8_t mbit;
     
     /* Shift in nin samples */
@@ -289,6 +292,28 @@ void fmfsk_demod(struct FMFSK *fmfsk, uint8_t rx_bits[],float fmfsk_in[]){
         /* Zero out all of the other things */
         fmfsk->stats->foff = 0;
         fmfsk->stats->snr_est = 0;
+        
+        /* Collect an eye diagram */
+        /* Take a sample for the eye diagrams */
+        neyesamp = fmfsk->stats->neyesamp = Ts*4;
+        neyeoffset = sample_offset+(Ts*2*28);
+        
+        fmfsk->stats->neyetr = 8;
+        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];
+        
+        eye_max = 0;
+        
+        /* Normalize eye to +/- 1 */
+        for(i=0; i<fmfsk->stats->neyetr; i++)
+            for(j=0; j<neyesamp; j++)
+                if(fabsf(fmfsk->stats->rx_eye[i][j])>eye_max)
+                    eye_max = fabsf(fmfsk->stats->rx_eye[i][j]);
+        
+        for(i=0; i<fmfsk->stats->neyetr; i++)
+            for(j=0; j<neyesamp; j++)
+                fmfsk->stats->rx_eye[i][j] = (fmfsk->stats->rx_eye[i][j]/(2*eye_max))+.5;
     }
     
     modem_probe_samp_f("t_norm_rx_timing",&norm_rx_timing,1);
index 6bd45a808947c68963065249f79aaa61d6d9a488..320aaaf530091243fedc4db34d73ba20d885de08 100644 (file)
@@ -29,7 +29,7 @@
 
 #include <stdio.h>
 #include "fmfsk.h"
-
+#include "modem_stats.h"
 #define MODEMPROBE_ENABLE
 #include "modem_probe.h"
 #include "codec2_fdmdv.h"
 int main(int argc,char *argv[]){
     struct FMFSK *fmfsk;
     int Fs,Rb;
+    struct MODEM_STATS stats;
+    float loop_time;
+    int enable_stats = 0;
+    int stats_ctr = 0;
+    int stats_loop = 0;
     FILE *fin,*fout;
     uint8_t *bitbuf;
     int16_t *rawbuf;
     float *modbuf;
-    int i,t;
+    int i,j,t;
     
     if(argc<4){
-        fprintf(stderr,"usage: %s SampleFreq BitRate InputModemRawFile OutputOneBitPerCharFile [OctaveLogFile]\n",argv[0]);
+        fprintf(stderr,"usage: %s SampleFreq BitRate InputModemRawFile OutputOneBitPerCharFile [S]\n",argv[0]);
         exit(1);
     }
     
@@ -64,13 +69,19 @@ int main(int argc,char *argv[]){
     }else{
        fout = fopen(argv[4],"w");
     }
-
-    
-    if(argc>4)
-       modem_probe_init("fmfsk2",argv[5]);
        
     /* set up FSK */
     fmfsk = fmfsk_create(Fs,Rb);
+
+    if(argc>5){
+       if(strcmp(argv[5],"S")==0){
+           enable_stats = 1;
+           fmfsk_setup_modem_stats(fmfsk,&stats);
+           loop_time = ((float)fmfsk_nin(fmfsk))/((float)Fs);
+           stats_loop = (int)(.125/loop_time);
+           stats_ctr = 0;
+       }
+    }
     
     if(fin==NULL || fout==NULL || fmfsk==NULL){
         fprintf(stderr,"Couldn't open test vector files\n");
@@ -98,6 +109,25 @@ int main(int argc,char *argv[]){
         
        fwrite(bitbuf,sizeof(uint8_t),fmfsk->nbit,fout);
         
+       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\"eye_diagram\":[");
+           for(i=0;i<stats.neyetr;i++){
+               fprintf(stderr,"[");
+               for(j=0;j<stats.neyesamp;j++){
+                   fprintf(stderr,"%f",stats.rx_eye[i][j]);
+                   if(j<stats.neyesamp-1) fprintf(stderr,",");
+               }
+               fprintf(stderr,"]");
+               if(i<stats.neyetr-1) fprintf(stderr,",");
+           }
+           
+           fprintf(stderr,"]}\n");
+           stats_ctr = stats_loop;
+       }
+       stats_ctr--;
+       
         if(fin == stdin || fout == stdin){
            fflush(fin);
            fflush(fout);
index 7662b029bc74bc4751fae57db02265f352fb0b83..db037814f4b5b0e93eab99c4610757ab77e268aa 100644 (file)
@@ -762,7 +762,7 @@ void fsk2_demod(struct FSK *fsk, uint8_t rx_bits[], float fsk_in[]){
     
         /* Take a sample for the eye diagrams */
         neyesamp = fsk->stats->neyesamp = P*2;
-        neyeoffset = high_sample+1+P;
+        neyeoffset = high_sample+1+(P*28);
         
         fsk->stats->neyetr = fsk->mode*3;
         for(j=0; j<neyesamp; j++)
@@ -1162,7 +1162,7 @@ void fsk4_demod(struct FSK *fsk, uint8_t rx_bits[], float fsk_in[]){
     
         /* Take a sample for the eye diagrams */
         neyesamp = fsk->stats->neyesamp = P*2;
-        neyeoffset = high_sample+1+P;
+        neyeoffset = low_sample+1+(P*(nsym/4));
         fsk->stats->neyetr = fsk->mode*2;
         
         for(j=0; j<neyesamp; j++)
index 71b2dcd9226fc3572761a92bd93097a12eba85f2..86309d8e83f4720a4ced89a3699c31ce3d40eb7b 100644 (file)
@@ -54,7 +54,7 @@ struct MODEM_STATS {
 
     /* eye diagram traces */
     /* Eye diagram plot -- first dim is trace number, second is the trace idx */
-    float  rx_eye[MODEM_STATS_ET_MAX][MODEM_STATS_NC_MAX+1];
+    float  rx_eye[MODEM_STATS_ET_MAX][80];
     int    neyetr;                           /* How many eye traces are plotted */
     int    neyesamp;                         /* How many samples in the eye diagram */