2015-08-25 85 views
1

我目前正在嘗試在我的cortex m3 PSoC 5lp芯片上使用ARM CMSIS DSP庫。
我遇到了一些使用某些功能的問題,我對使用函數arm_cfft_q15(或任何arm_cfft_***函數)有疑問。ARM CMSIS DSP fft功能的正確FFT長度

說我有

q15_t ADC_samples[1024]; 
    q15_t MAG_of_fft[1024]; 

,我跑

arm_cfft_q15(1024pt_fft, ADC_samples, sample_length); 

這樣做的變換 '到位'。現在正因爲如此,由於FFT返回了實數值和虛數值,實際上它只能返回 長度爲fft的512或1024個FFT採樣中的512個? 獲得FFT後,我做

arm_cmplx_mag_q15(ADC_samples, MAG_of_fft, fftlength); 

其中fftlength是1024

這將返回MAG_of_fft,當我繪製它,它確實似乎是,我期待看到形狀,但我不因爲我不知道FFT的確切時間,所以知道如何解釋結果。我告訴它我正在做一個1024pt FFT,但它似乎只返回一個512pt FFT,或者只有一個1024pt FFT的一半,其中一個或另一個。

那麼我是否正確?這意味着ADC_samples數組必須是其中數據的兩倍,才能獲得1024點FFT?然後我可以通過告訴它FFT的長度是1024來計算使用該2048陣列的FFT的大小?

有人可以向我解釋如何正確解釋這些函數和我應該期望什麼長度的FFT?

回答

1

arm_cfft功能家族對複數值信號進行操作。換句話說,使用arm_cfft_q15執行的1024點FFT需要1024個複數輸入採樣,其由2048個值(交織的實部和虛部,如CMSIS DSP Software Library documentation中所述)表示。返回時,緩衝區包含與複雜輸入信號的頻域表示相對應的1024個複數值(2048 q15_t值)。

所以適應this example到你的情況,你會計算與FFT:

q15_t ADC_samples[2048]; 
arm_cfft_q15(1024pt_fft, ADC_samples, 0, 1); 

的後續調用

q15_t MAG_of_fft[1024]; 
arm_cmplx_mag_q15(ADC_samples, MAG_of_fft, fftlength); 

fftlength=1024則減少ADC_samples 1024個複數值(2048 q15_t值)到1024個實際幅度值(1024 q15_t值),並將結果存儲在MAG_of_fft中。

由於作爲邊注,如果你在實際上處理實值信號,則可以使用相同的功能和填充ADC_samples緩衝器的每一個第二索引(虛部)用零(因此使用ADC_samples緩衝區是實際樣品實際數量的兩倍)。或者,您可以使用更高效的arm_rfft系列功能(在this section of the documentation中描述)。

+0

請注意,我故意避免通過過多地使用'arm_rfft'來避免複雜化,這似乎不是您問題的對象(如果需要,我可以在單獨的問題中詳細說明)。 – SleuthEye

+0

好的,我認爲這清除了我對數組輸入函數大小的困惑。我還會研究arm_rfft家族,如果我有任何疑問,我肯定會問他們。謝謝。 – scarlso9