2012-05-25 77 views
2

我正在開發8位Atmega32的頻譜分析儀,輸出到LCD顯示器上。 最大采樣頻率爲40kHz,最大頻率爲20kHz,符合fs> 2B。 目前,我在內部生成一個信號,然後將FFT應用於此信號並查看LCD上的頻譜。FFT箱寬度澄清

請注意,這是用僞代碼:

#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個箱,每個代表爲1Hz。因此,我的頻譜目前代表的最高頻率(我測試過) - 32Hz。 如何增加這些箱的「頻率寬度」,使每個箱代表625Hz? 請記住,我無法將FFT_N的大小增加到64〜128之間,因爲我有內存限制。

回答

6

每個倉(赫茲)的寬度取決於兩件事情:採樣速率,Fs(赫茲)和FFT bin的數目,N:

bin_width = Fs/N; 

因此,如果你在Fs = 40 kHz採樣和你有N = 64倉在你的FFT中,每個bin的寬度將是625 Hz。感興趣的箱將是那些從0到N/2 - 1:

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

因爲我沒有對這個信號進行採樣,所以我在內部產生它,這會受到影響? – Ospho

+0

當你在內部產生一個信號時,你仍然可以有一個名義採樣率,但當然這可以是任何你喜歡的。但是,如果您想隨時播放此信號,那麼採樣率將是您DAC的採樣率。 –

+0

對不起還有一個簡單的問題,是否對信號緩衝區SIG_N需要在40kHz採樣時有多大限制? – Ospho

0
int twelveZeroNine = (int)(1209.0*halfFourierSize/halfSampleFrequency); 
    int thirteenThirtySix = (int)(1336.0*halfFourierSize/halfSampleFrequency); 
    int fourteenSeventySeven = (int)(1477.0*halfFourierSize/halfSampleFrequency); 

在我的DTMF節目,我定位感興趣的垃圾箱這樣^,但爲什麼有必要使用半採樣頻率和傅立葉變換的一半大小來定位它們?

2

翻譯保羅的例子範圍:

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箱在零基於陣列。), 接收從「負」的頻率的貢獻。

這與FFT(或任何複雜的離散傅里葉變換)的週期性一致。