Fixed bug in even stream decoding
authorbaobrien <baobrien@01035d8c-6547-0410-b346-abe4f91aad63>
Sat, 6 Feb 2016 21:06:57 +0000 (21:06 +0000)
committerbaobrien <baobrien@01035d8c-6547-0410-b346-abe4f91aad63>
Sat, 6 Feb 2016 21:06:57 +0000 (21:06 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2687 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/fmfsk.m

index da07083bfcaf1c347daf6c576742078be24ed39e..c281f23961c1b688a851e9e7fe41c173f1477441 100644 (file)
@@ -145,37 +145,41 @@ function [rx_bits states] = fmfsk_demod(states,rx)
     apodd = 0;
     oss = states.lastint;
     
-    % Figure first 'odd' bit from the last sampled output and first new sampled output
-    mediff = oss-rx_symsamp(1);
-    rx_odd(1) = mediff>0;
-    
+    % Figure out the bits of the 'even' and 'odd' ME streams
     % Note: ii is a zero-indexed array pointer, for less mind-breaking c portage
-    for ii = (1:nsym-2)
-        mediff = rx_symsamp(ii+1)-rx_symsamp(ii+1+1);
-        mebit = mediff>0;
+    lastv = states.lastint;
+    for ii = (0:nsym-1)
+        mdiff = lastv-rx_symsamp(ii+1);
+        lastv = rx_symsamp(ii+1);
+        mbit = mdiff>0;
         
-        if mod(ii,2)==0
-            apeven += abs(mediff);
-            rx_even( floor(ii/2)+1 ) = mebit;
+        if mod(ii,2)==1
+            apeven += abs(mdiff);
+            rx_even( floor(ii/2)+1 ) = mbit;
+            %printf("ie %d iie %d\n",floor(ii/2)+1,ii);
         else
-            apodd += abs(mediff);
-            rx_odd(   floor(ii/2)+2 ) = mebit;
+            apodd  += abs(mdiff);
+            rx_odd(  floor(ii/2)+1 ) = mbit;
+            %printf("io %d iio %d\n",floor(ii/2)+2,ii );
         end
     end
+    
     % Decide on the correct ME alignment
     if(apeven>apodd)
         rx_bits = rx_even;
+        printf("using even\n");
     else
         rx_bits = rx_odd;
+        printf("using odd\n");
     end
     
-    states.lastint = rx_symsamp(nsym);
+    %states.lastint = rx_symsamp(nsym);
 endfunction
 
 % run_sim copypasted from fsk_horus.m
 % simulation of tx and rx side, add noise, channel impairments ----------------------
 
-function fmfsk_run_sim(EbNodB,timing_offset,fading,df,dA)
+function fmfsk_run_sim(EbNodB,timing_offset=0,fading=0,de=0,of=0,hpf=0)
   test_frame_mode = 2;
   frames = 70;
   %EbNodB = 3;
@@ -195,13 +199,13 @@ function fmfsk_run_sim(EbNodB,timing_offset,fading,df,dA)
   % ----------------------------------------------------------------------
 
   fm_states.pre_emp = 0;
-  fm_states.de_emp  = 0;
+  fm_states.de_emp  = de;
   fm_states.Ts      = Fs/(Rbit*2);
   fm_states.Fs      = Fs; 
   fm_states.fc      = Fs/4; 
   fm_states.fm_max  = 3E3;
   fm_states.fd      = 5E3;
-  fm_states.output_filter = 0;
+  fm_states.output_filter = of;
   fm_states = analog_fm_init(fm_states);
 
   % ----------------------------------------------------------------------
@@ -243,6 +247,7 @@ function fmfsk_run_sim(EbNodB,timing_offset,fading,df,dA)
   end
 
   [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);
@@ -266,7 +271,11 @@ function fmfsk_run_sim(EbNodB,timing_offset,fading,df,dA)
   %Demod by analog fm
   rx    = analog_fm_demod(fm_states, rx);
   
-  
+  %High-pass filter to simulate the FM radios
+  if hpf>0
+    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);