使用fftw3库进行dct

3

我正在测试该库,只是使用离散余弦变换。

#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

2
看起来在两种情况下您都执行了正向变换,而不是反向变换。如果我正确地阅读了文档,第二种情况需要使用REDFT01 - Eugene Sh.
是的,我编辑了它。谢谢。 - FacundoGFlores
2
好的,不要编辑,因为答案是关于原始内容的。但无论如何,现在看起来似乎缩放的问题(我看到的因子是8)。 - Eugene Sh.
1个回答

2

查看fftw关于实数到实数转换的文档

FFTW_REDFT10计算一个REDFT10变换,即DCT-II(有时称为“the” DCT)。 (逻辑N = 2 * n,逆为FFTW_REDFT01。)

因此,在逆变换中必须使用标志FFTW_REDFT01而不是FFTW_REDFT10

此外,FFTW不会重新缩放变换的输出。因此,输出必须除以向量长度nn*n。(我将在几分钟内测试它...)

编辑:缩放因子既不是n也不是n*n,而是2*n...


谢谢,我忘记改变标志了。你关于缩放因子的答案是正确的! - FacundoGFlores

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接