我有一些信號和我混合分別加起來一個更大的信號,其中每個信號位於不同的頻率區域。 現在,我使用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數據(是在工作的那一刻)
請問您可以發佈您的代碼嗎?這會使你的描述更加清晰,也可能代碼沒有正確地遵循你的描述。 – buzjwa
什麼wav文件你有200000的採樣率?瘋。 – dmedine
IFFT輸入的長度與您想要輸出的長度(例如1024,與放入第一個FFT的數據的長度相同)不會更短(例如16而不是1024)。如果你想要真正的結果,IFFT的輸入也必須是共軛對稱的。 – hotpaw2