我是靠谱客的博主 怕孤独金针菇,最近开发中收集的这篇文章主要介绍序列补零、插值后对FFT变换的影响以及频率分辨率的理解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

DTFT、DFT、FFT的区别与联系

DTFT(离散时间傅立叶变换)顾名思义是对离散的时间序列进行的傅立叶变换;假设有一连续的信号为x(t),对其进行傅立叶变换的定义式为:

对连续信号x(t)进行抽样后再进行傅立叶变换的公式变为:


x(nTs)可以表示为x[n],数字角频率w=ΩTs,上式简化为:


上式即为DTFT的定义式,根据推导过程揭示了其与FT的关系。根据抽样定理我们知道对连续信号进行抽样,其频谱会以Ws进行搬移。DTFT的数字角频率是对模拟角频率的归一化处理得到的(与采样周期Ts相乘),所以DTFT的频谱是以2pi为周期的连续谱。

由于计算机处理的数据都是离散的,所以我们不仅要求信号为离散的,还要求频谱是离散的,所以我们还要对频谱进行采样即DFT。其定义式为:

所以DFT是对DTFT的频谱采样,至于FFT则是DFT的快速算法。

频率分辨率

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

由于DFT是对DTFT频谱的采样,所以我们往往会认为频率分辨率与采样的点数即N有关,即采样点数越多,频率分布越密集,分辨率越高。而实际上对采集到的信号序列进行“高密度”的FFT变换时(即FFT变换的点数大于信号的点数),只是将确定的频谱分割的细一点,不能区分的频率仍旧不能区分。真正与频率的分辨能力有关的应该是谱线的宽度!我们用matlab显示频谱的时候,如果没有放大,几乎看不出谱线宽度的区别,实际上我们对任何信号进行FT变换之前都会无意地引入了加矩形窗的处理,而加入矩形窗的结果就是谱线不再是“冲激”,而是具有一定的宽度,这与矩形窗的主瓣是有关系的,至于频谱的旁瓣则与矩形窗的旁瓣有关。这就是大家常说的“频谱泄漏”。
经过上面的叙述,频率的分辨能力与谱线的宽度有关(谱线越细,自然能分辨的频率间隔就越小),谱线的宽度又与矩形窗的主瓣有关,矩形窗的主瓣又与矩形窗的时间长度有关。所以频率的分辨能力只与矩形窗的时间长度有关即只与采样的时间T有关(而不是N),后面会有matlab仿真验证这一点。

序列补零与插值对FFT的影响

我们常常在对序列进行FFT变换之前会进行补零或者插值操作,但是二者对FFT的影响我一直很模棱两可,现在结合频率分辨率与matlab仿真结果对两者的影响进行总结与分析。
仿真的代码如下:
% 看看插值和补零对FFT结果的影响。
clc
clear
% 采样频率
fs = 4000;
% 三个频率分量
f1 = 250;
f2 = 300;
f3 = 400;
% 采样800个点,1000个点
n = 800;
m=1200;
t = 0:1/fs:(n-1)/fs;
tt= 0:1/fs:(m-1)/fs;
x = 0.2*sin(2*pi*t*f1) + 0.4*sin(2*pi*t*f2) + 0.6*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.2*sin(2*pi*tt*f1) + 0.4*sin(2*pi*tt*f2) + 0.6*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));
figure(2)
plot(fs*[0:length(x1)-1]/length(x1),abs(y1)*2/length(x1));
figure(3)
plot(fs*[0:length(x1)-1]/length(x1),abs(y2)*2/length(x));
figure(4)
plot(fs*[0:length(x2)-1]/length(x2),abs(y3)*2/length(x2))
figure(5)
plot(fs*[0:length(x3)-1]/length(x3),abs(y4)*2/length(x3))
上面五个结果分辨是对原信号直接进行傅立叶变换,第二个是进行“高密度”的FFT变换(即FFT变换的点数大于信号的点数),第三个是对原序列进行补零后再进行FFT变换,第四个是进行插值后再进行FFT变换,第五个是对采样时间延长的信号序列进行FFT变换。
结果如图所示:
原序列FFT结果
采样时间延长的FFT结果
通过两幅图的结果我们可以发现,采样时间延长的谱线会更细一点,频谱的分辨率会更高(即能区分的频率间隔更小),这一点通过对两幅图放大后可以更加直观的发现。
原序列高密度FFT结果
原序列补零后FFT结果
原序列插值后FFT结果
通过上面三幅图的结果可以发现:图一跟图二是一样的,这是因为高密度FFT的处理过程也是先对原序列补零然后再进行FFT,所以两种结果是一样的。这也提示我们不用自己人为地去给序列做补零操作,只需要改变进行FFT变换的点数即可。也许有人会问补零是不是增加了旁瓣啊(与上图相比来看),其实并没有。。其实原序列的旁瓣与补零后的旁瓣是一样的,只是补零后采样点增多,把旁瓣显示出来而已。虽然插值后时域点数增多,但是插值后的谱线宽度也没有减小,这是因为插值相当于提高了采样频率,所以点数会增多,但是采样的时间并没有变,所以频率的分辨率并没有变小,即谱线并没有变细。如果通过细致地观察,我们还可以发现原序列插值后的FFT结果的旁瓣会减小,但是会出现别的频率分量(小凸起)。对于这一结果我认为是有可能插值后信号的完成性被破坏(突变),产生高频率的原因。这一点需要继续学习研究。。。


最后

以上就是怕孤独金针菇为你收集整理的序列补零、插值后对FFT变换的影响以及频率分辨率的理解的全部内容,希望文章能够帮你解决序列补零、插值后对FFT变换的影响以及频率分辨率的理解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(77)

评论列表共有 0 条评论

立即
投稿
返回
顶部