有一次和一位通信前辈交流通信知识,我被问到在OFDM系统中,发射机侧进入ifft还需要进行什么操作? 我思考了一下,我在之前的OFDM仿真中也没有进行什么操作呀,于是……我没有答上来。 我已经不记得前辈的原话,但大概意思是在进入ifft之前需要进行将数据前、后半部分位置交换一下,便可以将[0 2pi]搬移到[-pi pi],即让0频处在中间。 这个问题,我思考了好几天,接下来整理一下我最近就该问题的思考,也是对我之前写的OFDM相关系列文章的关键补充。 首先说一下,进入ifft之前是否一定要将数据前、后半部分交换一下,答案是必须的,我在之后将给出证明。 第一份材料来自《MIMO-OFDM无线通信技术及MATLAB实现》中OFDM_basic.m的发送机这侧代码: kk1=1:Nused/2; kk2=Nused/2+1:Nused; kk3=1:Nfft; kk4=1:Nsym; for k=1:Nframe if Nvc~=0 X_shift= [0 Xmod(kk2) zeros(1,Nvc-1) Xmod(kk1)]; else X_shift= [Xmod(kk2) Xmod(kk1)]; end x= ifft(X_shift); x_GI(kk4)= guard_interval(Ng,Nfft,NgType,x); kk1=kk1+Nused; kk2= kk2+Nused; kk3=kk3+Nfft; kk4=kk4+Nsym; end
我一开始学OFDM的时候,就自动忽略了这部分将数据前、后半部分交换的代码,也即Xmod到X_shift这个过程,直到被前辈问到…… 结合上面给出的代码,进入ifft的是X_shift,而不是经过MQAM或者MPSK映射刚出来的Xmod。 而在接收机对应的代码如下: for k=1:Nframe Y(kk2)= fft(remove_GI(Ng,Nsym,NgType,y_GI(kk1))); Y_shift=[Y(kk4) Y(kk5)]; if Ch==0 Xmod_r(kk3) = Y_shift; else Xmod_r(kk3)= Y_shift./H_shift; % Equalizer - channel compensation end kk1=kk1+Nsym; kk2=kk2+Nfft; kk3=kk3+Nused; kk4=kk4+Nfft; kk5=kk5+Nfft; end
Y_shift的操作便是将数据前、半部分换回来,和发射机侧的数据交换相互对应。 第三份材料来自《5G NR in Bullets》中对5G NR 38.211中5.3 OFDM baseband signal generation这部分的解读: 图片来自Chris Johnson《5G NR in Bullets》由《5G NR in Bullets》P136第2个bullet可知,基带信号需要处在0频附近,因此这导致了一半范围的k对应的子载波频率index为负,而对另一半范围k对应的子载波频率index为0或者正。 在LTE中没有使用DC子载波,这主要是因为本振泄露,本振泄露经过本原振荡器后,将会产生直流分量。如果DC子载波上恰好有有用的信号,直流分量将会对这个有用信号产生干扰。 但是在5G NR中,允许使用DC子载波,这是因为收发机能处理掉本振泄露带来的影响。不管怎么说,DC子载波相比其他子载波,可能处于不利地位。 通过Figure 131与上面对k对应的子载波下标解释。下面给出证明。 子载波标号有 到0,1到 共 个子载波,下面需要将: 调制到标号为 的子载波上, 调制到标号为 的子载波上,…… 调制到标号为 的子载波上,那么便有: 令 ,则 对上式右侧的第二部分式子中,令 注意到 所以得到: 注意到, 中的 ,恰好表示的是X的后半部分, 中 ,对应表示的是X的前半部分。 所以在进入ifft操作需要将X的前、后半部分数据进行位置交换,而在MATLAB中可以用fftshift这个函数来实现,该函数的功能便是Shift zero-frequency component to center of spectrum(将零频移到频谱的中央)。 注意到对于X这个序列长度为奇数和偶数时,fftshift的操作稍有不同。 若V是偶数个元素: %%%%%V有偶数个元素 V = [1 2 3 4 5 6 7 8];X = fftshift(V);Y = ifftshift(X);Y2 = fftshift(X);%%%结论%%%Y与V是相同结果,由于V有偶数个元素,Y2与Y结果相同
若V是奇数个元素: %%%%%V有奇数个元素V = [1 2 3 4 5 6 7 ];X = fftshift(V);Y = ifftshift(X);Y2 = fftshift(X);%%%Y与V是相同结果,由于V有奇数个元素,Y2与Y结果不同
对于偶数个元素的X来说,有fftshift(fftshift(X))=X,但是对于奇数个元素的X来说,fftshift(fftshift(X))不等于X。 当然,不管X的长度为奇数还是偶数,均有 ifftshift(fftshift(X))=X,这是恒成立的。 除此之外,MATLAB中fftshift这个函数的例子也非常形象,如下: 那么问题来了,为什么我之前的OFDM文章进入IFFT之前没有进行fftshift操作,也能进行仿真呢? 这主要是因为,我之前确实不知道这个知识点,而且我的OFDM代码仿真过程中,是一个基带原理性的仿真,并没有考虑到上载波这个过程。 换句话讲,如果基带信号中心频率不是在0,而是在f/2附近,仅仅对于仿真来说,当然也是可以仿真的,但是在物理意义上便说不过去了,因为没有满足基带附近信号处在零频附近的物理事实。 总之,结论便是:在OFDM系统中,在发射端进入ifft之前,需要将数据进行前半部分与后半部分进行位置对调,目的是让零频处在信号的中央。对调这个操作可以通过MATLAB自带的fftshift函数来完成。 欢迎你双击屏幕、点赞、收藏、转发和分享,关注我的知乎号,也欢迎读者朋友就相关技术问题与我交流,一起学习,共同进步。请你也别忘了把这篇文章分享给你身边正在学习通信专业的同学们,也许能够帮到Ta。 这是《陈老湿·通信MATLAB仿真》的第7章,下次更新见!
|