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];
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);
% 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)));
% 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
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;
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
% 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;
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);
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
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);
% 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);
% 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;
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;
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;
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;
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
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');