From 2d6c0035334217e390718aa56653c17fbfb1aad6 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Sat, 17 Mar 2018 21:01:11 +0000 Subject: [PATCH] coarse freq estimator checks out between Octave and C - next step is build up an acquisition state machine git-svn-id: https://svn.code.sf.net/p/freetel/code@3413 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/octave/ofdm_lib.m | 9 ++++++++- codec2-dev/octave/tofdm.m | 7 +++++-- codec2-dev/src/ofdm.c | 10 +++++----- codec2-dev/unittest/tofdm.c | 7 +++++-- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/codec2-dev/octave/ofdm_lib.m b/codec2-dev/octave/ofdm_lib.m index c83e3423..a71481da 100644 --- a/codec2-dev/octave/ofdm_lib.m +++ b/codec2-dev/octave/ofdm_lib.m @@ -78,7 +78,12 @@ function [t_est foff_est] = coarse_sync(states, rx, rate_fs_pilot_samples) 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)); @@ -91,6 +96,7 @@ function [t_est foff_est] = coarse_sync(states, rx, rate_fs_pilot_samples) 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)'; @@ -306,7 +312,7 @@ function [rx_bits states aphase_est_pilot_log rx_np rx_amp] = ofdm_demod(states, 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 @@ -443,6 +449,7 @@ function [rx_bits states aphase_est_pilot_log rx_np rx_amp] = ofdm_demod(states, 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 diff --git a/codec2-dev/octave/tofdm.m b/codec2-dev/octave/tofdm.m index 7d5747ac..f7f15381 100644 --- a/codec2-dev/octave/tofdm.m +++ b/codec2-dev/octave/tofdm.m @@ -1,7 +1,7 @@ % 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 % ------------------------------------------------------------------ @@ -48,7 +48,7 @@ states.rxbuf(Nrxbuf-nin+1:Nrxbuf) = rx_log(prx:nin); 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 = []; @@ -87,6 +87,7 @@ for f=1:Nframes 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]; @@ -99,6 +100,7 @@ end % 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 @@ -153,6 +155,7 @@ check(rx_sym_log, rx_sym_log_c, 'rx_sym', tol=5E-3); 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'); diff --git a/codec2-dev/src/ofdm.c b/codec2-dev/src/ofdm.c index e128f911..6b2d696d 100644 --- a/codec2-dev/src/ofdm.c +++ b/codec2-dev/src/ofdm.c @@ -198,14 +198,14 @@ static int coarse_sync(struct OFDM *ofdm, complex float *rx, int length, float * /* 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 */ @@ -217,7 +217,7 @@ static int coarse_sync(struct OFDM *ofdm, complex float *rx, int length, float * with 0 inputs. */ *foff_est = Fs1 * cargf(conjf(p1)*p2 + conjf(p3)*p4 + 1E-12)/(2.0*M_PI); - + return t_est; } @@ -506,7 +506,7 @@ void ofdm_demod(struct OFDM *ofdm, int *rx_bits, COMP *rxbuf_in) { /* 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) { diff --git a/codec2-dev/unittest/tofdm.c b/codec2-dev/unittest/tofdm.c index 9a39d610..b790292a 100644 --- a/codec2-dev/unittest/tofdm.c +++ b/codec2-dev/unittest/tofdm.c @@ -138,8 +138,9 @@ int main(int argc, char *argv[]) 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; @@ -270,6 +271,7 @@ 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 */ + 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)); @@ -294,6 +296,7 @@ int main(int argc, char *argv[]) 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); -- 2.25.1