青色曲线是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的振幅。

为什么这样?


通过MATALB命令fft();

获得

评论

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

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

我能知道您针对什么绘制了什么图,以使峰值频率达到50Hz时

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

#1 楼

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

另一个视图是频率分辨率,定义为$ f_ \ mathrm {s} / N_ \ mathrm {DFT} = 1024 \ text {Hz} / 1024 = 1 \ text {Hz} $。由于50 Hz是1 Hz的整数倍,因此可以通过单个DFT bin重新表示此音调。由于DFT的结果是离散值,它们之间的间隔为1 Hz,所以50.1 Hz不能由单个bin表示,并且能量会在频域上散布。在您的示例中,这是品红光谱稍微不对称且与50 Hz光谱的0.7幅值相比50 Hz仓的幅值较低的原因。
上述两种效果均对光谱有所贡献您正在观察。

评论


$ \ begingroup $
这很有意义。但是,为了更清楚地说明您所描述的光谱泄漏,这是用于观察光谱的工具(FFT)的问题。它不是信号本身的缺陷。表示如果我“听到” 50.1 Hz的音频信号,它将在我的耳朵中显示为单音,而不是某种“噪音”。我对吗?
$ \ endgroup $
– gpuguy
13年4月12日在10:27



$ \ begingroup $
你是完全正确的。它显示了理解DFT实际在做什么以便能够正确解释它的重要性。附带说明:在实际实现中您将“听到”的内容还取决于您如何将离散量转换为模拟信号。
$ \ endgroup $
–戴夫
13年4月12日在10:42

#2 楼

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

#3 楼

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

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

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

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

#4 楼

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

有关Python示例,请参见https://gist.github.com/endolith/236567:

# 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能量完全包含在单个容器中:



评论


$ \ begingroup $
我和OP有同样的问题。通过设置端点= False标志解决了该问题。我以为默认情况下行距是(关闭,打开),但事实证明是(关闭,关闭)。由于您的代码,我发现了该错误。
$ \ endgroup $
–三角龙
18-10-30在17:16

#5 楼

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