我一直在研究以下代码,但仍然无法解释其输出。我真的希望有人能解释一下。
让我从基线开始。假设我有一个 20 秒的正弦曲线,频率分量为 [1,2,3,4....500Hz]。该信号的 Fs=1024Hz,所以它的 FFT 输出如下所示。FFT 幅度也被缩放以保持 Parseval 定理。在这种情况下,频率分辨率为 Fs/nfft = 1.0 Hz/bin,因此 FFT 输出自身模糊,使输出看起来像一条平线,这是预期的。
# Python code
import numpy as np
import matplotlib.pyplot as plt
dur = 20
fs = 1024
t1 = np.arange(0, dur, 1/fs)
x1 = np.zeros_like(t1)
for f in np.arange(1, 500):
x1 += np.sin(2*np.pi*f*t1)
plt.figure(figsize=(8,4))
plt.title('Signal')
plt.plot(t1[:100], x1[:100])
plt.xlabel('sec')
plt.grid()
plt.show()
nfft = 1024
df = fs / nfft
X1 = np.fft.fft(x1, nfft)[:nfft//2]
# Scale FFT amplitude to preserve Parseval's Theorem
X1 = X1 * np.sqrt(2 / nfft)
f1 = np.arange(0, nfft//2) * df
plt.figure(figsize=(8,4))
plt.title(f'Baseline FFT, Freq Resolution={df}Hz')
plt.plot(f1, np.abs(X1))
plt.grid()
plt.xlim([0, nfft/2])
plt.xlabel('Hz')
plt.show()
p1 = np.sum(x1[:nfft]**2)
p2 = np.sum(np.abs(X1)**2)
print('Parseval check:', np.allclose(p1, p2))
棘手的部分来了。信号按以下方式重新采样x2 = x1[::10](下采样 10 倍?)。如果这真的是下采样,那么新的有效 Fs 应该变为 1024/10 = 102.4Hz,然后奈奎斯特频率变为,因此 FFT 输出应该只包含高达 51Hz 的频率分量。至少从理论上来说是这样。但是,以下输出表明并非如此。我可以看到频率分辨率从 1.0Hz 显着提高到 0.1Hz,但输出仅包含高达 12Hz 的频率分量,而不是 51Hz。为什么会这样?我想念什么?任何人都可以解释一下吗?谢谢
step = 10
x2 = x1[::step]
plt.figure(figsize=(8,4))
plt.title('Downsampled Signal')
plt.plot(t1[:100], x2[:100])
plt.xlabel('sec')
plt.grid()
plt.show()
nfft = 1024
fs2 = fs / step
df2 = fs2 / nfft
X2 = np.fft.fft(x2, nfft)[:nfft//2]
# To preserve Parseval's Theorem
X2 = X2 * np.sqrt(2/nfft)
f2 = np.arange(0, nfft//2) * df2
plt.figure(figsize=(8,4))
plt.title(f'Downsampled FFT, Freq Resolution={df2}Hz')
plt.plot(f2, np.abs(X2))
plt.grid()
plt.xlim([0, 50])
plt.show()
p1 = np.sum(x2[:nfft]**2)
p2 = np.sum(np.abs(X2)**2)
print('Parseval check:', np.allclose(p1, p2))







