如何画OFDM频谱图

文章目录

前言

常见于各种教材、论文的OFDM频谱图一般长这样(13个子载波),即多个sinc函数的叠加:

如何画OFDM频谱图
而网上查了些博客,基本是直接画sinc函数来绘制OFDM频谱,没找到用fft对时域信号做处理来实现的,所以总结一下。

; 一、为什么是sinc函数

因为实际OFDM信号不可能是无限长的,而有限长的OFDM信号实际可以看做与矩形窗函数的乘积,矩形窗函数可以定义如下:

如何画OFDM频谱图

对其进行傅里叶变换:

如何画OFDM频谱图
由于时域相乘等效于频域卷积,因此OFDM信号反映到频谱,就成为各个不同位置的冲击响应与SINC函数的卷积。

二、matlab绘制时域图形

Fs=1000;
N=1024; %总的子载波数
T=N/Fs; %信号绘制为一个周期的长度
x=0:1/Fs:T-1/Fs;
Numscr=4; %绘制的子载波数量
% s_data=1;
s_data=(1+1i)/sqrt(2); %初始相位
ini_phase=repmat(s_data,1,T*Fs);
for k=0:Numscr
    for n=0:T*Fs-1
        y(k+1,n+1)=ini_phase(n+1)*exp(1i*2*pi*k*n/N);
    end
end

如何画OFDM频谱图
这里比较简单,照OFDM数学符号写一下代码就行:
如何画OFDM频谱图

三、matlab绘制频域图形

1.直接对时域波形做fft

代码如下:

f=(0:T*Fs-1)/T-Fs/2;
for k=0:Numscr
    y_fft(k+1,:)=abs(fftshift(fft(y1(k+1,:))))/N;
end
figure(2)
plot(f,y_fft(1,:),f,y_fft(2,:),f,y_fft(3,:),f,y_fft(4,:),f,y_fft(5,:));
grid on;
xlim([-10,10]);
xlabel('频率/Hz');
ylabel('幅度');

结果:

如何画OFDM频谱图
与理想的sinc波形相去甚远,这样肯定不行。若在时域进行补零,如下。

2.时域补零

补1024*3个0:

a=3;
y1=[y,zeros(5,a*1024)];
f=(0:(a+1)*T*Fs-1)/T/(a+1)-Fs/2;
for k=0:Numscr
    y_fft(k+1,:)=abs(fftshift(fft(y1(k+1,:))))/N;
end
figure(2)
plot(f,y_fft(1,:),f,y_fft(2,:),f,y_fft(3,:),f,y_fft(4,:),f,y_fft(5,:));
grid on;
xlim([-10,10]);
xlabel('频率/Hz');
ylabel('幅度');

结果已比较接近,但还是不圆滑:

如何画OFDM频谱图
补1024*20个0,结果已比较理想:
如何画OFDM频谱图
原因分析:时域尾部补零等效于频域插值,让频谱图形变得圆滑。

3.初始相位的影响

虽然图形以及比较理想,但相比文章开头的图,还是有不一样之处:我们绘制的频谱图幅值都是大于等于0的。当然必然是大于等于0的,因为我们是取模进行绘制,也是正确的,但是怎么获得这种图:

如何画OFDM频谱图
要绘制这样的图形,取模肯定是不行的,我们可以尝试取实部,在上面那个初始相位为π/4的情况下,即:
s_data=(1+1i)/sqrt(2); %初始相位

实部图形:

如何画OFDM频谱图

若把初始相位设置为0,即:

s_data=1; %初始相位

则时域图形:

如何画OFDM频谱图

频谱图:

如何画OFDM频谱图
获得了比较接近的频谱图。

总结

1.时域尾部补零才能实现近似的窗函数的作用,也可以理解为时域补零等效为频域插值,插值的点数由补零个数决定,如原来为1024个点,补3072个0,那频谱的点也会扩充为4倍,实现插值。
2.OFDM的初始相位会对频谱的相位造成影响,但不会对频谱的幅值造成影响,这也比较容易理解,结合傅里叶变换的公式就可以。

Original: https://blog.csdn.net/weixin_47113615/article/details/124880001
Author: Escapistt
Title: 如何画OFDM频谱图

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/633427/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球