4FSK modem, now with noisy channels!
authorbaobrien <baobrien@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 16 Sep 2015 00:45:01 +0000 (00:45 +0000)
committerbaobrien <baobrien@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 16 Sep 2015 00:45:01 +0000 (00:45 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2337 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/fsk4.m

index 20206cb405dab3c6df9d513a069c601df09e7d57..ef5d740d6559e6668511c43ec460135e5bbf8a57 100644 (file)
@@ -112,8 +112,8 @@ function [bits err] = fsk4_demod_fmrid(fsk4_states, rx)
   [errseven,deceven] = min(abs(evensyms - dmsyms));
   [errsodd ,decodd ] = min(abs(oddsyms  - dmsyms));
 
-  terreven = mean(errseven)
-  terrodd  = mean(errsodd )
+  terreven = mean(errseven);
+  terrodd  = mean(errsodd );
 
   if terreven < terrodd
     sym = deceven;
@@ -129,22 +129,38 @@ function [bits err] = fsk4_demod_fmrid(fsk4_states, rx)
   end
 endfunction
 
-function ber = nfbert(rxoffset)
+% Bit error rate test
+% for a noise-free channel
+% now supports noisy channels
+function ber = nfbert(aEbNodB)
   bitcnt = 48000;
   offset = 29;
   test_bits = [zeros(1,100) rand(1,bitcnt)>.5]; %Random bits. Pad with zeros to prime the filters
   fsk4_states.M = 1;
   fsk4_states = fsk4_init(fsk4_states,2400);
-  txrf = fsk4_mod(fsk4_states,test_bits);
-   
-  txrf = [txrf(offset:length(txrf)) zeros(1,offset)];
+  Fs = fsk4_states.Fs;
+  Rs = fsk4_states.Rs * 2;  %Multiply symbol rate by 2, since we have 2 bits per symbol
+
+  tx = fsk4_mod(fsk4_states,test_bits);
+  
   %add noise here
+  %shamelessly copied from gmsk.m
+
+  EbNo = 10^(aEbNodB/10);
+  variance = Fs/(Rs*EbNo);
+  nsam = length(tx);
+  noise = sqrt(variance/2)*(randn(1,nsam) + j*randn(1,nsam));
+  rx    = tx*exp(j*pi/2) + noise;
+
+  [rx_bits,rx_err] = fsk4_demod_fmrid(fsk4_states,rx);
+  ber = 1;
   
-  [rx_bits,rx_err] = fsk4_demod_fmrid(fsk4_states,txrf);
- % for offset = (25:31)
- %  offset
-   ber = sum(xor(rx_bits(offset:length(rx_bits)),test_bits(1:length(rx_bits)+1-offset)))/(bitcnt-offset);
- % end
+  %thing to account for offset from input data to output data
+  %No preamble detection yet
+  for offset = (25:31)
+    bern = sum(xor(rx_bits(offset:length(rx_bits)),test_bits(1:length(rx_bits)+1-offset)))/(bitcnt-offset);
+    ber = min([ber bern]);
+  end
   plot((1:1000),rx_bits(1:1000),(1:1000),rx_err(1:1000));
 endfunction