【发布时间】: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?
-
用于测试目的。这是声音信号,我试图从原始信号的主要频率中恢复原始声音。如果我同时播放每个频率,它是否必须发出相同的声音?
-
对不起,我不明白最后一句话。 “频率”与一个正弦波相关,它没有在时间上定位,所以你不能真正谈论“同一时间”。
-
是的,你说得对。我只是想模拟“同时”的声音播放环境。将每个频率变成声音信号并立即播放。这就是我的意思。