用FFT处理后的信号然后IFFT不一样

时间:2015-09-04 22:54:23

标签: c++ signal-processing fft convolution

我想对虚拟场景进行声音模拟。因此,我想用一个简单的.wav文件的输入信号以频率相关的方式卷积我的系统计算的脉冲响应。据我了解DSP,最好的方法是使用FFT将输入信号转换为其频谱,以某种方式将脉冲响应函数应用于它并将其反馈回来。

我的问题是,在对我的信号进行FFT和之后的iFFT之后,信号与原始输入信号不同。原始声音在新信号中是可识别的,但由于FFT和iFFT之后的错误数字,它非常“模糊”。我从http://rosettacode.org/wiki/Fast_Fourier_transform#C.2B.2B获取了C ++中FFT的“第一个”(就地,广度优先,频率抽取)实现示例。

以下是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的虚部初始化复数。

我是否犯了一个根本性的错误,或者是数据类型或舍入不应该出现的错误?

2 个答案:

答案 0 :(得分:0)

请测试这不仅是缩放错误。在许多情况下(但不是全部),FFT和iFFT的实现没有除以样本号,因此对于长度为N的信号,只有

iFFT(FFT(signal))/N

返回原始signal

对于严肃的转型工作,请查找零填充和窗口。

答案 1 :(得分:-1)

要获得正确的结果,您需要有2 ^ n个样本。如果您的样本少于2 ^ n,则只需在信号末尾添加零。例如,信号(1,0,1,1,1)将是(1,0,1,1,1,0,0,0)。