正弦波的FFT不符合预期,即单点


14

青色曲线是50 Hz的频谱,洋红色曲线是50.1 Hz的正弦波(振幅为0.7)。两者均以1024个样本/秒的速度采样。我执行了1024点FFT以获得此频谱。

为什么只有50Hz频谱是单个值?为什么50.1 Hz正弦由50.1 Hz以外的其他频率组成;这些新频率从何而来?

我没有对50.1 Hz信号进行任何非线性处理!同样,50.1 Hz似乎具有较小的最大振幅,即不是0.7,而实际上我生成的正弦波的振幅为0.7。

为什么是这样?

两个频谱分别为50Hz和50.1Hz 通过MATALB命令fft()获得;


您能否发布用于生成该图的代码?我最好的猜测是,由于信号之间的距离太近,ftf无法正确解决它们。那样,或者某种频谱拖尾,因为样本与频率不对齐。
汤姆·基利2013年

4
下面的答案是正确的。所观察到的术语称为频谱泄漏,当您分析其频率不完全位于您的DFT输出箱之一的中心的正弦曲线时会观察到。
Jason R

请问您能针对50Hz的峰值
做出什么对策

请参阅此答案,以详细了解问题是什么以及如何解决。
Dilip Sarwate 2013年

Answers:


14

Acually Matt的回答已经在这里给出了关于该问题的一种观点:DFT在时域和频域上都是隐式周期性的(请参阅此问题)。根据您的参数,我们可以计算出您的观察周期为1 s。这意味着您观察到50个周期的50 Hz音调。定期延长该观察间隔将始终导致无形的正弦波。如果采用50.1 Hz音调,则将转换50.1个振荡周期。周期性地扩展信号将导致相位跳变,从而导致额外的频谱支路。

fs/NDFT=1024Hz/1024=1赫兹

上面描述的两种效果都有助于您观察到频谱。


1
那讲得通。但是,为了更清楚地说明您所描述的光谱泄漏,这是用于观察光谱的工具(FFT)的问题。它不是信号本身的缺陷。表示如果我“听到” 50.1 Hz的音频信号,它将在我的耳朵上显示为单音,而不是某种“噪音”。我对吗?
gpuguy

1
你是绝对正确的。它显示了理解DFT实际在做什么以便能够正确解释它的重要性。附带说明:在实际实现中您将“听到”的内容还取决于您如何将离散量转换为模拟信号。
Deve

11

这是截断或开窗正弦信号的效果。您需要以这样一种方式截断,即如果将经过移位的信号添加到截断的信号上,它仍将是原始正弦波。


6

对于纯未调制正弦波的频率,您只会得到一个结果FFT点,该频率正好是FFT孔径或宽度中的整数周期。正弦波的任何其他频率都将与默认窗口(矩形)的变换(周期Sinc)卷积。

50.1 Hz在FFT的1秒窗口中不是完全周期性的。

需要那些其他“泄漏” FFT结果块或频率来表示由在FFT宽度上不是正整数周期的任何信号在窗口边界之间产生的不连续性。这是因为DFT的所有基本向量在DFT的宽度内都是整数周期,因此在基本向量的末尾与开始之间没有明显的不连续性。因此,任何不具有这些特征的信号都不能仅由一个DFT基矢量(及其复共轭)来表示,因此有关其余信号的信息必须放在某个地方。

由于总能量由FFT变换保留(Parseval'a定理),因此“泄漏”箱中的能量会从峰值箱中移走。因此,峰箱的大小必须更低。


5

我敢打赌,您的正弦波在第一个样本和最后一个样本为零?不应该这样 应该将其对齐,以便在最后一个采样之后的下一个采样为零,以便您可以一个个接一个地复制和粘贴信号副本,它们看起来是连续的,没有重复的采样。也许将其想象为瓷砖桌面墙纸,其中瓷砖的一个边缘必须无缝地与另一边缘相交。:)

请参阅https://gist.github.com/endolith/236567以获取python示例:

# Sampling rate
fs = 128 # Hz

# Time is from 0 to 1 seconds, but leave off the endpoint, so that 1.0 seconds is the first sample of the *next* chunk
length = 1 # second
N = fs * length
t = linspace(0, length, num = N, endpoint = False)

# Generate a sinusoid at frequency f
f = 10 # Hz
a = cos(2 * pi * f * t)

# Use FFT to get the amplitude of the spectrum
ampl = 1/N * abs(fft(a))

查看信号的两个副本如何端到端组合在一起以形成连续波:

在此处输入图片说明

发生这种情况时,FFT能量将完全包含在一个容器中:

在此处输入图片说明


1
我和OP有同样的问题。通过设置端点= False标志解决了该问题。我以为默认情况下行空间是(关闭,打开),但事实证明它是(关闭,关闭)。由于您的代码,我发现了该错误。
Trismegistos

-1

这是由于光谱泄漏和开窗引起的。理想的响应,即脉冲函数是连续时间正弦波。当在数字计算机中对离散正弦波进行DFT时,基本上就是对窗口化和采样的正弦波进行傅立叶变换,然后在频域中对其进行采样。这导致频谱泄漏。请参阅:http : //w.astro.berkeley.edu/~jrg/ngst/fft/leakage.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.