FFT bin宽度澄清

Osp*_*pho 3 c avr signal-processing fft spectrum

我正在为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
Run Code Online (Sandbox Code Playgroud)

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

vil*_*ren 9

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

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)
Run Code Online (Sandbox Code Playgroud)

请注意Bin[0]Bin[32](基于零的数组中的第 33 个 bin)如何接收来自“负”频率的贡献。

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


Pau*_*l R 8

每个箱的宽度(Hz)取决于两件事:采样率,Fs(Hz)和FFT箱的数量,N:

bin_width = Fs / N;
Run Code Online (Sandbox Code Playgroud)

因此,如果您在FFT处进行采样,Fs = 40 kHz并且您N = 64的FFT中有垃圾箱,则每个垃圾箱的宽度为625 Hz.感兴趣的箱子是从0到N/2 - 1的箱子:

Bin 0        0 Hz
Bin 1      625 Hz
Bin 2     1250 Hz
...
Bin 31  19,375 Hz
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,你们非常乐于助人! (5认同)