From 9d47f61309ecf89fcf4fc4001982c03ec55b380e Mon Sep 17 00:00:00 2001 From: baobrien Date: Wed, 23 Mar 2016 18:16:17 +0000 Subject: [PATCH] Added eye diagram plotting to fmfsk; made eye plot in fskdemodgui more flexible git-svn-id: https://svn.code.sf.net/p/freetel/code@2754 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/octave/fsk_horus.m | 2 +- codec2-dev/octave/fskdemodgui.py | 16 ++++++++---- codec2-dev/octave/tfsk.m | 6 ++--- codec2-dev/src/fmfsk.c | 27 +++++++++++++++++++- codec2-dev/src/fmfsk_demod.c | 44 +++++++++++++++++++++++++++----- codec2-dev/src/fsk.c | 4 +-- codec2-dev/src/modem_stats.h | 2 +- 7 files changed, 81 insertions(+), 20 deletions(-) diff --git a/codec2-dev/octave/fsk_horus.m b/codec2-dev/octave/fsk_horus.m index 5a5f7528..5b864543 100644 --- a/codec2-dev/octave/fsk_horus.m +++ b/codec2-dev/octave/fsk_horus.m @@ -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); diff --git a/codec2-dev/octave/fskdemodgui.py b/codec2-dev/octave/fskdemodgui.py index 68562b17..20419029 100644 --- a/codec2-dev/octave/fskdemodgui.py +++ b/codec2-dev/octave/fskdemodgui.py @@ -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 diff --git a/codec2-dev/octave/tfsk.m b/codec2-dev/octave/tfsk.m index 6d7692ad..c2759dc9 100644 --- a/codec2-dev/octave/tfsk.m +++ b/codec2-dev/octave/tfsk.m @@ -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); diff --git a/codec2-dev/src/fmfsk.c b/codec2-dev/src/fmfsk.c index 17e64216..29d1678d 100644 --- a/codec2-dev/src/fmfsk.c +++ b/codec2-dev/src/fmfsk.c @@ -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; kstats->neyetr; k++) + for(j=0; jstats->rx_eye[k][j] = rx_filt[k*neyesamp+neyeoffset+j]; + + eye_max = 0; + + /* Normalize eye to +/- 1 */ + for(i=0; istats->neyetr; i++) + for(j=0; jstats->rx_eye[i][j])>eye_max) + eye_max = fabsf(fmfsk->stats->rx_eye[i][j]); + + for(i=0; istats->neyetr; i++) + for(j=0; jstats->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); diff --git a/codec2-dev/src/fmfsk_demod.c b/codec2-dev/src/fmfsk_demod.c index 6bd45a80..320aaaf5 100644 --- a/codec2-dev/src/fmfsk_demod.c +++ b/codec2-dev/src/fmfsk_demod.c @@ -29,7 +29,7 @@ #include #include "fmfsk.h" - +#include "modem_stats.h" #define MODEMPROBE_ENABLE #include "modem_probe.h" #include "codec2_fdmdv.h" @@ -37,14 +37,19 @@ 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;istats->neyesamp = P*2; - neyeoffset = high_sample+1+P; + neyeoffset = high_sample+1+(P*28); fsk->stats->neyetr = fsk->mode*3; for(j=0; jstats->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