编程技术分享平台

网站首页 > 技术教程 正文

信号序列长度如何影响FFT输出频域谱的准确度

xnh888 2024-11-10 12:40:43 技术教程 34 ℃ 0 评论

在时序信号分析中,我们常常会从时域和频域两个方面来观察信号特征。而在进行频域观察时,会用到傅里叶变换,即FFT。那么我们应该取多长的数据点数来作FFT变换,其输出的频率谱就足够揭示主要的频域特征呢?在本文中,我们不去讲原理,而是通过简单的实际例子的绘图观察来理解这个问题。

首先,我们引入依赖模块,

import numpy as np
import matplotlib.pyplot as plt

然后,我们构造一段长为4秒的信号,如下,

t = np.arange(4000)/1000
x = np.sin(2*np.pi *10*t) + \
    3*np.sin(2*np.pi*50*t)+ \
    5*np.sin(2*np.pi*400*t)

信号中,包含了频率为10, 50和400的三个成分。4秒采样4000个点,采样频率为1000Hz。

我们绘图看看这个信号在时域长什么样,取前100个点绘图

fig = plt.figure(figsize=(10,3))

plt.plot(t[:100],x[:100])

然后我们开始绘频域图,默认情况下,matplotlib psd绘图的NFFT等于256

_ = plt.psd(x, Fs=1000)

可见这个默认值对于我们的例子而言是足够有效的。

下面,我们刻意将NFFT变小,

_= plt.psd(x, Fs=1000, NFFT=16)

其绘图效果如下

这下子就很不准确了,看起来频率向两旁泄露了。

我们将NFFT提高到32,

这时,三个频率就比较接近了。因此,我们应该设置较大的NFFT。

下面是将NFFT提高到1024的效果,

这个图中,三个主要频率的频峰特别细。

因此,条件允许的情况下,我们在作FFT变换时,应该给足够大的NFFT值。

但这里也有一个要权衡的例外,即如果信号的频率是时变的,那么NFFT较大时,意味着用于FFT变换的数据段内包含的频率变化较多,误差反而可能又变大了。这种情况下,可以尝试使用welch方法、或小波方法等。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表