c++ 为什么FFTW 3的DST Type-1(离散正弦变换)功能较慢?

weylhg0b  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(129)

我使用了fftw 3的FFTW_RODFT00函数,但是它非常慢(正如他们在文档.fftw3 2.5.2 Real even/odd DFTs中提到的)。

// N->Array length, input->Input Array, output->Output Array
fftw_plan plan = fftw3_r2r_1d(N, input, output, FFTW_RODFT, FFTW_ESTIMATE);

fftw_execute(plan);

//using output...

fftw_destroy_plan(plan);
fftw_cleanup();

我试着手动转换dst函数,但它是O(n^2)算法,所以它也很慢。
如何使用FFT算法计算快速离散正弦变换,而不使用DST Type-1函数?

pjngdqdw

pjngdqdw1#

我发现了一种使用FFTW3的FFT库函数计算离散正弦变换的方法。但我应该说它仍然比MATLAB dst()函数慢(我仍然不知道为什么)。让我简单地解释一下我所做的:

//x->Your first array with some values
//y->FFT input array
//z->FFT output array
//n->First array(x) size

#define REAL 0
#define IMAG 1

function_Name(){
const int n = 1000;
double x[n][2];

//Fill x with some value
for(i){
x[i][REAL]=i+1;
x[i][IMAG]=0;
}

fftw_complex y[(n+1)*2];
fftw_complex z[(n+1)*2];

y[0][REAL]=0;
y[0][IMAG]=0;

for(){
//Add x to y from 2. element(y[1])
}

y[n+1][REAL]=0;
y[n+1][IMAG]=0;

for(){
//Invert x and multiply by "-" and add to y
}

fftw_plan plan = fftw_plan_dft_1d((n+1)*2, y, z, FFTW_FORWARD, FFTW_ESTIMATE);

fftw_execute(plan);

**//You can use z but first you have to Invert (fliplr in MATLAB) it and take only first n elements and only IMAG parts.**

fftw_destroy_plan(plan);
fftw_cleanup();

}

我知道这个算法并不完美,但我正在努力加快速度,并使一个干净。对于速度差异MATLAB的fft()函数和FFTW的FFT函数仍然是一个问题。我将打开一个新的问题。

相关问题