簡體   English   中英

FFT和IFFT的長度

[英]Length of FFT and IFFT

我有一些信號,我加上一個更大的信號,每個信號位於不同的頻率區域。 現在,我使用FFTW對大信號執行FFT運算,並切斷具體的FFT分檔(信號所在的位置)。

例如:大信號用1024點FFT變換,信號的采樣率為fs=200000

我通過以下方式計算給定開始和停止頻率的混凝土箱位置:

tIndex.iStartPos = (int64_t) ((tFreqs.i64fstart) / (mSampleRate / uFFTLen));

例如,我得到第一個信號被切掉16個箱子。 現在我再次使用FFTW進行IFFT轉換並獲得16個復數值(因為我保留了16個二進制數的向量)。

但是當我在MATLAB中將提取的信號與原始的小信號進行比較時,我可以看到原始信號(是一個wav-File)有xxxxx數據而我的信號(我保存為原始二進制文件)只有16個復數值。

那么如何獲得正確轉換的IFFT操作的長度呢? 這有什么不對?

編輯邏輯本身分為3個程序,每個行都處於多線程環境中。 出於這個原因,我在這里發布了一些偽代碼:

ReadWavFile(); //returns the signal data and the RIFF/FMT header information
CalculateFFT_using_CUFFTW(); //calculates FFT with user given parameters, like FFT length, polyphase factor, and applies polyphased window to reduce leakage effect
GetFFTData(); //copy/get FFT data from CUDA device
SendDataToSignalDetector(); //detects signals and returns center frequency and bandwith for each sigal
Freq2Index(); // calculates positions with the returned data from the signal detector
CutConcreteBins(position);
AddPaddingZeroToConcreteBins(); // adds zeros till next power of 2
ApplyPolyphaseAndWindow(); //appends the signal itself polyphase-factor times and applies polyphased window
PerformIFFT_using_FFTW();
NormalizeFFTData();
Save2BinaryFile();

- >然后在MATLAB中分析數據(目前在工作中)。

如果您有一個由1024個樣本組成的實信號,則可以通過將頻譜乘以矩形窗口然后采用IFFT來獲得16個感興趣頻率區間的貢獻。 這基本上相當於:

  1. 在感興趣的頻率倉之前和之后用零填充緩沖器
  2. 在該緩沖區中的相同位置復制感興趣的頻率倉
  3. 如果使用全譜表示(如果你使用fftw_plan_dft_1d(..., FFTW_BACKWARD,...用於逆變換),計算頻譜上半部分的Hermitian對稱性(或者簡單地使用半頻譜表示和通過fftw_plan_dft_c2r_1d執行逆變換。

也就是說,通過使用專門設計的濾波器而不是僅使用頻域中的矩形窗口,您將獲得更好的頻率分解。

FT的輸出長度等於輸入長度。 我不知道你怎么到16箱; 1024輸入的FT是1024個箱。 現在對於一個真正的輸入(不復雜),1024個區域將在512/513左右鏡像相同,因此您的FFT庫可能僅返回實際輸入的低512個區間。 不過,這還不止16個箱子。

在進行IFFT時,您可能需要填充所有1024個二進制位,因為它通常不會假設其輸出將成為真實信號。 但那只是反映了較低512個分檔的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM