fmfsk.c now meeting fmfsk.m across wide test range
authorbaobrien <baobrien@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 9 Feb 2016 23:11:41 +0000 (23:11 +0000)
committerbaobrien <baobrien@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 9 Feb 2016 23:11:41 +0000 (23:11 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2693 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/fmfsk.m
codec2-dev/octave/tfmfsk.m

index 66fd8ab98db75744677404bbdcd758714d4c779f..b27fdf0388b55644d2cda06ad2dcfa104df913fa 100644 (file)
@@ -103,7 +103,6 @@ function [rx_bits states] = fmfsk_demod(states,rx)
     states.oldsamps = ssamps;
     
     rx_filt = zeros(1,(nsym+1)*Ts);
-    length(rx_filt)
     %Integrate Ts input samples at every offset
     %This is the same thing as filtering with a filter of all ones
     % out to Ts.
@@ -113,7 +112,6 @@ function [rx_bits states] = fmfsk_demod(states,rx)
         en = st+Ts-1;
         rx_filt(ii) = sum(ssamps(st:en));
     end
-    length(rx_filt)
     states.rx_filt = rx_filt;
     % Fine timing estimation ------------------------------------------------------
 
@@ -122,9 +120,9 @@ function [rx_bits states] = fmfsk_demod(states,rx)
     Np = length(rx_filt);
     w = 2*pi*(Rs)/Fs;
     x = (rx_filt .^ 2) * exp(-j*w*(0:Np-1))';
-    norm_rx_timing = angle(x)/(2*pi) - 0.42;
+    norm_rx_timing = angle(x)/(2*pi)-.42;
+     
     rx_timing = round(norm_rx_timing*Ts);
-    exp(-j*w*(0:Np-1))(1)
     
     %If rx timing is too far out, ask for more or less sample the next time
     % around to even it all out
@@ -138,7 +136,6 @@ function [rx_bits states] = fmfsk_demod(states,rx)
 
     states.nin = next_nin;
     states.norm_rx_timing = norm_rx_timing;
-    norm_rx_timing
     %'Even' and 'Odd' manchester bitstream.
     % We'll figure out which to produce later
     rx_even = zeros(1,nbits);
@@ -146,7 +143,7 @@ function [rx_bits states] = fmfsk_demod(states,rx)
     apeven = 0;
     apodd = 0;
 
-    sample_offset = (Ts/2)+Ts+rx_timing-1;
+    sample_offset = (Ts/2)+Ts+rx_timing-1
     
     symsamp = zeros(1,nsym);
     
@@ -156,7 +153,6 @@ function [rx_bits states] = fmfsk_demod(states,rx)
     lastv = states.lastint;
     for ii = (0:nsym-1)
         currv = rx_filt(sample_offset+(ii*Ts)+1);
-        %currv = rx_symsamp(ii+1);
         mdiff = lastv-currv;
         lastv = currv;
         mbit = mdiff>0;
@@ -170,7 +166,6 @@ function [rx_bits states] = fmfsk_demod(states,rx)
         end
     end
     states.symsamp = symsamp;
-    
     % Decide on the correct ME alignment
     if(apeven>apodd)
         rx_bits = rx_even;
@@ -250,6 +245,7 @@ function fmfsk_run_sim(EbNodB,timing_offset=0,de=0,of=0,hpf=0)
       tx_bits(1:2:length(tx_bits)) = 1;
 
   end
+  
 
   [b, a] = cheby1(4, 1, 300/Fs, 'high');   % 300Hz HPF to simulate FM radios
   
index 13c317f34bd1ec5dc660707ac4c65c3c69f326e1..a60ba1e8d0f6e63adc2bbdee2808d94a8928726a 100644 (file)
@@ -136,7 +136,7 @@ function test_stats = fmfsk_demod_xt(Fs,Rs,mod,tname,M=2)
     %Clean up files
     delete(bitvecfilename);
     delete(modvecfilename);
-    %delete(tvecfilename);
+    delete(tvecfilename);
     
     o_norm_rx_timing = [];
     o_symsamp = [];
@@ -160,25 +160,19 @@ function test_stats = fmfsk_demod_xt(Fs,Rs,mod,tname,M=2)
     end
     
     close all
-    
-    % One part-per-thousand allowed on important parameters
     pass = 1;
     
-    figure(8)
-    plot((1:length(t_rx_filt)),t_rx_filt,(1:length(o_rx_filt)),o_rx_filt);
-        figure(9)
-    plot((1:length(t_symsamp)),t_symsamp,(1:length(o_symsamp)),o_symsamp);
+    % One part-per-thousand allowed on important parameters
     
-    %vcompare(t_rx_filt,o_rx_filt,.001,8);
-    vcompare(t_norm_rx_timing,o_norm_rx_timing,'norm rx timing',.001,9);
-    vcompare(t_symsamp,o_symsamp,'symsamp',.001,10);
+    pass = vcompare(t_rx_filt,o_rx_filt,'rx filt',tname,.001,8) && pass;
+    pass = vcompare(t_norm_rx_timing,o_norm_rx_timing,'norm rx timing',tname,.001,9) && pass;
+    pass = vcompare(t_symsamp,o_symsamp,'symsamp',tname,.001,10) && pass;
     
     assert(pass);
     diffpass = sum(xor(obits,bits'))<4;
     diffbits = sum(xor(obits,bits'));
     
     
-    
     if diffpass==0
         printf('\n***bitcompare test failed test %s diff %d\n\n',tname,sum(xor(obits,bits')))
         figure(15)
@@ -233,15 +227,13 @@ endfunction
 % run_sim copypasted from fsk_horus.m
 % simulation of tx and rx side, add noise, channel impairments ----------------------
 
-function stats = tfmfsk_run_sim(EbNodB,timing_offset=0,de=0,of=0,hpf=0,M=2)
+function stats = tfmfsk_run_sim(EbNodB,timing_offset=0,de=0,of=0,hpf=0,df=0,M=2)
   test_frame_mode = 2;
   frames = 70;
   %EbNodB = 3;
   %timing_offset = 0.0; % see resample() for clock offset below
   %fading = 0;          % modulates tx power at 2Hz with 20dB fade depth, 
                        % to simulate balloon rotating at end of mission
-  df     = 0;          % tx tone freq drift in Hz/s
-  dA     = 1;          % amplitude imbalance of tones (note this affects Eb so not a gd idea)
 
   more off
   rand('state',1); 
@@ -303,16 +295,18 @@ function stats = tfmfsk_run_sim(EbNodB,timing_offset=0,de=0,of=0,hpf=0,M=2)
   [b, a] = cheby1(4, 1, 300/Fs, 'high');   % 300Hz HPF to simulate FM radios
   
   tx_pmod = fmfsk_mod(states, tx_bits);
-  figure(10)
-  plot(tx_pmod);
+  
   tx = analog_fm_mod(fm_states, tx_pmod);
   
-  tx = tx(10:length(tx));
   if(timing_offset>0)
     tx = resample(tx, 1000, 1001); % simulated 1000ppm sample clock offset
   end
   
-
+  %Add frequency drift
+  fdrift = df/Fs
+  fshift = 2*pi*fdrift*(1:length(tx));
+  fshift = exp(j*(fshift.^2));
+  tx = tx.*fshift;
   noise = sqrt(variance)*randn(length(tx),1);
   rx    = tx + noise';
   
@@ -324,29 +318,10 @@ function stats = tfmfsk_run_sim(EbNodB,timing_offset=0,de=0,of=0,hpf=0,M=2)
     printf("high-pass filtering!\n")
     rx = filter(b,a,rx);
   end
-  %rx = real(rx);
-  %b1 = fir2(100, [0 4000 5200 48000]/48000, [1 1 0.5 0.5]);
-  %rx = filter(b1,1,rx);
-  %[b a] = cheby2(6,40,[3000 6000]/(Fs/2));
-  %rx = filter(b,a,rx);
-  %rx = sign(rx);
-  %rx(find (rx > 1)) = 1;
-  %rx(find (rx < -1)) = -1;
-
-  % dump simulated rx file
 
   timing_offset_samples = round(timing_offset*states.Ts);
   st = 1 + timing_offset_samples;
   rx_bits_buf = zeros(1,2*nbit);
-  x_log = [];
-  timing_nl_log = [];
-  norm_rx_timing_log = [];
-  f_int_resample_log = [];
-  f_log = [];
-  EbNodB_log = [];
-  rx_bits_log = [];
-  rx_bits_sd_log = [];
-
 
   test_name = sprintf("tfmfsk run sim EbNodB:%d frames:%d timing_offset:%d df:%d",EbNodB,frames,timing_offset,df);
   tstats = fmfsk_demod_xt(Fs,Rbit,rx',test_name,M); 
@@ -409,20 +384,19 @@ function stats = tfmfsk_run_sim(EbNodB,timing_offset=0,de=0,of=0,hpf=0,M=2)
  endfunction
 
 
-function pass = ebno_battery_test(timing_offset,fading,df,dA,M)
+function pass = ebno_battery_test(timing_offset,drift,hpf,deemp,outfilt)
     %Range of EbNodB over which to test
-    ebnodbrange = (3:2:13);
+    ebnodbrange = (8:2:20);
     ebnodbs = length(ebnodbrange);
     
-    mode = 2;
     %Replication of other parameters for parcellfun
-    modev   = repmat(mode,1,ebnodbs);
     timingv = repmat(timing_offset,1,ebnodbs);
-    fadingv = repmat(fading,1,ebnodbs);
-    dfv     = repmat(df,1,ebnodbs);
-    dav     = repmat(dA,1,ebnodbs);
-    mv      = repmat(M,1,ebnodbs);
-    statv = pararrayfun(floor(1.25*nproc()),@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,mv);
+    driftv = repmat(timing_offset,1,ebnodbs);
+    hpfv = repmat(timing_offset,1,ebnodbs);
+    deempv = repmat(timing_offset,1,ebnodbs);
+    outfv = repmat(timing_offset,1,ebnodbs);
+    
+    statv = pararrayfun(floor(1.25*nproc()),@tfmfsk_run_sim,ebnodbrange,timingv,deempv,outfv,hpfv,driftv);
     %statv = arrayfun(@tfsk_run_sim,modev,ebnodbrange,timingv,fadingv,dfv,dav,mv);
 
     passv = zeros(1,length(statv));
@@ -439,29 +413,25 @@ function pass = ebno_battery_test(timing_offset,fading,df,dA,M)
 endfunction
 
 %Test with and without sample clock offset
-function pass = test_timing_var(df,dA,M)
-    pass = ebno_battery_test(1,0,df,dA,M)
+function pass = test_timing_var(drift,hpf,deemp,outfilt)
+    pass = ebno_battery_test(1,drift,hpf,deemp,outfilt)
     assert(pass)
-    pass = pass && ebno_battery_test(0,0,df,dA,M)
+    pass = ebno_battery_test(0,drift,hpf,deemp,outfilt)
     assert(pass)
 endfunction
 
 %Test with and without 1 Hz/S freq drift
-function pass = test_drift_var(M)
-    pass = test_timing_var(1,1,M)
+function pass = test_drift_var(hpf,deemp,outfilt)
+    pass = test_timing_var(1,hpf,deemp,outfilt)
     assert(pass)
-    pass = pass && test_timing_var(0,1,M)
+    pass = pass && test_timing_var(0,hpf,deemp,outfilt)
     assert(pass)
 endfunction
 
-function pass = test_fsk_battery()
+function pass = test_fmfsk_battery()
     pass = test_mod_horuscfg_randbits;
     assert(pass)
-    pass = pass && test_mod_horuscfgm4_randbits;
-    assert(pass)
-    pass = pass && test_drift_var(4);
-    assert(pass)
-    pass = pass && test_drift_var(2);
+    pass = pass && test_drift_var(1,1,1);
     assert(pass)
     if pass
         printf("***** All tests passed! *****\n");