testing amplitude scaling to improve LDPC dec with different level inputs
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 27 Apr 2018 23:21:46 +0000 (23:21 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 27 Apr 2018 23:21:46 +0000 (23:21 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@3529 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/ofdm_dev.m
codec2-dev/octave/ofdm_ldpc_rx.m
codec2-dev/octave/ofdm_lib.m
codec2-dev/octave/tofdm.m

index 68b75694e6744b928223f763f8ee8c365efd0e3d..1544679387d83533a9de9c0fb59bf85b7c009947 100644 (file)
@@ -319,12 +319,7 @@ function [sim_out rx states] = run_sim(sim_in)
       prx += states.nin;
 
       [arx_bits states aphase_est_pilot_log arx_np arx_amp] = ofdm_demod(states, rxbuf_in);
-
-      %mean_amp = mean(mean(arx_amp));
-      %mean_amp = 1/1000;
-      %printf("mean amp: %f\n", mean_amp);
-      %arx_np /= mean_amp; arx_amp /= mean_amp;
-      
+     
       rx_bits = [rx_bits arx_bits]; rx_np = [rx_np arx_np]; rx_amp = [rx_amp arx_amp];
       timing_est_log = [timing_est_log states.timing_est];
       delta_t_log = [delta_t_log states.delta_t];
@@ -332,7 +327,6 @@ function [sim_out rx states] = run_sim(sim_in)
       phase_est_pilot_log = [phase_est_pilot_log; aphase_est_pilot_log];
       sig_var_log = [sig_var_log states.sig_var];
       noise_var_log = [noise_var_log states.noise_var];
-      %printf("sig_var: %f noise_var: %f\n", states.sig_var, states.noise_var);
     end
     assert(length(rx_bits) == Nbits);
 
@@ -373,6 +367,7 @@ function [sim_out rx states] = run_sim(sim_in)
     % Per-modem frame error log and optional LDPC/diversity error stats
 
     Terrs_coded = 0; Tpackets_coded = 0; Tpacketerrs_coded = 0; sim_out.error_positions = [];
+    
     for f=1:Nframes
       st = (f-1)*Nbitsperframe+1; en = st + Nbitsperframe - 1;
       Nerrs_log(f) = sum(xor(tx_bits(st:en), rx_bits(st:en)));
@@ -384,9 +379,11 @@ function [sim_out rx states] = run_sim(sim_in)
       % optional LDPC decode
      
       if ldpc_en
-        % note we put ceiling on EsNo as decoder misbehaives with high EsNo
 
-        rx_codeword = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, r, min(EsNo,30), fade);
+        % scale based on amplitude ests
+
+        mean_amp = states. mean_amp;
+        rx_codeword = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, r/mean_amp, min(EsNo,30), fade/mean_amp);
       end
 
       % optional diversity demod
@@ -550,11 +547,11 @@ function run_single(EbNodB = 100, error_pattern_filename);
   sim_in.Rs = 1/Ts; sim_in.bps = 2; sim_in.Nc = 16; sim_in.Ns = 8;
 
   sim_in.Nsec = (sim_in.Ns+1)/sim_in.Rs;  % one frame, make sure sim_in.interleave_frames = 1
-  sim_in.Nsec = 20;
+  sim_in.Nsec = 60;
 
-  sim_in.EbNodB = EbNodB;
+  sim_in.EbNodB = 10;
   sim_in.verbose = 1;
-  sim_in.hf_en = 0;
+  sim_in.hf_en = 1;
   sim_in.foff_hz = 0;
   sim_in.dfoff_hz_per_sec = 0.00;
   sim_in.sample_clock_offset_ppm = 0;
index be80a8a9bec873b6ae6e188a4b4c28c8bbfc41e4..de0de06e4f7e6301a2cfc0a98521c28a08453f80 100644 (file)
@@ -22,7 +22,7 @@ function ofdm_ldpc_rx(filename, interleave_frames = 1, error_pattern_filename)
   Ts = 0.018; Tcp = 0.002; Rs = 1/Ts; bps = 2; Nc = 17; Ns = 8;
   states = ofdm_init(bps, Rs, Tcp, Ns, Nc);
   ofdm_load_const;
-  states.verbose = 1;
+  states.verbose = 0;
 
   % Set up LDPC code
 
@@ -40,7 +40,7 @@ function ofdm_ldpc_rx(filename, interleave_frames = 1, error_pattern_filename)
   % load real samples from file
 
   Ascale= states.amp_scale/2.0;  % /2 as real signal has half amplitude
-  frx=fopen(filename,"rb"); rx = 0.1*fread(frx, Inf, "short")/Ascale; fclose(frx);
+  frx=fopen(filename,"rb"); rx = fread(frx, Inf, "short")/Ascale; fclose(frx);
   Nsam = length(rx); Nframes = floor(Nsam/Nsamperframe);
   prx = 1;
 
@@ -144,7 +144,7 @@ function ofdm_ldpc_rx(filename, interleave_frames = 1, error_pattern_filename)
       rx_np(Nsymbolsperinterleavedframe-Nsymbolsperframe+1:Nsymbolsperinterleavedframe) = arx_np(Nuwtxtsymbolsperframe+1:end);
       rx_amp(1:Nsymbolsperinterleavedframe-Nsymbolsperframe) = rx_amp(Nsymbolsperframe+1:Nsymbolsperinterleavedframe);
       rx_amp(Nsymbolsperinterleavedframe-Nsymbolsperframe+1:Nsymbolsperinterleavedframe) = arx_amp(Nuwtxtsymbolsperframe+1:end);
-      
+           
       % de-interleave QPSK symbols and symbol amplitudes
 
       rx_np_de = gp_deinterleave(rx_np);
@@ -159,7 +159,8 @@ function ofdm_ldpc_rx(filename, interleave_frames = 1, error_pattern_filename)
 
       if strcmp(states.sync_state_interleaver,'search')
         st = 1; en = Ncodedbitsperframe/bps;
-        [rx_codeword parity_checks] = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, rx_np_de(st:en), min(EsNo,30), rx_amp_de(st:en));
+        mean_amp = states.mean_amp;
+        [rx_codeword parity_checks] = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, rx_np_de(st:en)/mean_amp, min(EsNo,30), rx_amp_de(st:en)/mean_amp);
         Nerrs = code_param.data_bits_per_frame - max(parity_checks);
         %printf("Nerrs: %d\n", Nerrs);
         if Nerrs < 10
@@ -200,7 +201,7 @@ function ofdm_ldpc_rx(filename, interleave_frames = 1, error_pattern_filename)
         rx_bits = [];
         for ff=1:interleave_frames
           st = (ff-1)*Ncodedbitsperframe/bps+1; en = st + Ncodedbitsperframe/bps - 1;
-          [rx_codeword ldpc_errors] = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, rx_np_de(st:en), min(EsNo,30), rx_amp_de(st:en));
+          [rx_codeword ldpc_errors] = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, rx_np_de(st:en)/mean_amp, min(EsNo,30), rx_amp_de(st:en)/mean_amp);
           rx_bits = [rx_bits rx_codeword(1:code_param.data_bits_per_frame)];
           errors = xor(atx_bits, rx_codeword(1:code_param.data_bits_per_frame));
           Nerrs  = sum(errors);
index 2d17f10f734618d1196b545d9849ae579d750672..cfef75f74312be5c6a5829ba8884a01ddcffc570 100644 (file)
@@ -145,7 +145,11 @@ function states = ofdm_init(bps, Rs, Tcp, Ns, Nc)
   % to have same RMS power as FDMDV waveform
   
   states.amp_scale = 2E5*1.1491/1.06;
+
+  % this is used to scale input sto LDPC decoder to make it amplitude indep
+  
+  states.mean_amp = 0;
+
   % generate same pilots each time
 
   rand('seed',1);
@@ -519,9 +523,8 @@ function [rx_bits states aphase_est_pilot_log rx_np rx_amp] = ofdm_demod(states,
   % we just measure noise power on imag axis, as it isn't affected by fading
   % using all symbols in frame worked better than just pilots
   
-  x = sum(abs(rx_np) .^ 2)/length(rx_np);
-  sig_var = x;
-  sig_rms = sqrt(x);
+  sig_var = sum(abs(rx_np) .^ 2)/length(rx_np);
+  sig_rms = sqrt(sig_var);
   
   sum_x = 0;
   sum_xx = 0;
@@ -546,6 +549,10 @@ function [rx_bits states aphase_est_pilot_log rx_np rx_amp] = ofdm_demod(states,
   
   states.noise_var = 2*noise_var; 
   states.sig_var = sig_var;
+
+  % maintain mean amp estimate for LDPC decoder
+
+  states.mean_amp = 0.9*states.mean_amp + 0.1*mean(rx_amp);
   
   states.rx_sym = rx_sym;
   states.rxbuf = rxbuf;
@@ -682,7 +689,7 @@ function states = sync_state_machine(states, rx_uw)
       next_state = 'synced';
     end
     if strcmp(states.sync_state,'synced')
-      sync_counter_thresh = 6;
+      sync_counter_thresh = 12;
       uw_thresh = 2;
     else
       sync_counter_thresh = 2;
index 6bcc949ec6a4b671f3d0d28a5117d904b4603c56..1dc8d3dd13d1b7bd6beee5a8bc589477a640425d 100644 (file)
@@ -92,6 +92,7 @@ timing_est_log = timing_valid_log = timing_mx_log = [];
 coarse_foff_est_hz_log = []; sample_point_log = [];
 phase_est_pilot_log = []; rx_amp_log = [];
 rx_np_log = []; rx_bits_log = [];
+sig_var_log = noise_var_log = [];
 
 states.timing_en = 1;
 states.foff_est_en = 1;
@@ -135,7 +136,9 @@ for f=1:Nframes
   sample_point_log = [sample_point_log; states.sample_point];
   rx_np_log = [rx_np_log arx_np];
   rx_bits_log = [rx_bits_log rx_bits];
-
+  sig_var_log = [sig_var_log; states.sig_var];
+  noise_var_log = [noise_var_log; states.noise_var];
+  
   % Optional testing of LDPC functions
 
   if cml_support
@@ -234,4 +237,6 @@ if cml_support
   check(bit_likelihood_log, bit_likelihood_log_c, 'bit_likelihood_log');
   check(detected_data_log, detected_data_log_c, 'detected_data');
 end
+check(sig_var_log, sig_var_log_c, 'sig_var_log');
+check(noise_var_log, noise_var_log_c, 'noise_var_log');