从幅值、频率和相位三方面重构信号,得到fft。做完fft后,我从fft数据中提取了一些频率,并重建了时间线信号。我知道IFFT是为了这个,但是,我不想使用IFFT。重建似乎很好,但两个信号之间存在一定的时间差。这张图片显示了这个问题。黑色信号是原始信号,红色信号是重构信号。

如果我知道的话,频率的波幅为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;
}
我遗漏了什么?
发布于 2016-07-21 08:08:03
很正常。你在逐帧变换。这意味着FFT帧是在一个时间帧之后产生的。当转换回来时,你会产生相反的效果:你的时间框架是在FFT帧被解码后开始的。
https://stackoverflow.com/questions/38487680
复制相似问题