From: baobrien Date: Tue, 5 Apr 2016 02:07:44 +0000 (+0000) Subject: Clean up of fsk/fmfsk test; X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=d19d0aa0c067911c9fd2ae4c90da2b5f6e09f827;p=freetel-svn-tracking.git Clean up of fsk/fmfsk test; 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 --- diff --git a/codec2-dev/octave/fmfsk.m b/codec2-dev/octave/fmfsk.m index 5f1e64fe..4b3cc910 100644 --- a/codec2-dev/octave/fmfsk.m +++ b/codec2-dev/octave/fmfsk.m @@ -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 diff --git a/codec2-dev/octave/tfmfsk.m b/codec2-dev/octave/tfmfsk.m index 8af56c07..8d22b62d 100644 --- a/codec2-dev/octave/tfmfsk.m +++ b/codec2-dev/octave/tfmfsk.m @@ -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) diff --git a/codec2-dev/octave/tfsk.m b/codec2-dev/octave/tfsk.m index c2759dc9..841f076e 100644 --- a/codec2-dev/octave/tfsk.m +++ b/codec2-dev/octave/tfsk.m @@ -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) diff --git a/codec2-dev/src/fmfsk.c b/codec2-dev/src/fmfsk.c index 29d1678d..054e0a26 100644 --- a/codec2-dev/src/fmfsk.c +++ b/codec2-dev/src/fmfsk.c @@ -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; kstats->neyetr; k++) for(j=0; jstats->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 */ diff --git a/codec2-dev/src/fmfsk_demod.c b/codec2-dev/src/fmfsk_demod.c index 320aaaf5..63785143 100644 --- a/codec2-dev/src/fmfsk_demod.c +++ b/codec2-dev/src/fmfsk_demod.c @@ -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;inin = 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; diff --git a/codec2-dev/src/fsk.c b/codec2-dev/src/fsk.c index db037814..4b411194 100644 --- a/codec2-dev/src/fsk.c +++ b/codec2-dev/src/fsk.c @@ -774,9 +774,9 @@ void fsk2_demod(struct FSK *fsk, uint8_t rx_bits[], float fsk_in[]){ for(j=0; jstats->rx_eye[3][j] = cabsolute(f2_int[neyeoffset+neyesamp+j]); for(j=0; jstats->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; jstats->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 */