FFT 分辨率和采样频率

信息处理 fft 采样 频率
2022-02-20 03:54:15

我正在计算从具有 SPI 协议的 ADC 接收的数据的 FFT。由于 FFT 的分辨率与Fs/N在哪里N是 FFT 长度和Fs是 ADC 的采样频率,当我降低采样频率时,由于 Nyquist-Shannon 采样定理,它应该减小我看到的频率范围,相反,它也应该增加我的 FFT 分辨率。

我正在实时绘制这个 FFT,我已经通过任意信号发生器给出了 1 Hz 正弦信号,并测试了各种采样频率以查看 1 Hz 等于哪个点。

╔═══╦═══════════════╦═══════════════╗
║   ║ Sampling Freq ║ Point of 1 Hz ║  0. point included
╠═══╬═══════════════╬═══════════════╣
║ 1 ║ 20k           ║ 3             ║
║ 2 ║ 10k           ║ 6             ║
║ 3 ║ 1k            ║ 9             ║
║ 4 ║ 100           ║ 9             ║
╚═══╩═══════════════╩═══════════════╝ 

无论我如何降低采样频率,它都不会超过 9。顺便说一下,我的 FFT 长度是 1024。

2个回答

一个问题是,对于前两个采样频率,您没有对信号的全波进行采样。

下面是时域信号(1024 个样本)和生成的 FFT 的图。对于前两个,DC bin(0 索引)将捕获所有能量。对于 1kHz 示例,第一个 bin(索引 0 之后的那个)将捕获它。Bin 10 是 100 Hz 采样率的峰值。

也许您的采样并没有按照您的预期进行?

在此处输入图像描述


下面的R代码

# 43563

N <- 1024

fs <- c(20000, 10000, 1000, 100) 
res <- c(0,0,0,0)
idx <- 1

par(mfrow=c(4,2))
for (freq in fs)
{
  res[idx] <- freq / N
  idx <- idx + 1
  t <- seq(0,N-1) / freq
  x <- sin(2*pi*t + 0.892340923)
  plot(x, type='l')
  title(paste('time domain for ', freq))
  x_fft <- abs(fft(x))
  plot(x_fft[1:100], type='l')
  title(paste('100 bins in frequency domain for ', freq))
}

您可以使用以下公式通过采样率和 FFT 长度来估计频率分辨率:

Freq_Resolution = Sampling_Rate/length_FFT

在你的情况下应该是

19.5   9.75   0.97    0.09

这就是为什么我很困惑你如何得到你的结果。

对于 20k 和 10kHz Fs(采样率),fft 的第一个 bin 包括 1Hz。

在 1kHz Fs 的情况下,它应该在 1-2 bin 左右,具体取决于您的舍入方式。以及 100Hz Fs 的 bin 11-12。

所以问题是如何计算 bin/point?