if foff_est_en
freq_err_rect = sum(rx_sym(2,:))' * sum(rx_sym(2+Ns,:));
+
+ % prevent instability in atan(im/re) when real part near 0
+
+ freq_err_rect += 1E-6;
+
+ %printf("freq_err_rect: %f %f angle: %f\n", real(freq_err_rect), imag(freq_err_rect), angle(freq_err_rect));
freq_err_hz = angle(freq_err_rect)*Rs/(2*pi*Ns);
foff_est_hz = foff_est_hz + foff_est_gain*freq_err_hz;
end
rx_np_log = []; rx_bits_log = [];
states.timing_en = 1;
-states.foff_est_en = 0;
+states.foff_est_en = 1;
states.phase_est_en = 1;
if states.timing_en == 0
/* est freq err based on all carriers ------------------------------------ */
if (ofdm->foff_est_en == true) {
- complex float freq_err_rect = conjf(vector_sum(ofdm->rx_sym[1], OFDM_NC)) * vector_sum(ofdm->rx_sym[OFDM_NS + 1], OFDM_NC);
+ complex float freq_err_rect = conjf(vector_sum(ofdm->rx_sym[1], OFDM_NC+2)) * vector_sum(ofdm->rx_sym[OFDM_NS + 1], OFDM_NC+2);
+
+ /* prevent instability in atan(im/re) when real part near 0 */
+
+ freq_err_rect += 1E-6;
+
+ // fprintf(stderr, "freq_err_rect: %f %f angle: %f\n", crealf(freq_err_rect), cimagf(freq_err_rect),cargf(freq_err_rect) );
freq_err_hz = cargf(freq_err_rect) * OFDM_RS / (TAU * OFDM_NS);
ofdm->foff_est_hz += (ofdm->foff_est_gain * freq_err_hz);
ofdm_set_verbose(ofdm, true);
ofdm_set_timing_enable(ofdm, true);
- ofdm_set_foff_est_enable(ofdm, false);
+ ofdm_set_foff_est_enable(ofdm, true);
ofdm_set_phase_est_enable(ofdm, true);
for(f=0; f<NFRAMES; f++) {