我从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;
}
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;
}
我错过了什么?
答案 0 :(得分:1)
很正常。您正在进行逐帧转换。这意味着在一个时间帧之后产生FFT帧。当转换回来时,你会产生相反的效果:在 FFT帧被解码后,你的时间帧开始。