正弦波的 FFT 未按预期出现,即单点

信息处理 fft
2021-12-26 03:57:19

青色图是 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()获取;

4个回答

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

另一种观点是定义为的频率分辨率。由于 50 Hz 是 1 Hz 的整数倍,因此该音调可以由单个 DFT bin 重新表示。由于 DFT 的结果是间隔 1 Hz 的离散值,因此 50.1 Hz不能由单个 bin 表示,并且能量在频域上被涂抹。在您的示例中,这是略微不对称的品红色光谱以及与 50 Hz 光谱的 0.7 幅度相比,50 Hz 箱的幅度较低的原因。fs/NDFT=1024Hz/1024=1Hz

上述两种效应都有助于您观察到的光谱。

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

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

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

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

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

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

有关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 能量完全包含在单个 bin 中:

在此处输入图像描述