gpt4 book ai didi

c - FFTW 结果为零

转载 作者:太空宇宙 更新时间:2023-11-04 04:55:06 24 4
gpt4 key购买 nike

我正试图让 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:为了清楚起见,我的代码中删除了打印语句。

最佳答案

我认为问题可能在于您用当前迭代的实部覆盖了上一次迭代的虚部。

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]的实部。

解决此问题的一些建议可能是:

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
}

关于c - FFTW 结果为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9536124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com