From 6d7a45eb82e61c164abc21a8ef48335c953f1b40 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Thu, 18 May 2017 10:43:09 +0000 Subject: [PATCH] few tweaks to only log errors when valid signal git-svn-id: https://svn.code.sf.net/p/freetel/code@3141 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/octave/ofdm_rx.m | 96 +++++++++++++++++++++++-------------- 1 file changed, 59 insertions(+), 37 deletions(-) diff --git a/codec2-dev/octave/ofdm_rx.m b/codec2-dev/octave/ofdm_rx.m index 1f4e91d5..d108181b 100644 --- a/codec2-dev/octave/ofdm_rx.m +++ b/codec2-dev/octave/ofdm_rx.m @@ -11,7 +11,7 @@ [ ] way to fall out of sync #} -function ofdm_rx(filename, interleave_frames = 1) +function ofdm_rx(filename, interleave_frames = 1, error_pattern_filename) ofdm_lib; ldpc; gp_interleaver; @@ -83,6 +83,7 @@ function ofdm_rx(filename, interleave_frames = 1) Terrs = Tbits = Terrs_coded = Tbits_coded = Tpackets = Tpacketerrs = 0; Nbitspervocframe = 28; Nerrs_coded_log = Nerrs_log = []; + error_positions = []; % 'prime' rx buf to get correct coarse timing (for now) @@ -139,14 +140,20 @@ function ofdm_rx(filename, interleave_frames = 1) printf(" ff: %d Nerrs: %d\n", ff, Nerrs); if Nerrs/Nbitsperframe < 0.1 next_state = 'synced'; - frame_count = ff; - if f < interleave_frames - % point trying a LDPC decode if we don't have a full frame! - frame_count -= interleave_frames; - end + % make sure we get an interleave frame with correct freq offset + % note this introduces a lot of delay, a better idea would be to + % run demod again from interleave_frames back with now-known freq offset + frame_count = ff - interleave_frames; end end end + + if strcmp(state,'synced') + if Nerrs/Nbitsperframe > 0.2 + %next_state = 'searching'; + end + end + state = next_state; if strcmp(state,'searching') @@ -170,6 +177,7 @@ function ofdm_rx(filename, interleave_frames = 1) end if strcmp(state,'synced') + % we are in sync so log states rx_np_log = [rx_np_log arx_np]; @@ -186,22 +194,6 @@ function ofdm_rx(filename, interleave_frames = 1) arx_np = gp_deinterleave(rx_np); arx_amp = gp_deinterleave(rx_amp); - % LDPC decode - - rx_bits = []; - for ff=1:interleave_frames - st = (ff-1)*Nbitsperframe/bps+1; en = st + Nbitsperframe/bps - 1; - rx_codeword = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, arx_np(st:en), min(EsNo,30), arx_amp(st:en)); - rx_bits = [rx_bits rx_codeword(1:code_param.data_bits_per_frame)]; - end - - errors_coded = xor(tx_bits, rx_bits); - Nerrs_coded = sum(errors_coded); - Terrs_coded += Nerrs_coded; - Tbits_coded += code_param.data_bits_per_frame*interleave_frames; - - printf(" Nerrs_coded: %d\n", Nerrs_coded); - % measure uncoded bit errors per modem frame rx_bits_raw = []; @@ -212,24 +204,44 @@ function ofdm_rx(filename, interleave_frames = 1) st = (ff-1)*Nbitsperframe+1; en = st+Nbitsperframe-1; errors = xor(tx_bits_raw(st:en), rx_bits_raw(st:en)); Nerrs = sum(errors); - Terrs += Nerrs; - Nerrs_log = [Nerrs_log Nerrs]; - Tbits += Nbitsperframe; + if Nerrs/Nbitsperframe < 0.2 + Terrs += Nerrs; + Nerrs_log = [Nerrs_log Nerrs]; + Tbits += Nbitsperframe; + end end - % measure packet errors based on Codec 2 packet size + % LDPC decode - Nvocframes = floor(code_param.data_bits_per_frame*interleave_frames/Nbitspervocframe); - for fv=1:Nvocframes - st = (fv-1)*Nbitspervocframe + 1; - en = st + Nbitspervocframe - 1; - Nvocpacketerrs = sum(xor(tx_bits(st:en), rx_bits(st:en))); - if Nvocpacketerrs - Tpacketerrs++; + rx_bits = []; + for ff=1:interleave_frames + st = (ff-1)*Nbitsperframe/bps+1; en = st + Nbitsperframe/bps - 1; + rx_codeword = ldpc_dec(code_param, max_iterations, demod_type, decoder_type, arx_np(st:en), min(EsNo,30), arx_amp(st:en)); + rx_bits = [rx_bits rx_codeword(1:code_param.data_bits_per_frame)]; + end + + errors_coded = xor(tx_bits, rx_bits); + Nerrs_coded = sum(errors_coded); + if Nerrs/Nbitsperframe < 0.2 + Terrs_coded += Nerrs_coded; + Tbits_coded += code_param.data_bits_per_frame*interleave_frames; + error_positions = [error_positions errors_coded]; + + % measure packet errors based on Codec 2 packet size + + Nvocframes = floor(code_param.data_bits_per_frame*interleave_frames/Nbitspervocframe); + for fv=1:Nvocframes + st = (fv-1)*Nbitspervocframe + 1; + en = st + Nbitspervocframe - 1; + Nvocpacketerrs = sum(xor(tx_bits(st:en), rx_bits(st:en))); + if Nvocpacketerrs + Tpacketerrs++; + end + Tpackets++; + Nerrs_coded_log = [Nerrs_coded_log Nvocpacketerrs]; end - Tpackets++; - Nerrs_coded_log = [Nerrs_coded_log Nvocpacketerrs]; end + printf(" Nerrs_coded: %d\n", Nerrs_coded); frame_count = 0; end @@ -241,7 +253,8 @@ function ofdm_rx(filename, interleave_frames = 1) figure(1); clf; plot(rx_np_log,'+'); - axis([-2 2 -2 2]); + mx = max(abs(rx_np_log)) + axis([-mx mx -mx mx]); title('Scatter'); figure(2); clf; @@ -259,7 +272,8 @@ function ofdm_rx(filename, interleave_frames = 1) figure(4); clf; plot(foff_est_hz_log) - axis([1 max(Nframes,2) -2 2]); + mx = max(abs(foff_est_hz_log)); + axis([1 max(Nframes,2) -mx mx]); title('Fine Freq'); ylabel('Hz') @@ -267,7 +281,15 @@ function ofdm_rx(filename, interleave_frames = 1) subplot(211) stem(Nerrs_log); title('Uncoded errrors/modem frame') + axis([1 length(Nerrs_log) 0 Nbitsperframe*rate/2]); subplot(212) stem(Nerrs_coded_log); title('Coded errrors/vocoder frame') + axis([1 length(Nerrs_coded_log) 0 Nbitspervocframe/2]); + + if nargin == 3 + fep = fopen(error_pattern_filename, "wb"); + fwrite(fep, error_positions, "short"); + fclose(fep); + end endfunction -- 2.25.1