2015-04-30 189 views
3

我有一些信號和我混合分別加起來一個更大的信號,其中每個信號位於不同的頻率區域。 現在,我使用FFTW對大信號執行FFT操作,並將具體的FFT分檔(信號所在的位置)切出。FFT和IFFT的長度

E.g.大信號FFT變換與1024點 的信號的採樣速率爲fs = 200000

我計算以下面的方式給定的開始停止頻率的水泥貯存箱的位置:

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

和例如我得到的第一個信號被削減16箱。 現在我再次用FFTW進行ifft變換,並返回16個複數值(因爲我保留了16個bin的矢量)。但是,當我將提取的信號與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數據(是在工作的那一刻)

+0

請問您可以發佈您的代碼嗎?這會使你的描述更加清晰,也可能代碼沒有正確地遵循你的描述。 – buzjwa

+1

什麼wav文件你有200000的採樣率?瘋。 – dmedine

+2

IFFT輸入的長度與您想要輸出的長度(例如1024,與放入第一個FFT的數據的長度相同)不會更短(例如16而不是1024)。如果你想要真正的結果,IFFT的輸入也必須是共軛對稱的。 – hotpaw2

回答

2

如果您有一個由1024個樣本組成的實際信號,則可以通過將頻譜乘以矩形窗口,然後採用IFFT來獲得來自所關注的16個頻率倉的貢獻。這基本上相當於:

  1. 用零填充的緩衝液之前和之後的興趣
  2. 頻率區間在該緩衝器
  3. 如果使用全頻譜表示的相同位置複製感興趣的頻率倉(如果您使用fftw_plan_dft_1d(..., FFTW_BACKWARD,...進行逆變換),計算譜上半部分的厄米對稱性(或簡單地使用半譜表示並通過fftw_plan_dft_c2r_1d執行逆變換)。

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

+0

我的理解正確: 創建一個零初始化的複數緩衝區(我使用的信號很複雜)與全尺寸的FFT長度相同,然後將混凝土箱複製到原始緩衝區中的位置。 對於窗口我可以根據用戶請求DPSS或Kaiser使用多相濾波器組技術(https://casper.berkeley.edu/wiki/The_Polyphase_Filter_Bank_Technique) –

+0

如果您已經隔離感興趣的頻率內容(通過顯着減少其他頻率點),那麼就沒有必要去掉那些垃圾箱了。具有正確參數的多相濾波器組可以爲您做到這一點。 – SleuthEye

1

的FT的輸出長度等於輸入長度。我不知道你是如何得到16箱; 1024個輸入的FT是1024個分檔。現在對於一個真正的輸入(不是複雜的),1024個分檔在512/513左右是相同的,所以你的FFT庫可能只返回512個分檔,用於實際輸入。但是,這超過了16個垃圾箱。

您可能需要在執行IFFT時填充所有1024個分檔,因爲它通常不會假設其輸出將成爲實際信號。但那只是一個反映較低512個垃圾箱的問題。

+0

這16個箱子是我從全尺寸光譜中切割/提取的混凝土箱子,以獲得檢測到的信號。但是,感謝提供緩衝區填充fft長度的提示 –