Integral frequency shift correcting in ofdm_frame_equalizer_vcvc_impl.cc

Hi All,
I found “ofdm_frame_equalizer_vcvc_impl.cc” use below code to correct
integral freq shift(IFO) in freq domain, but as I known, the IFO only
cause signal cyclic shifting in freq domain, why this block use gr_expj
to correcting IFO in freq domain? might be blow code should be done in
time domain.

// Correct the frequency shift on the symbols
gr_complex phase_correction;
for (int i = 0; i < frame_len; i++) {
    phase_correction = gr_expj(-M_TWOPI * carrier_offset * d_cp_len

/ d_fft_len * (i+1));
for (int k = 0; k < d_fft_len; k++) {
out[i*d_fft_len+k] *= phase_correction;
}
}


Thanks
Tiankun

Tiankan,

this corrects the coarse freq offset propagation due to the CP.
As ‘i’ increments, this represents later times. So, in a sense, this is
in time direction.

M

Well, if all carriers are carrying data, then the signal parametrization
is
bad, so this is not really an issue. That would be like leaving out the
CP
and then complaining about ISI.

M

Hi Martin,
Thank you, I got it. Those code take charge correcting phase shift
caused by CP.
The real IFO correcting is done when copy IN buff to OUT buff.
Seems there is a minor issue, if all carriers were occupied by data, OUT
buff will lose some data, right?

         // Copy the frame and the channel state vector
         // such that the symbols are shifted to the correct 

position
if (carrier_offset < 0) {
memset((void *) out, 0x00, sizeof(gr_complex) *
(-carrier_offset));<===1
memcpy(
(void *) &out[-carrier_offset], (void *) in,
sizeof(gr_complex) * (d_fft_len * frame_len +
carrier_offset)
);
} else {
memset((void *) (out + d_fft_len * frame_len -
carrier_offset), <====2
0x00, sizeof(gr_complex) * carrier_offset);
memcpy(
(void *) out, (void *) (in+carrier_offset),
sizeof(gr_complex) * (d_fft_len * frame_len -
carrier_offset)
);
}

在 2014年09月02日 23:37, Martin B. 写道:

I found “ofdm_frame_equalizer_vcvc_impl.cc” use below code to correct
for (int k = 0; k < d_fft_len; k++) {
out[i*d_fft_len+k] *= phase_correction;
}
}


Thanks
Tiankun