c - 将 fftw3 库用于 dct

标签 c fftw 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 不会重新缩放变换的输出。因此,输出必须除以 nn*n,其中 n 是 vector 的长度。 (我会在几分钟内测试它......)

编辑:比例因子既不是 n 也不是 n*n 它是 2*n...

关于c - 将 fftw3 库用于 dct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37530613/

相关文章:

c - 在 Visual Studio 中使用 threadprivate 指令

c - 打开不同的 Internet Explorer 窗口

c - 如何使用傅里叶变换从 WAV 文件中提取半精确频率

fft - 使用 FFTW 的零填充 FFT

c - 1D IDCT 的实现是如何工作的?

c - 为什么这个程序会出现运行时错误?

c - 带有指针的 strcmp 在 C 中不起作用

c - 使用 Eclipse 和 mingw 限制 fftw 的数组大小?

c - 黑鳍金枪鱼。使用 BF537 EZ-KIT 进行 2D DCT/IDCT(图像压缩),如何从 BF537 内存写入文件(在磁盘上)重建图像(原始像素数据)?

python - 使用 Python 的 Scipy DCT-II 进行 2D 或 ND DCT