gpt4 book ai didi

c++ - 从 fft 重建信号

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:12:39 25 4
gpt4 key购买 nike

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

如果我没记错的话,频率仓 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
    
      encodeSineWavePCM(
     
常量双频,
常量双振幅,
const double offSetPhase)
{
const 双圆周率 = 3.1415926535897932384626;
常量 N = 44100;//1 秒长波
std::vector<短> s(N);
const 双倍波长 = 1.0 * N/频率;
const double unitlength = 2 * pi/波长;
对于 (int i = 0; i double val = sin(offSetPhase + i * unilitength);
val *= 振幅;
s[i] =(短)val;
}

返回 s;
}

我错过了什么?

最佳答案

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

关于c++ - 从 fft 重建信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38487680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com