From: drowe67 Date: Sat, 28 Apr 2018 03:54:37 +0000 (+0000) Subject: snr est added to ofdm_demod with Octave plot, mean_amp added to ofdm_demod and freedv... X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=2a65e159a7546b1fae9b11c5f000cef54f297c9c;p=freetel-svn-tracking.git snr est added to ofdm_demod with Octave plot, mean_amp added to ofdm_demod and freedv_api with improved bit error rates, tofdm working git-svn-id: https://svn.code.sf.net/p/freetel/code@3531 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/octave/ofdm_demod_c.m b/codec2-dev/octave/ofdm_demod_c.m index 22f17698..5954e45b 100644 --- a/codec2-dev/octave/ofdm_demod_c.m +++ b/codec2-dev/octave/ofdm_demod_c.m @@ -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 diff --git a/codec2-dev/octave/ofdm_ldpc_rx.m b/codec2-dev/octave/ofdm_ldpc_rx.m index 90e056a4..148bc637 100644 --- a/codec2-dev/octave/ofdm_ldpc_rx.m +++ b/codec2-dev/octave/ofdm_ldpc_rx.m @@ -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"); diff --git a/codec2-dev/octave/tofdm.m b/codec2-dev/octave/tofdm.m index d468c75d..c570b610 100644 --- a/codec2-dev/octave/tofdm.m +++ b/codec2-dev/octave/tofdm.m @@ -5,7 +5,7 @@ % ------------------------------------------------------------------ -Nframes = 3; +Nframes = 10; sample_clock_offset_ppm = 100; foff_hz = 0.5; diff --git a/codec2-dev/src/freedv_api.c b/codec2-dev/src/freedv_api.c index 08b417c5..f87860c5 100644 --- a/codec2-dev/src/freedv_api.c +++ b/codec2-dev/src/freedv_api.c @@ -1672,7 +1672,7 @@ static int freedv_comprx_700d(struct freedv *f, COMP demod_in_8kHz[], int *valid for (j=0; jmean_amp, coded_syms_per_frame); run_ldpc_decoder(ldpc, out_char, llr, &parityCheckCount); if (f->test_frames) { diff --git a/codec2-dev/src/interldpc.c b/codec2-dev/src/interldpc.c index cf656c14..09bd15e4 100644 --- a/codec2-dev/src/interldpc.c +++ b/codec2-dev/src/interldpc.c @@ -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++) diff --git a/codec2-dev/src/ofdm_demod.c b/codec2-dev/src/ofdm_demod.c index 199e6f71..bcf0fcff 100644 --- a/codec2-dev/src/ofdm_demod.c +++ b/codec2-dev/src/ofdm_demod.c @@ -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; imean_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); } diff --git a/codec2-dev/unittest/tofdm.c b/codec2-dev/unittest/tofdm.c index a56cb72e..c5bd46cb 100644 --- a/codec2-dev/unittest/tofdm.c +++ b/codec2-dev/unittest/tofdm.c @@ -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