减少 FFT 的数据点数量

信息处理 fft
2022-02-10 04:12:33

我处于一种奇怪的情况,即 FFT 给了我太多需要处理的数据。我正在对以 500 Hz 采样的音频执行 FFT,时间超过 30 秒。结果是 7500 箱有用信息,但我不需要这种分辨率。我仍然需要查看高达 250 Hz 的频率,因此我无法降低采样率。我还需要来自整个样本的信息,所以我也不能使用少于 30 秒的数据。

我可以做些什么来减少点的数量,但保持幅度和相位信息相对完整?我宁愿不丢分,是否可以取平均 x 分?

2个回答

你想知道具体的频率吗?选择Goertzel 算法

你需要知道每个第二个频率吗?这对应于频域中的下采样,即时域中的混叠。你可以这样做(我降低了采样率和信号持续时间以便更好地绘图,显然它也适用于 30 秒和 500 赫兹):

Fs = 50 # 50 Hz for less data
x = np.random.randn(2*Fs)  # The audio signal: 2s for less data for better plotting here
L = len(x)

# Calculate full FFT for reference
X = np.fft.fft(x)
f1 = np.linspace(0, Fs, L, endpoint=False)

# Calculate every 2nd sample of FFT
x2 = x[:L/2] + x[L/2:] # Perform the aliasing operation in time domain
X2 = np.fft.fft(x2)
f2 = np.linspace(0, Fs, L/2, endpoint=False)

plt.plot(f2, abs(X2), 'go-')
plt.plot(f1, abs(X), 'rx-')

plt.xlim((0, Fs/2))

在此处输入图像描述

显然,混叠方法通常也适用于每个第 N 个样本,如果L可以分为N无余。

就像不需要点密度时可以在时域中进行低通滤波和抽取一样,您也可以对复杂的 FFT 结果或频域矢量进行“低通”滤波,然后抽取到减少的频谱数量样品。

具有足够宽度的 Sinc 内核的卷积是任一域中合适的低通和预抽取平均滤波器。