方波 FFT 结果显示频率似乎太低?

信息处理 fft 信号分析 Python
2022-02-20 13:58:05

我为低成本示波器创建了一个开源绘图包 - 请参阅此处的链接:GitHub Plotting Software

但是在我的测试过程中,我得到了一个可能是错误的结果:嘈杂的 7 kHz 方波在 6.25 kHz 处显示了 FFT 峰值。这可能是正确的,还是我错过了什么?

这是我的 FFT 的 python 代码提取


# stack FFT plot in this figure vertically
plt.subplot(grid_stack[grid_row, :])

y_heading = self.y_heading

# Reduce signal_data array size by a factor of n (used to reduce the frequency range)
n = self.n
updated_df_data = self.reduce_sample_array(self.df_data, n)

# update sample rate and array size
sample_rate = float(self.info_dict['rate'][1])/n
array_size = updated_df_data[y_heading].size

# Calculate y-axis magnitude scaled to same units as y-axis in heading2Use data (ie volts)
yf = 2/array_size * fft(updated_df_data[y_heading].values)

# Calculate x axis as frequency in Hz
x = fftfreq(array_size, 1 / float(sample_rate))
x_half = x[:x.size//2]

freq_units, freq_multiplier = rescale_frequency(x_half)
x_half = rescale_data(x_half, 10 ** freq_multiplier)

y_half = abs(yf)[:array_size//2]
engr_power_v = calculate_scale(y_half)
y_half = rescale_data(y_half, 10**engr_power_v)

plt.plot(x_half, y_half, color=self.iplot_colors[-1])

带有干净方波的示例图,似乎没问题

在此处输入图像描述

带有似乎具有错误峰值的嘈杂方波的示例图(6.25 而不是 7 kHz)

在此处输入图像描述

欢迎任何意见或建议,因为这是我的第一个 python 信号分析软件项目。

1个回答

FFT 的频率分辨率取决于其长度和采样率。

在第二个图中,您显示 Fs = 10e6 和 3200 个样本。假设您在将这些样本传递给 FFT 时不对其进行零填充,这将为您提供 3125Hz 的频率分辨率:

3215=10×1063200

因此,在较低频率下,您的频率区间为 0Hz、3125Hz、6250Hz 和 9375Hz。FFT 中的最大峰值将在最接近信号基频的 bin 中。

如果您想要更好的分辨率,您要么需要捕获更多样本,要么在时间序列的末尾附加一个零负载(零填充)。

我还建议您阅读有关 FFT 分析的窗口化,特别是如果您走零填充路线。

顺便说一句:该reduce_sample_array函数似乎通过简单地丢弃样本来抽取时间序列。你真的应该在这里进行适当的下采样,以避免混叠。