first pass of integrating fdmdv modem with ldpc simulation in Octave
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 9 Jan 2014 06:44:56 +0000 (06:44 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 9 Jan 2014 06:44:56 +0000 (06:44 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1353 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/fdmdv.m
codec2-dev/octave/fdmdv_demod.m
codec2-dev/octave/ldpcdec.m

index 2a8da1e8549c17ad9be262b0e9785ad9c7fbbc68..a0b9b6a56a285a7043a2389eae28e965f6559a85 100644 (file)
@@ -964,6 +964,32 @@ function png_file(fig, pngfilename)
   print(pngname, '-dpng', "-S800,600")
 endfunction
 
+
+% dump rx_bits in hex
+
+function dump_bits(rx_bits)
+
+    % pack into bytes, MSB first
+
+    packed = zeros(1,floor(length(rx_bits)+7)/8);
+    bit = 7; byte = 1;
+    for i=1:length(rx_bits)
+        packed(byte) = bitor(packed(byte), bitshift(rx_bits(i),bit));
+        bit--;
+        if (bit < 0)
+            bit = 7;
+            byte++;
+        end 
+    end
+
+    for i=1:length(packed)
+        printf("0x%02x ", packed(i)); 
+    end
+    printf("\n");
+
+endfunction
+
+
 % Initialise ----------------------------------------------------
 
 global pilot_bit;
index b0e313f2c1e579025cad257778664e5106bfd4ae..2fe42702d10a349017dbc83433820b01984fcd20 100644 (file)
@@ -8,7 +8,7 @@
 % Version 2
 %
 
-function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename)
+function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename, symbolfilename)
 
   fdmdv; % include modem code
   
@@ -46,7 +46,7 @@ function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename)
 
   % misc states
 
-  nin = M; % timing correction for sample rate differences
+  nin = M;                 % timing correction for sample rate differences
   foff = 0;
   track_log = [];
   track = 0;
@@ -59,6 +59,14 @@ function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename)
   spec_mem=zeros(1,Nspec);
   SdB = zeros(1,Nspec);
 
+  % optionally save output symbols 
+
+  if nargin == 5
+    fm = fopen(symbolfilename,"wb");
+    dual_rx_symbols = zeros(1, 2*Nc);
+    dual_rx_bits = zeros(1,2*Nc*Nb);
+  end
+
   % Main loop ----------------------------------------------------
 
   for f=1:frames
@@ -117,6 +125,28 @@ function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename)
       rx_symbols_log = [rx_symbols_log rx_symbols];
     endif
     [rx_bits sync f_err pd] = psk_to_bits(prev_rx_symbols, rx_symbols, modulation);
+
+    % optionally save output symbols 
+
+    if (nargin == 5) && (track == 1)
+      if sync == 1 
+          dual_rx_symbols(Nc+1:2*Nc) = rx_symbols(1:Nc).*conj(prev_rx_symbols(1:Nc)./abs(prev_rx_symbols(1:Nc)));
+          dual_rx_symbols_float32 = []; k = 1;
+          for i=1:2*Nc
+              dual_rx_symbols_float32(k++) = real(dual_rx_symbols(i));
+              dual_rx_symbols_float32(k++) = imag(dual_rx_symbols(i));
+          end
+          fwrite(fm, dual_rx_symbols_float32, "float32");
+          dual_rx_bits(Nc*Nb+1:2*Nc*Nb) = rx_bits;
+          dump_bits(dual_rx_bits);
+      else
+          dual_rx_symbols(1:Nc) = rx_symbols(1:Nc).*conj(prev_rx_symbols(1:Nc)./abs(prev_rx_symbols(1:Nc)));
+          dual_rx_bits(1:Nc*Nb) = rx_bits;
+      end
+    end
+
+    % update some states
+
     [sig_est noise_est] = snr_update(sig_est, noise_est, pd);
     snr_est = calc_snr(sig_est, noise_est);
     snr_est_log = [snr_est_log snr_est];
@@ -285,7 +315,7 @@ if 0
   axis([1 lep/(Nc*Nb) 0 Nc])
 end
 
-  % save error pattern file
+  % optionally save error pattern file
 
   if nargin == 4
     fout = fopen(errorpatternfilename, "wb");
@@ -293,4 +323,5 @@ end
     fclose(fout);
   end
 
+
 endfunction
index 0b75aefd36e45d581fbe0977fd188e7b565b9d58..6e261cd1cf5d490dfcbe81438d5d5b33ec14a984 100644 (file)
@@ -31,7 +31,7 @@ demod_type = 0;
 decoder_type = 0;\r
 max_iterations = 100;\r
 EsNo = 10;\r
-Eprob = 0.15;\r
+Eprob = 0.0;\r
 \r
 vocoderframesize = 52;\r
 nvocoderframes = 8;\r
@@ -43,8 +43,6 @@ code_param.code_bits_per_frame = 576;
 data = [];\r
 r = []; \r
 \r
-% Encoder: Generate simulated vocoder data, insert UW, and LPDC encode ---------------\r
-\r
 Nframes = 100;\r
 uw = [1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0];\r
 \r
@@ -64,12 +62,14 @@ lmod_codeword = code_param.code_bits_per_frame/2;
 Terrs = 0; Ferrs = 0; Tbits = 0; Tframes = 0; nerr = [];\r
 corr = []; n = 0;\r
 sync_state = 0; sync_count = 0;\r
+mod_unpackedmodem_log = [];\r
 \r
 [mod_unpackedmodem_float32, count] = fread(fm,nbitspermodemframe, "float32");\r
 while (count == nbitspermodemframe)\r
     n++;\r
 \r
     mod_unpackedmodem = mod_unpackedmodem_float32(1:2:nbitspermodemframe) + j*mod_unpackedmodem_float32(2:2:nbitspermodemframe);\r
+    mod_unpackedmodem_log = [mod_unpackedmodem_log mod_unpackedmodem];\r
     erasures = rand(1,length(mod_unpackedmodem)) < Eprob; \r
     mod_unpackedmodem(erasures) = 0;\r
 \r
@@ -121,7 +121,13 @@ while (count == nbitspermodemframe)
 end\r
 \r
 fprintf(1,"\nFrames: %d bits: %d errors: %d BER = %f FER = %f\n", Tframes, Tbits, Terrs, Terrs/Tbits, Ferrs/Tframes);\r
-subplot(211)\r
-plot(corr);\r
-subplot(212)\r
-plot(nerr);\r
+%subplot(211)\r
+%plot(corr);\r
+%subplot(212)\r
+%plot(nerr);\r
+figure(1)\r
+clf;\r
+[n m] = size(mod_unpackedmodem_log);\r
+plot( real(mod_unpackedmodem_log), imag(mod_unpackedmodem_log), '+')\r
+axis([-2 2 -2 2]);\r
+title('Scatter Diagram');\r