【发布时间】:2017-05-21 09:53:39
【问题描述】:
FFT 工作正常,但当我想采用 IFFT 时,我总是从其结果中看到相同的图表。结果很复杂,无论原始信号如何,图形总是相同的。
实部图是一个-sin,周期=帧大小
虚部是同周期的-cos
哪里有问题?
原始信号:
IFFT 实际值(图片仅为帧的一半):
我使用的算法 FFT。
double** FFT(double** f, int s, bool inverse) {
if (s == 1) return f;
int sH = s / 2;
double** fOdd = new double*[sH];
double** fEven = new double*[sH];
for (int i = 0; i < sH; i++) {
int j = 2 * i;
fOdd[i] = f[j];
fEven[i] = f[j + 1];
}
double** sOdd = FFT(fOdd, sH, inverse);
double** sEven = FFT(fEven, sH, inverse);
double**spectr = new double*[s];
double arg = inverse ? DoublePI / s : -DoublePI / s;
double*oBase = new double[2]{ cos(arg),sin(arg) };
double*o = new double[2]{ 1,0 };
for (int i = 0; i < sH; i++) {
double* sO1 = Mul(o, sOdd[i]);
spectr[i] = Sum(sEven[i], sO1);
spectr[i + sH] = Dif(sEven[i], sO1);
o = Mul(o, oBase);
}
return spectr;
}
【问题讨论】:
-
旁注:你的代码使用
new在堆上分配了很多对象,但是你的代码永远不会调用delete而不在对象离开作用域之前改变它们的所有权——所以你的程序会泄漏记忆。 -
@Dai,谢谢你的回答,我会尝试修复它。但现在这不是我最大的问题。
-
恕我直言,这是最大的问题。所有这些指针和
news 使代码变得不必要地难以阅读和发现像你所拥有的那样的错误 -
任何人都会认为从未发明过 STL...