簡體   English   中英

用FFT處理后的信號然后是IFFT不相同

[英]Signal after processing with FFT and then IFFT is not the same

我想對虛擬場景進行聲音模擬。 因此,我想對系統響應的脈沖響應進行卷積處理,該脈沖響應來自簡單的.wav文件,並以頻率相關的方式進行輸入。 據我了解,DSP的最佳方法是使用FFT將輸入信號轉換成其頻譜,以某種方式將脈沖響應函數應用於它並iFFT回去。

我的問題是,在對信號進行FFT之后,再進行iFFT之后,該信號與原始輸入信號不同。 在新信號中可以識別原始聲音,但是由於FFT和iFFT之后的錯誤數字,它非常“模糊”。 我把“第一”(就地,廣度優先,十取一在頻)實現從在C ++ FFT的例子http://rosettacode.org/wiki/Fast_Fourier_transform#C.2B.2B

這是FFT實現的內部代碼用法的代碼:

CArray signal = CArray(output_size);
for (int i = 0; i < format.FrameCount; ++i) {
   signal[i] = Complex((double)(is_8_bit ? sample_data_8[i] : sample_data_16[i]), 0);
}

fft(signal);
ifft(signal);

存在以下typedef

typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;

由於我是從上述網站上獲取代碼的,因此我認為該錯誤不會出現在FFT的實現范圍內。 我認為它會做的數據類型,我的輸入和/或復數的東西。

由於我的系統沒有實現“階段”,並且我讀到它們可以忽略並且仍然可以返回有用的值,因此我將虛數部分設為0來初始化復數。

我是否犯了一個基本錯誤,或者是數據類型或四舍五入之類的錯誤呢?

請測試這是否不僅是縮放錯誤。 在許多情況下(但不是全部),FFT和iFFT的實現無需除以樣本數,因此僅對於長度為N的信號

iFFT(FFT(signal))/N

返回原始signal


對於認真的轉換工作,請查找零填充和加窗。

為了獲得正確的結果,您需要2 ^ n個樣本。 如果樣本少於2 ^ n,則只需在信號末尾加零即可。 例如,信號(1,0,1,1,1)將是(1,0,1,1,1,0,0,0)。

暫無
暫無

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

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