snr est added to ofdm_demod with Octave plot, mean_amp added to ofdm_demod and freedv...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Sat, 28 Apr 2018 03:54:37 +0000 (03:54 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Sat, 28 Apr 2018 03:54:37 +0000 (03:54 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@3531 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/ofdm_demod_c.m
codec2-dev/octave/ofdm_ldpc_rx.m
codec2-dev/octave/tofdm.m
codec2-dev/src/freedv_api.c
codec2-dev/src/interldpc.c
codec2-dev/src/ofdm_demod.c
codec2-dev/unittest/tofdm.c

index 22f176985749fa0b37144fad87ccce15aef206d8..5954e45b75db6f37ddb06592b52cbc982513bb59 100644 (file)
@@ -41,4 +41,8 @@ function ofdm_demod_c(filename)
   title('Fine Freq');
   ylabel('Hz')
 
+  figure(4); clf;
+  plot(snr_est_log_c);
+  ylabel('SNR (dB)')
+  title('SNR Estimates')
 endfunction
index 90e056a479378a5d3f704a64d5573cca47413f1e..148bc6376c807cfc1776d38b0e1c62b04795cb0a 100644 (file)
@@ -87,6 +87,7 @@ function ofdm_ldpc_rx(filename, interleave_frames = 1, error_pattern_filename)
 
   rx_bits = []; rx_np_log = []; timing_est_log = []; delta_t_log = []; foff_est_hz_log = [];
   phase_est_pilot_log = [];
+  sig_var_log = []; noise_var_log = [];
   Terrs = Tbits = Terrs_coded = Tbits_coded = Tpackets = Tpacketerrs = 0;
   Nbitspervocframe = 28;
   Nerrs_coded_log = Nerrs_log = [];
@@ -136,7 +137,9 @@ function ofdm_ldpc_rx(filename, interleave_frames = 1, error_pattern_filename)
       delta_t_log = [delta_t_log states.delta_t];
       foff_est_hz_log = [foff_est_hz_log states.foff_est_hz];
       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];
+      
       % update sliding windows of rx-ed symbols and symbol amplitudes,
       % discarding UW and txt symbols at start of each modem frame
 
@@ -302,6 +305,12 @@ function ofdm_ldpc_rx(filename, interleave_frames = 1, error_pattern_filename)
     end
   end
   
+  figure(6); clf;
+  snr_estdB = 10*log10(sig_var_log) - 10*log10(noise_var_log) + 10*log10(Nc*Rs/3000);
+  snr_smoothed_estdB = filter(0.1,[1 -0.9],snr_estdB);
+  plot(snr_smoothed_estdB,'SNR3k;');
+  title('Signal and Noise Power estimates');
+
   if nargin == 3
     fep = fopen(error_pattern_filename, "wb");
     fwrite(fep, error_positions, "short");
index d468c75d40420b8889674940972e5be185100f4e..c570b6102bb90265da7c93ac0e5ccc409ad7f0c6 100644 (file)
@@ -5,7 +5,7 @@
 
 % ------------------------------------------------------------------
 
-Nframes = 3;
+Nframes = 10;
 sample_clock_offset_ppm = 100;
 foff_hz = 0.5;
 
index 08b417c57d5f945162757c50351ff430d2030f14..f87860c5d49df9e45981642098c019ac7da3673d 100644 (file)
@@ -1672,7 +1672,7 @@ static int freedv_comprx_700d(struct freedv *f, COMP demod_in_8kHz[], int *valid
             for (j=0; j<interleave_frames; j++) {
                 symbols_to_llrs(llr, &codeword_symbols_de[j*coded_syms_per_frame],
                                 &codeword_amps_de[j*coded_syms_per_frame],
-                                EsNo, coded_syms_per_frame);               
+                                EsNo, ofdm->mean_amp, coded_syms_per_frame);               
                 run_ldpc_decoder(ldpc, out_char, llr, &parityCheckCount);
 
                 if (f->test_frames) {
index cf656c1435e2946de0d08f44cf8d370511fc4fc8..09bd15e494b57b1dfba4046130e14c08df550a46 100644 (file)
@@ -121,7 +121,7 @@ void interleaver_sync_state_machine(struct OFDM *ofdm,
     
     strcpy(next_sync_state_interleaver, ofdm->sync_state_interleaver);
     if ((strcmp(ofdm->sync_state_interleaver,"search") == 0) && (ofdm->frame_count >= (interleave_frames-1))) {
-        symbols_to_llrs(llr, codeword_symbols_de, codeword_amps_de, EsNo, coded_syms_per_frame);               
+        symbols_to_llrs(llr, codeword_symbols_de, codeword_amps_de, EsNo, ofdm->mean_amp, coded_syms_per_frame);               
         iter[0] =  run_ldpc_decoder(ldpc, out_char, llr, parityCheckCount);
         Nerrs_coded[0] = data_bits_per_frame - parityCheckCount[0];
         //for(i=0; i<20; i++)
index 199e6f71dbd5fea1d753495e29d323b6a4ef10f4..bcf0fcff01d29719ead32ff62014b4657c5edf49 100644 (file)
@@ -72,7 +72,7 @@ int main(int argc, char *argv[])
     float          phase_est_pilot_log[OFDM_ROWSPERFRAME*NFRAMES][OFDM_NC];
     COMP           rx_np_log[OFDM_ROWSPERFRAME*OFDM_NC*NFRAMES];
     float          rx_amp_log[OFDM_ROWSPERFRAME*OFDM_NC*NFRAMES];
-    float          foff_hz_log[NFRAMES];
+    float          foff_hz_log[NFRAMES], snr_est_log[NFRAMES];
     int            timing_est_log[NFRAMES];
 
     int            i, j, f, oct, logframes, arg, llr_en, interleave_frames;
@@ -183,6 +183,8 @@ int main(int argc, char *argv[])
     float EsNo = 3;
     fprintf(stderr,"Warning EsNo: %f hard coded\n", EsNo);
 
+    float snr_est_smoothed_dB = 0.0;
+
     COMP  codeword_symbols[interleave_frames*coded_syms_per_frame];
     float codeword_amps[interleave_frames*coded_syms_per_frame];
     for (i=0; i<interleave_frames*coded_syms_per_frame; i++) {
@@ -260,7 +262,7 @@ int main(int argc, char *argv[])
                         for (j=0; j<interleave_frames; j++) {
                             symbols_to_llrs(llr, &codeword_symbols_de[j*coded_syms_per_frame],
                                                  &codeword_amps_de[j*coded_syms_per_frame],
-                                                 EsNo, coded_syms_per_frame);               
+                                                 EsNo, ofdm->mean_amp, coded_syms_per_frame);               
                             iter[j] = run_ldpc_decoder(&ldpc, out_char, llr, &parityCheckCount[j]);
                             //fprintf(stderr,"j: %d iter: %d pcc: %d\n", j, iter[j], parityCheckCount[j]);
                             if (testframes) {
@@ -271,10 +273,15 @@ int main(int argc, char *argv[])
                             fwrite(out_char, sizeof(char), data_bits_per_frame, fout);
                         }
                     } /* if interleaver synced ..... */
-                         
+
+                    /* SNR estimation and smoothing */
+
+                    float snr_est_dB = 10*log10((ofdm->sig_var/ofdm->noise_var)*OFDM_NC*OFDM_RS/3000);
+                    snr_est_smoothed_dB = 0.9*snr_est_smoothed_dB + 0.1*snr_est_dB;
+                    
                 } else {
                     /* lpdc_en == 0,  external LDPC decoder, so output LLRs */
-                    symbols_to_llrs(llr, codeword_symbols_de, codeword_amps_de, EsNo, coded_syms_per_frame);
+                    symbols_to_llrs(llr, codeword_symbols_de, codeword_amps_de, EsNo, ofdm->mean_amp, coded_syms_per_frame);
                     fwrite(llr, sizeof(double), coded_bits_per_frame, fout);
                 }
             } else {
@@ -358,6 +365,8 @@ int main(int argc, char *argv[])
 
             foff_hz_log[f] = ofdm->foff_est_hz;
             timing_est_log[f] = ofdm->timing_est + 1;     /* offset by 1 to match Octave */
+            
+            snr_est_log[f] = snr_est_smoothed_dB;
             if (f == (logframes-1))
                 oct = 0;
         }
@@ -393,6 +402,7 @@ int main(int argc, char *argv[])
         octave_save_float(foct, "rx_amp_log_c", (float*)rx_amp_log, 1, OFDM_ROWSPERFRAME*OFDM_NC*NFRAMES, OFDM_ROWSPERFRAME*OFDM_NC*NFRAMES);
         octave_save_float(foct, "foff_hz_log_c", foff_hz_log, NFRAMES, 1, 1);
         octave_save_int(foct, "timing_est_log_c", timing_est_log, NFRAMES, 1);
+        octave_save_float(foct, "snr_est_log_c", snr_est_log, NFRAMES, 1, 1);
         fclose(foct);
     }
 
index a56cb72e788a677a46b3f497924ca6147fe1ed6e..c5bd46cb7a4427b072b6d3eb5e739cad061bb4c3 100644 (file)
@@ -44,7 +44,7 @@
 
 #include "HRA_112_112.h"          /* generated by ldpc_fsk_lib.m:ldpc_decode() */
 
-#define NFRAMES                   3
+#define NFRAMES                   10
 #define SAMPLE_CLOCK_OFFSET_PPM 100
 #define FOFF_HZ                 0.5f