【问题标题】:FFT bin width clarificationFFT bin 宽度说明
【发布时间】:2012-06-01 01:03:28
【问题描述】:

我正在为 8 位 Atmega32 开发一个频谱分析仪,它可以输出到 LCD 显示器上。 最大采样频率为 40kHz,因此最大频率为 20kHz,遵循 fs > 2B。 目前,我正在内部生成一个信号,然后对该信号应用 FFT 并在 LCD 上查看频谱。

请注意这是用伪代码编写的:

 #define SIG_N 128 //Number of samples in signal buffer
 #define FFT_N 64  //2*Output bins 
 uint_8 signal[SIG_N];
 uint_8 spektrum[FFT_N];

 for (int i = 0; i < SIG_N; i++){
   signal[i] = 255*sin(2*3.14*f*i / SIG_N);
 }
 computeFFT(signal,spektrum,FFT_N); //arbitrary method computes signal outputs spektrum

输出频谱目前有 FFT_N/2 = 32 个 bin,每个代表 1Hz。因此,我的频谱目前代表的最高频率(我已经测试过) - 32Hz。 如何增加这些 bin 的“频率宽度”,以便每个 bin 代表 625Hz? 请记住,由于内存限制,我无法将 FFT_N 的大小增加到 64~128 以上。

【问题讨论】:

    标签: c signal-processing fft avr spectrum


    【解决方案1】:

    将保罗的例子翻译成范围:

    Bin 0:    -312.5 Hz  to    312.5 Hz  (center:     0.0 Hz)
    Bin 1:     312.5 Hz  to    937.5 Hz  (center:   625.0 Hz)
    Bin 2:     937.5 Hz  to   1562.5 Hz  (center:  1250.0 Hz)
    ...
    Bin 32:  19687,5 Hz  to -19687,5 Hz  (center: 20000.0 Hz)
    

    注意Bin[0]Bin[32](第 33 个。bin 在从零开始的数组中)如何, 接收来自“负面”频率的贡献。

    这与 FFT(或任何复杂的离散傅立叶变换)的周期性性质一致。

    【讨论】:

      【解决方案2】:

      每个 bin 的宽度 (Hz) 取决于两个因素:采样率 Fs (Hz) 和 FFT bin 的数量 N:

      bin_width = Fs / N;
      

      因此,如果您在 Fs = 40 kHz 采样并且您的 FFT 中有 N = 64 箱,那么每个箱的宽度将是 625 Hz。感兴趣的箱子将是从 0 到 N / 2 - 1 的箱子:

      Bin 0        0 Hz
      Bin 1      625 Hz
      Bin 2     1250 Hz
      ...
      Bin 31  19,375 Hz
      

      【讨论】:

      • 因为我没有对这个信号进行采样,而是在内部生成它,所以这会受到影响?
      • 当你在内部生成一个信号时,你仍然可以有一个名义上的采样率,当然这可以是你喜欢的任何值。但是,如果您想在任何时候播放此信号,那么采样率将是您的 DAC 的。
      • 抱歉,再问一个简单的问题,信号缓冲区 SIG_N 在 40kHz 采样时需要多大的限制?
      • 并非如此 - 通常它是 2 的幂,您将使其足够大,以便您的 FFT 对您的特定应用有足够的分辨率(假设您将在频率域)。
      • 谢谢,你帮了大忙!
      猜你喜欢
      • 2019-12-25
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      相关资源
      最近更新 更多