我正在尝试让FFTW在C中工作。它曾经用于另一个项目(在JNI中),我或多或少地复制了那个代码,遗憾的是没有结果。
首先我生成一个正弦信号,如下所示:
double* generateSignal() {
int fs=44100;
double fsd = 44100.0; // fs in double format
double f1=1000.0;
int i;
double PI = 3.141592653589793238462643;
double t[fs];
double value = 0.0;
for (i = 0; i < fs; i++) {
t[i] = value;
value += 1.0/fsd;
}
double* signal = (double*) malloc(sizeof(double) * fs);
for (i = 0; i < fs; i++) {
signal[i] = sqrt(2) * sin(2 * PI * f1 * t[i]);
}
return signal;
}
这是有效的,我只是为了完整性而张贴它。
接下来,我想使用FFTW转换信号,我在以下方法中进行转换(基于FFTW documentation):
void processSignal(double* signal) {
int size = 44100;
int i;
fftw_complex* in = fftw_malloc(sizeof(fftw_complex) * size);
fftw_complex* out = fftw_malloc(sizeof(fftw_complex) * size);
for (i = 0; i < size; i++) {
double* ptr = in[i];
*ptr = signal[i]; // set first double, real part
*(ptr + 1) = 0.0; // set second double, imaginary part
}
fftw_plan p = fftw_plan_dft_1d(size, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(p);
for (i = 0; i < size; i++) {
double* ptr = out[i];
signal[i] = *ptr; // get real part
}
fftw_destroy_plan(p);
fftw_free(in);
fftw_free(out);
}
请在FFTW文档中注明:typedef double fftw_complex[2];
现在,这会导致signal
- 数组的所有值都为-0.000000。我真的看不出这个代码有什么问题,所以请指出我做错了什么?
感谢。
PS:为了清楚起见,从我的代码中删除了打印语句。
答案 0 :(得分:0)
我认为问题可能是你用前一个迭代的虚部覆盖了当前迭代的虚部。
for (i = 0; i < size; i++) {
double* ptr = in[i]; // <-- here's a problem
*ptr = signal[i]; // set first double, real part
*(ptr + 1) = 0.0; // set second double, imaginary part
}
i
在每次迭代时逐个递增,因此在第一次迭代时,ptr
指向输入复数[0]的实部,ptr + 1
指向虚数复数[0]的一部分,但在第二次迭代中,ptr
指向复数[0]的虚部,而ptr + 1
指向复数[1]的实部。 / p>
解决此问题的一些建议可能是:
for (i = 0, j = 0; i < size; i++, j+= 2) {
double* ptr = in[j]; // j increments by 2 making ptr alays point to real part
*ptr = signal[i]; // set first double, real part
*(ptr + 1) = 0.0; // set second double, imaginary part
}
或
double* ptr = in[0]
for (i = 0; i < size; i++) {
*ptr++ = signal[i]; // set first double, real part
*ptr++ = 0.0; // set second double, imaginary part
}
答案 1 :(得分:0)
天哪,这太愚蠢了。
值的大小如-2.0E-9。结果四舍五入,因此打印-0.00000。
非常感谢弗雷德。他的问题是“你的预期产量是多少?”让我好好看看我之前提到的JNI项目的输出,并意识到我的错误。
还要感谢其他答案!