From: drowe67 Date: Fri, 27 Apr 2018 23:21:46 +0000 (+0000) Subject: testing amplitude scaling to improve LDPC dec with different level inputs X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=5236dad305a4a3ff3c2b69aaaf4ca4ff2f14a5ee;p=freetel-svn-tracking.git testing amplitude scaling to improve LDPC dec with different level inputs git-svn-id: https://svn.code.sf.net/p/freetel/code@3529 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/octave/ofdm_dev.m b/codec2-dev/octave/ofdm_dev.m index 68b75694..15446793 100644 --- a/codec2-dev/octave/ofdm_dev.m +++ b/codec2-dev/octave/ofdm_dev.m @@ -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; diff --git a/codec2-dev/octave/ofdm_ldpc_rx.m b/codec2-dev/octave/ofdm_ldpc_rx.m index be80a8a9..de0de06e 100644 --- a/codec2-dev/octave/ofdm_ldpc_rx.m +++ b/codec2-dev/octave/ofdm_ldpc_rx.m @@ -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); diff --git a/codec2-dev/octave/ofdm_lib.m b/codec2-dev/octave/ofdm_lib.m index 2d17f10f..cfef75f7 100644 --- a/codec2-dev/octave/ofdm_lib.m +++ b/codec2-dev/octave/ofdm_lib.m @@ -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; diff --git a/codec2-dev/octave/tofdm.m b/codec2-dev/octave/tofdm.m index 6bcc949e..1dc8d3dd 100644 --- a/codec2-dev/octave/tofdm.m +++ b/codec2-dev/octave/tofdm.m @@ -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');