补零、插值后FFT变换的影响以及频率分辨率的理解

本文探讨了频率分辨率与离散傅立叶变换(DFT)的关系,强调了频率分辨率并非仅由采样点数决定,而是与矩形窗的时间长度相关。通过MATLAB仿真,展示了补零、插值以及“高密度”FFT变换对信号频谱的影响。实验结果显示,延长采样时间能提高频率分辨率,而补零和插值并未改变谱线宽度,但插值可能导致额外频率分量出现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

频率分辨率

我们在对DTFT的频谱进行采样后自然会涉及到分辨率这个问题,频率分辨率的计算公式为:

由于DFT是对DTFT频谱的采样,所以我们往往会认为频率分辨率与采样的点数即N有关,即采样点数越多,频率分布越密集,分辨率越高。

而实际上对采集到的信号序列进行“高密度”的FFT变换时(即FFT变换的点数大于信号的点数),只是将确定的频谱分割的细一点,不能区分的频率仍旧不能区分。真正与频率的分辨能力有关的应该是谱线的宽度!

我们用matlab显示频谱的时候,如果没有放大,几乎看不出谱线宽度的区别,实际上我们对任何信号进行FT变换之前都会无意地引入了加矩形窗的处理,而加入矩形窗的结果就是谱线不再是“冲激”,而是具有一定的宽度,这与矩形窗的主瓣是有关系的,至于频谱的旁瓣则与矩形窗的旁瓣有关。这就是大家常说的“频谱泄漏”。

经过上面的叙述,频率的分辨能力与谱线的宽度有关(谱线越细,自然能分辨的频率间隔就越小),谱线的宽度又与矩形窗的主瓣有关,矩形窗的主瓣又与矩形窗的时间长度有关。所以频率的分辨能力只与矩形窗的时间长度有关即只与采样的时间T有关(而不是N),后面会有matlab仿真验证这一点。

补零与插值对FFT的影响

我们常常在对序列进行FFT变换之前会进行补零或者插值操作,但是二者对FFT的影响我一直很模棱两可,现在结合频率分辨率与matlab仿真结果对两者的影响进行总结与分析。

仿真的代码如下:

% 看看插值和补零对FFT结果的影响。
clc
clear
% 采样频率
fs = 4000;
% 三个频率分量
f1 = 200;
f2 = 400;
f3 = 600;
% 采样800个点,1000个点
n = 800;
m = 1200;
t = 0:1/fs:(n-1)/fs;
tt= 0:1/fs:(m-1)/fs;
x = 0.4*sin(2*pi*t*f1) + 0.2*sin(2*pi*t*f2) + 0.1*sin(2*pi*t*f3);
% 补零到1200
x1 = [x zeros(1,1200-length(x))];
% 插值到1200
t2 = 0:1/fs/1.5:(n-1)/fs;
% 进行插值
x2 = interp1(t,x,t2,'linear');
x3 = 0.4*sin(2*pi*tt*f1) + 0.2*sin(2*pi*tt*f2) + 0.1*sin(2*pi*tt*f3);
% 进行FFT变换
y  = fft(x);
y1 = fft(x,1200);
y2 = fft(x1);
y3 = fft(x2);
y4=fft(x3);
% 计算,横坐标换算为Hz,纵坐标换算为幅值
figure(1)
plot(fs*[0:length(x)-1]/length(x),abs(y)*2/length(x));title('采样点 800 ');
figure(2)
plot(fs*[0:length(x1)-1]/length(x1),abs(y1)*2/length(x1));title('“高密度”的FFT变换(即FFT变换的点数大于信号的点数)');
figure(3)
plot(fs*[0:length(x1)-1]/length(x1),abs(y2)*2/length(x));title('对原序列进行补零后再进行FFT变换');
figure(4)
plot(fs*[0:length(x2)-1]/length(x2),abs(y3)*2/length(x2));title('插值后再进行FFT变换');
figure(5)
plot(fs*[0:length(x3)-1]/length(x3),abs(y4)*2/length(x3));title('对采样时间延长的信号序列进行FFT变换');

上面五个结果分辨是对原信号直接进行傅立叶变换,第二个是进行“高密度”的FFT变换(即FFT变换的点数大于信号的点数),第三个是对原序列进行补零后再进行FFT变换,第四个是进行插值后再进行FFT变换,第五个是对采样时间延长的信号序列进行FFT变换。

结果如图所示:
在这里插入图片描述
在这里插入图片描述

通过两幅图的结果我们可以发现,采样时间延长的谱线会更细一点,频谱的分辨率会更高(即能区分的频率间隔更小),这一点通过对两幅图放大后可以更加直观的发现。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过上面三幅图的结果可以发现:图一跟图二是一样的,这是因为高密度FFT的处理过程也是先对原序列补零然后再进行FFT,所以两种结果是一样的。

这也提示我们不用自己人为地去给序列做补零操作,在Matlab的变换中,只需要改变进行FFT变换的点数即可。

虽然插值后时域点数增多,但是插值后的谱线宽度也没有减小,这是因为插值相当于提高了采样频率,所以点数会增多,但是采样的时间并没有变,所以频率的分辨率并没有变小,即谱线并没有变细。

如果通过细致地观察,我们还可以发现原序列插值后的FFT结果的旁瓣会减小,但是会出现别的频率分量(小凸起)

MATLAB中使用FFT做频谱分析时频率分辨率问题-频率分辨率.rar MATLAB中使用FFT做频谱分析时频率分辨率问题 最近做FFT时,使用的采样频率和信号长度的取舍一直没有搞清楚,后来在论坛上发了一个贴子《总结一下使用FFT和维纳-辛钦定理求解PSD问题》(讨论见https://www.ilovematlab.cn/thread-27150-1-1.html,特别感谢会员songzy41,他的问题给了我很大启示),跟帖中给了我不少启示,并且让我对“频率分辨率”这个概念有了更深入的理解。再次一并感谢论坛的高手们。 频率分辨率,顾名思义,就是将信号中两个靠的很近的频谱分开的能力。 信号x长度为Ts,通过傅氏变换后得到X,其频率分辨率为Δf=1/T(Hz),若经过采样后,假设采样频率为fs=1/Ts,而进行频谱分析时要将这个无穷长的序列使用窗函数截断处理,假设使用矩形窗,我们知道,矩形窗的频谱为sinc函数,主瓣宽度可以定义为2*pi/M,M为窗宽,那么,时域相乘相当于频域卷积,频域内,这一窗函数能够分辨出的最近频率肯定不可能小于2*pi/M了,也就是如果数据长度不能满足2*pi/M<|w2-w1|(w2,w1为两个靠的很近的频率),那么在频谱分析时,频谱上将不能分辨出这两个谱,由于w2-w1=2*pi/fs=2*pi*Δf/fs也就是2*pi/M<2*piΔf/fs,得到Δf的限制为fs/M,这就是窗函数宽度的最小选择,就是说,根据Shannon采样定理确定了采样频率后,要根据靠的最近的谱峰来确定最小的采样长度,这样,所作出来的频谱才能分辨出那两个谱峰,也就是拥有了相应的频率分辨率。 几个例子: 考虑双正弦信号:x = sin sin;根据Shannon采样定理,采样频率要大于截止频率的两倍,这里选采样频率为80,那么,我们可以看到,Δf为0.2Hz,那么,最小的数据长度为0.2/80=400,但是对正弦信号的频谱分析经验告诉我们,在截断时截断时的数据要包含整周期,并且后面不宜补零以避免频谱泄露(这一点见胡广书《数字信号处理导论》,清华大学出版社),那么,我们要选择至少980个点,才能保含到一个整周期,另外,FFT的经验告诉我们作分析时最好选择2的整数次幂,我们选择靠的最近的1024点。分析结束。 [CODE] Fs = 80; n = 0:1/Fs:1023*1/Fs; x = sin sin; N = length; figure; X = fftshift); plot*Fs/N,abs*2/N); grid on; axis; 这是按照我们的分析进行的编程和图形 zheng.jpg 可以看出这两个谱峰很好的被分辨开来,9.8Hz不在谱线上,所以幅值不为1,以下是一些对比: [CODE] Fs = 80; n = 0:1/Fs:1023*1/Fs; x = sin sin; N = length; X = fftshift); figure; subplot plot*Fs/N,abs*2/N); grid on; axis; title; n = 0:1/Fs:979*1/Fs; x = sin sin; N = length; X = fftshift); subplot plot*Fs/N,abs*2/N); grid on; axis; title; n = 0:1/Fs:399*1/Fs; x = sin sin; N = length; X = fftshift); figure; subplot plot*Fs/N,abs*2/N); grid on; axis; title; Fs = 20; n = 0:1/Fs:1024*1/Fs; x = sin sin; N = length; X = fftshift); subplot plot*Fs/N,abs*2/N); grid on; axis; title; 结果如下: 1024.jpg 400.jpg 这是我在做FFT以及论坛中的问题时所得到的一点启发,不当之处还请大家指正。OO~ 频率分辨率.rar 为了方便大家,我将doc版报告和m文件一起上传,和帖子内容一样。OO~
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值