将 fftw3 库用于 dct
Using fftw3 library for dct
我正在使用离散余弦变换测试库。
#include <fftw3.h>
void dump_vector(int n, double* vec) {
for(int i = 0; i < n; i++)
printf("%f ", vec[i]);
printf("\n");
}
int main()
{
double a[] = {0.5, 0.6, 0.7, 0.8};
double b[] = {0, 0, 0, 0};
printf("Original vector\n");
dump_vector(4, a);
fftw_plan plan = fftw_plan_r2r_1d(4, a, a, FFTW_REDFT10, FFTW_ESTIMATE);
fftw_execute(plan);
printf("DCT\n");
dump_vector(4, a);
fftw_plan plani = fftw_plan_r2r_1d(4, a, a, FFTW_REDFT10, FFTW_ESTIMATE);
fftw_execute(plani);
printf("IDCT\n");
dump_vector(4, a);
return 0;
}
我希望获得相同的 a
,或者可能是一个近似值,但我的输出如下:
Original vector
0.500000 0.600000 0.700000 0.800000
DCT
5.200000 -0.630864 0.000000 -0.044834
IDCT
9.048603 9.208347 8.182682 5.179908
见the documentation of fftw about real to real transforms
FFTW_REDFT10 computes an REDFT10 transform, i.e. a DCT-II (sometimes called “the” DCT). (Logical N=2*n, inverse is FFTW_REDFT01.)
因此,标志 FFTW_REDFT01
必须用于逆变换而不是 FFTW_REDFT10
。
此外,FFTW 不会重新缩放变换的输出。因此,输出必须除以 n
或 n*n
,其中 n
是向量的长度。 (我会在几分钟内测试它...)
编辑:比例因子既不是 n
也不是 n*n
它是 2*n
...
我正在使用离散余弦变换测试库。
#include <fftw3.h>
void dump_vector(int n, double* vec) {
for(int i = 0; i < n; i++)
printf("%f ", vec[i]);
printf("\n");
}
int main()
{
double a[] = {0.5, 0.6, 0.7, 0.8};
double b[] = {0, 0, 0, 0};
printf("Original vector\n");
dump_vector(4, a);
fftw_plan plan = fftw_plan_r2r_1d(4, a, a, FFTW_REDFT10, FFTW_ESTIMATE);
fftw_execute(plan);
printf("DCT\n");
dump_vector(4, a);
fftw_plan plani = fftw_plan_r2r_1d(4, a, a, FFTW_REDFT10, FFTW_ESTIMATE);
fftw_execute(plani);
printf("IDCT\n");
dump_vector(4, a);
return 0;
}
我希望获得相同的 a
,或者可能是一个近似值,但我的输出如下:
Original vector
0.500000 0.600000 0.700000 0.800000
DCT
5.200000 -0.630864 0.000000 -0.044834
IDCT
9.048603 9.208347 8.182682 5.179908
见the documentation of fftw about real to real transforms
FFTW_REDFT10 computes an REDFT10 transform, i.e. a DCT-II (sometimes called “the” DCT). (Logical N=2*n, inverse is FFTW_REDFT01.)
因此,标志 FFTW_REDFT01
必须用于逆变换而不是 FFTW_REDFT10
。
此外,FFTW 不会重新缩放变换的输出。因此,输出必须除以 n
或 n*n
,其中 n
是向量的长度。 (我会在几分钟内测试它...)
编辑:比例因子既不是 n
也不是 n*n
它是 2*n
...