C++ 信号经过FFT处理后与IFFT不一样

C++ 信号经过FFT处理后与IFFT不一样,c++,signal-processing,fft,convolution,C++,Signal Processing,Fft,Convolution,我想做一个虚拟场景的声音模拟。因此,我想用一个简单的.wav文件中的输入信号以频率依赖的方式将系统计算的脉冲响应卷积起来。据我所知,DSP最好的方法是使用FFT将输入信号转换为其频谱,以某种方式对其应用脉冲响应函数,然后iFFT返回 我的问题是,在对我的信号进行FFT和iFFT之后,信号与原始输入信号不同。原始声音在新信号中是可以识别的,但由于FFT和iFFT后的错误数字,原始声音非常模糊。我首先采用了第一个、第一个、十进制的频率实现例子,C++中的FFT从.< /P> 下面是我使用FFT实现的

我想做一个虚拟场景的声音模拟。因此,我想用一个简单的.wav文件中的输入信号以频率依赖的方式将系统计算的脉冲响应卷积起来。据我所知,DSP最好的方法是使用FFT将输入信号转换为其频谱,以某种方式对其应用脉冲响应函数,然后iFFT返回

我的问题是,在对我的信号进行FFT和iFFT之后,信号与原始输入信号不同。原始声音在新信号中是可以识别的,但由于FFT和iFFT后的错误数字,原始声音非常模糊。我首先采用了第一个、第一个、十进制的频率实现例子,C++中的FFT从.< /P> 下面是我使用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);
存在以下类型定义:

因为我从上面的网站上获取了代码,所以我假设错误不可能出现在FFT的实现中。我假设它与我输入的数据类型和/或复数有关

由于我的系统没有实现相位,而且我读到相位可以忽略,并且仍然可以返回一个有用的值,所以我正在初始化虚数部分为0的复数


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

要得到正确的结果,您需要有2^n个样本。如果采样数少于2^n,只需在信号末尾加零即可。例如,信号1,0,1,1,1将是1,0,1,1,0,0。

请测试这是否不仅仅是缩放错误。在许多情况下,但并非所有情况下,FFT和iFFT都是在不除以样本数的情况下实现的,因此,对于长度为N的信号而言,仅是如此

返回原始信号


对于严重的转换工作,请查看零填充和窗口。

采样率是多少?@alexm采样率是22050Hz。这只是一个快照,但要使FFT正常工作,您需要为其提供2^n个采样。在现场,您提供的第二个FFT功能对我来说无法正常工作@Logman你是说就地、广度优先、频率抽取法吗?目前,这种方法实际上为我抛出了内存分配异常;你也是这样吗?第一个分而治之的方法就是我使用的方法。对不起,我应该另外指出这一点。第一个为我编译和执行,但不知何故似乎没有给我想要的结果。我也用48Hz和2^n的样本进行了尝试,但不幸的是,两者的结果都很相似。频率抽取算法中的标准化部分在某种程度上就是问题所在。如果我插入一个2^n的样本,它会工作。我尝试再次使用原始源,执行IFFTFFSIGNAL,然后将每个样本除以signal.size,但这并没有得到正确的结果。如果我误解了/N部分,请通知我。谢谢你的条件。我会查的。是的,这似乎是正确的程序。带有或不带有除以N=信号大小的变量应一致工作。文件应说明是否允许并矢长度或一般长度。一般长度需要更大的库,如FFTW或螺旋,实现几种不同的FFT算法Bluestein、Winograd、Rader。给一个普通的Cooley-Tukey实现一个非并矢长度可能会产生奇怪的结果。
typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;
iFFT(FFT(signal))/N