【问题标题】:reconstruct signal from fft从 fft 重建信号
【发布时间】:2016-11-24 01:39:36
【问题描述】:

我从 fft 获得的幅度、频率和相位重构信号。在我做 fft 之后,我从这些 fft 数据中挑选了它的一些频率和重构的时间线信号。我知道 IFFT 是为此,但我不想使用 IFFT。 重建似乎很好,但两个信号之间存在一些时间滞后。这张图片显示了这个问题。黑色的是原始信号,红色的是重建的信号。

如果我知道正确,频率 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;
}

我错过了什么?

【问题讨论】:

  • 没有必要重新发布您的问题,您应该编辑您的原始问题以保留讨论。
  • “我知道 IFFT 是为此而生的”——它是 only 的转换,它可以让你回到原来的状态。但为什么不合理地不喜欢 IFFT?
  • 用于测试目的。这是声音信号,我试图从原始信号的主要频率中恢复原始声音。如果我同时播放每个频率,它是否必须发出相同的声音?
  • 对不起,我不明白最后一句话。 “频率”与一个正弦波相关,它没有在时间上定位,所以你不能真正谈论“同一时间”。
  • 是的,你说得对。我只是想模拟“同时”的声音播放环境。将每个频率变成声音信号并立即播放。这就是我的意思。

标签: c++ fft


【解决方案1】:

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

【讨论】:

  • 这似乎是正确的。重建的信号图在其原始信号之后拟合。但这越来越令人困惑。 :(
  • 您能解释一下为什么会这样吗?据我了解,傅里叶级数只是将信号输入到其频域。时间范围如何?
  • 不要混淆。傅里叶级数是相关的,而不是 FFT。傅里叶级数是在任何时刻定义的周期信号的数学结构。你非常有一个离散的信号,FFT 就可以解决这个问题。也就是说,您的输入声音有多大(以样本为单位),您将多少样本传递给 FFT?它们可能不一样。
猜你喜欢
  • 2020-05-29
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2011-07-01
  • 2023-03-21
  • 2011-08-15
相关资源
最近更新 更多