文章目录
前言
常见于各种教材、论文的OFDM频谱图一般长这样(13个子载波),即多个sinc函数的叠加:
而网上查了些博客,基本是直接画sinc函数来绘制OFDM频谱,没找到用fft对时域信号做处理来实现的,所以总结一下。
; 一、为什么是sinc函数
因为实际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数学符号写一下代码就行:
三、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('幅度');
结果:
与理想的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('幅度');
结果已比较接近,但还是不圆滑:
补1024*20个0,结果已比较理想:
原因分析:时域尾部补零等效于频域插值,让频谱图形变得圆滑。
3.初始相位的影响
虽然图形以及比较理想,但相比文章开头的图,还是有不一样之处:我们绘制的频谱图幅值都是大于等于0的。当然必然是大于等于0的,因为我们是取模进行绘制,也是正确的,但是怎么获得这种图:
要绘制这样的图形,取模肯定是不行的,我们可以尝试取实部,在上面那个初始相位为π/4的情况下,即:
s_data=(1+1i)/sqrt(2); %初始相位
实部图形:
若把初始相位设置为0,即:
s_data=1; %初始相位
则时域图形:
频谱图:
获得了比较接近的频谱图。
总结
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/
转载文章受原作者版权保护。转载请注明原作者出处!