从fft重建信号

时间:2016-07-20 18:01:18

标签: c++ fft

我从fft获得的振幅,频率和相位重建信号。在我做fft之后,我从那些fft数据中挑选了一些频率并重建了时间线信号。我知道IFFT是为了这个,但我不想使用IFFT。 重建似乎很好,但两个信号之间有一段时间滞后。此图像显示此问题。黑色是原始信号,红色是重建的信号。 enter image description here

如果我知道的话,频率bin t的幅度为sqrt(real[t]*real[t] + imag[t]*imag[t],相位为atan2(imag[t], real[t])。 所以,我使用公式amplitude * cos(2*π*x / frequency + phase)作为频率仓。我总结了那些再生的波浪。据我所知,这应该产生与原始信号完整的信号拟合。但它最终总是与原始信号有一些时间滞后。

是的,我认为它是关于阶段的,但这很容易计算并且它的工作正常。如果有错误,重建的信号将不适合其原始信号的形状。

这是生成余弦波的代码。我从sin(x +π/ 2)生成余弦波。

std::vector<short> encodeSineWavePCM(
    const double frequency,
    const double amplitude,
    const double offSetPhase)
{
    const double pi = 3.1415926535897932384626;
    const int N = 44100; // 1 sec length wave
    std::vector<short> s(N);
    const double wavelength = 1.0 * N / frequency;
    const double unitlength = 2 * pi / wavelength;
    for (int i = 0; i<N; i ++) {
        double val = sin(offSetPhase + i * unitlength);
        val *= amplitude;
        s[i] = (short)val;
    }

    return s;
}

std::vector<short> encodeSineWavePCM( const double frequency, const double amplitude, const double offSetPhase) { const double pi = 3.1415926535897932384626; const int N = 44100; // 1 sec length wave std::vector<short> s(N); const double wavelength = 1.0 * N / frequency; const double unitlength = 2 * pi / wavelength; for (int i = 0; i<N; i ++) { double val = sin(offSetPhase + i * unitlength); val *= amplitude; s[i] = (short)val; } return s; }

我错过了什么?

1 个答案:

答案 0 :(得分:1)

很正常。您正在进行逐帧转换。这意味着在一个时间帧之后产生FFT帧。当转换回来时,你会产生相反的效果:在 FFT帧被解码后,你的时间帧开始