通信人家园

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索

军衔等级:

  新兵

注册:2021-5-145
跳转到指定楼层
1#
发表于 2021-7-5 11:02:56 |只看该作者 |倒序浏览
有一次和一位通信前辈交流通信知识,我被问到在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的操作便是将数据前、半部分换回来,和发射机侧的数据交换相互对应。
第二份材料来源知乎Ahlers:OFDM-功率谱密度的Matlab实现中提到:
第三份材料来自《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章,下次更新见!

举报本楼

您需要登录后才可以回帖 登录 | 注册 |

手机版|C114 ( 沪ICP备12002291号-1 )|联系我们 |网站地图  

GMT+8, 2024-11-24 03:42 , Processed in 0.920014 second(s), 15 queries , Gzip On.

Copyright © 1999-2023 C114 All Rights Reserved

Discuz Licensed

回顶部