# Integral frequency shift correcting in ofdm\_frame\_equalizer\_vcvc\_impl.cc

**URL:** <https://www.ruby-forum.com/t/integral-frequency-shift-correcting-in-ofdm-frame-equalizer-vcvc-impl-cc/231841>\
**Category:** GNU Radio\
**Created:** [September 2, 2014, 4:16pm UTC](https://www.ruby-forum.com/t/integral-frequency-shift-correcting-in-ofdm-frame-equalizer-vcvc-impl-cc/231841 "2014-09-02T16:16:30Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![addis\_a](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/c4cdca/32.png) [@addis\_a](https://www.ruby-forum.com/u/addis_a)\
**Post date:** [September 2, 2014, 4:16pm UTC](https://www.ruby-forum.com/t/integral-frequency-shift-correcting-in-ofdm-frame-equalizer-vcvc-impl-cc/231841/1 "2014-09-02T16:16:30Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Tiankun\_Hu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/46a35a/32.png) [@Tiankun\_Hu](https://www.ruby-forum.com/u/Tiankun_Hu)\
**Post date:** [September 2, 2014, 5:38pm UTC](https://www.ruby-forum.com/t/integral-frequency-shift-correcting-in-ofdm-frame-equalizer-vcvc-impl-cc/231841/2 "2014-09-02T17:38:58Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Tiankun\_Hu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/46a35a/32.png) [@Tiankun\_Hu](https://www.ruby-forum.com/u/Tiankun_Hu)\
**Post date:** [September 3, 2014, 5:12pm UTC](https://www.ruby-forum.com/t/integral-frequency-shift-correcting-in-ofdm-frame-equalizer-vcvc-impl-cc/231841/3 "2014-09-03T17:12:49Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Tiankun\_Hu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/46a35a/32.png) [@Tiankun\_Hu](https://www.ruby-forum.com/u/Tiankun_Hu)\
**Post date:** [September 3, 2014, 3:25pm UTC](https://www.ruby-forum.com/t/integral-frequency-shift-correcting-in-ofdm-frame-equalizer-vcvc-impl-cc/231841/4 "2014-09-03T15:25:23Z")

</div>

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
