corr = abs(corr1) + abs(corr2);
[mx t_est] = max(corr);
+
#{
+ % original freq offset est code that never made it into C. Have some concerns about CPU
+ % load of performing FFT, althout a smaller one could have been used with interpolation
+ % to get the peak
+
C = abs(fft(rx(t_est:t_est+Npsam-1) .* conj(rate_fs_pilot_samples), Fs));
C += abs(fft(rx(t_est+Nsamperframe:t_est+Nsamperframe+Npsam-1) .* conj(rate_fs_pilot_samples), Fs));
else
foff_est = foff_est_neg - fmax - 1;
end
+
#}
p1 = rx(t_est:t_est+Npsam/2-1) * rate_fs_pilot_samples(1:Npsam/2)';
st = M+Ncp + Nsamperframe + 1 - floor(ftwindow_width/2) + (timing_est-1);
en = st + Nsamperframe-1 + M+Ncp + ftwindow_width-1;
- ft_est = coarse_sync(states, rxbuf(st:en) .* exp(-j*woff_est*(st:en)), rate_fs_pilot_samples);
+ [ft_est coarse_foff_est_hz] = coarse_sync(states, rxbuf(st:en) .* exp(-j*woff_est*(st:en)), rate_fs_pilot_samples);
timing_est = timing_est + ft_est - ceil(ftwindow_width/2);
if verbose > 1
states.sample_point = sample_point;
states.delta_t = delta_t;
states.foff_est_hz = foff_est_hz;
+ states.coarse_foff_est_hz = coarse_foff_est_hz;
endfunction
% tofdm.m
% David Rowe and Steve Sampson June 2017
%
-% Octave script for comparing Octave and C versions of OFDZM modem
+% Octave script for comparing Octave and C versions of OFDM modem
% ------------------------------------------------------------------
prx += nin;
rxbuf_log = []; rxbuf_in_log = []; rx_sym_log = []; foff_hz_log = [];
-timing_est_log = []; sample_point_log = [];
+timing_est_log = []; coarse_foff_est_hz_log = []; sample_point_log = [];
phase_est_pilot_log = []; rx_amp_log = [];
rx_np_log = []; rx_bits_log = [];
rx_amp_log = [rx_amp_log arx_amp];
foff_hz_log = [foff_hz_log; states.foff_est_hz];
timing_est_log = [timing_est_log; states.timing_est];
+ coarse_foff_est_hz_log = [coarse_foff_est_hz_log; states.coarse_foff_est_hz];
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];
% Override default path by setting path_to_tofdm = "/your/path/to/tofdm"
+printf("\nRunning C version....\n");
if exist("path_to_tofdm", "var") == 0
path_to_tofdm = "../build_linux/unittest/tofdm";
end
check(phase_est_pilot_log, phase_est_pilot_log_c, 'phase_est_pilot', tol=2E-3, its_an_angle=1);
check(rx_amp_log, rx_amp_log_c, 'rx_amp');
check(timing_est_log, timing_est_log_c, 'timing_est');
+check(coarse_foff_est_hz_log, coarse_foff_est_hz_log_c, 'coarse_foff_est_hz');
check(sample_point_log, sample_point_log_c, 'sample_point');
check(foff_hz_log, foff_hz_log_c, 'foff_est_hz');
check(rx_bits_log, rx_bits_log_c, 'rx_bits');
/* pilot at start of frame */
p1 = p1 + (rx[t_est + j] * csam1);
- p2 = p2 + (rx[t_est + k] * csam1);
+ p2 = p2 + (rx[t_est + k] * csam2);
/* pilot at end of frame */
- p3 = p3 + (rx[t_est + j + SFrame] * csam2);
+ p3 = p3 + (rx[t_est + j + SFrame] * csam1);
p4 = p4 + (rx[t_est + k + SFrame] * csam2);
}
-
+
/* Calculate sample rate of phase samples, we are sampling phase
of pilot at half a symbol intervals */
with 0 inputs. */
*foff_est = Fs1 * cargf(conjf(p1)*p2 + conjf(p3)*p4 + 1E-12)/(2.0*M_PI);
-
+
return t_est;
}
/* note coarse sync just used for timing est, we dont use coarse_foff_est in this call */
- ft_est = coarse_sync(ofdm, work, (en - st), &coarse_foff_est);
+ ft_est = coarse_sync(ofdm, work, (en - st), &ofdm->coarse_foff_est_hz);
ofdm->timing_est += (ft_est - ceilf(OFDM_FTWINDOWWIDTH / 2));
if (ofdm->verbose > 1) {
float rx_amp_log[OFDM_ROWSPERFRAME*OFDM_NC*NFRAMES];
float foff_hz_log[NFRAMES];
int rx_bits_log[OFDM_BITSPERFRAME*NFRAMES];
- int timing_est_log[OFDM_BITSPERFRAME*NFRAMES];
- int sample_point_log[OFDM_BITSPERFRAME*NFRAMES];
+ int timing_est_log[NFRAMES];
+ float coarse_foff_est_hz_log[NFRAMES];
+ int sample_point_log[NFRAMES];
FILE *fout;
int f,i,j;
foff_hz_log[f] = ofdm->foff_est_hz;
timing_est_log[f] = ofdm->timing_est + 1; /* offset by 1 to match Octave */
+ coarse_foff_est_hz_log[f] = ofdm->coarse_foff_est_hz;
sample_point_log[f] = ofdm->sample_point + 1; /* offset by 1 to match Octave */
memcpy(&rx_bits_log[OFDM_BITSPERFRAME*f], rx_bits, sizeof(rx_bits));
octave_save_float(fout, "rx_amp_log_c", (float*)rx_amp_log, 1, OFDM_ROWSPERFRAME*OFDM_NC*NFRAMES, OFDM_ROWSPERFRAME*OFDM_NC*NFRAMES);
octave_save_float(fout, "foff_hz_log_c", foff_hz_log, NFRAMES, 1, 1);
octave_save_int(fout, "timing_est_log_c", timing_est_log, NFRAMES, 1);
+ octave_save_float(fout, "coarse_foff_est_hz_log_c", coarse_foff_est_hz_log, NFRAMES, 1, 1);
octave_save_int(fout, "sample_point_log_c", sample_point_log, NFRAMES, 1);
octave_save_complex(fout, "rx_np_log_c", (COMP*)rx_np_log, 1, OFDM_ROWSPERFRAME*OFDM_NC*NFRAMES, OFDM_ROWSPERFRAME*OFDM_NC*NFRAMES);
octave_save_int(fout, "rx_bits_log_c", rx_bits_log, 1, OFDM_BITSPERFRAME*NFRAMES);