- Takuya Ooura: General Purpose FFT Package, http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html. Free C & FORTRAN libraries for computing fast DCTs (types II-III) in one, two or three dimensions, power of 2 sizes.
百度云分享:http://pan.baidu.com/s/1mgW0bo8 密码:fqj1
本人因需要,只测试使用了其中的一维DCT和IDCT功能。
此开源库中,使用的是DCT-II和DCT-III公式分别做的DCT正反变换,只支持处理2的整数次幂长度的数据。
无论正变换还是反变换是结果没有归一化,如下:
归一化后的结果:
下面附上测试代码:
#include "stdio.h" #include "math.h" #define NMAX 1024 #define NMAXSQRT 32 #define DATA_LENGTH 8 void ddct(int, int, double *, int *, double *); // 很明显,处理结果没有归一化,需要除以根号下信号长度的一半。 void main() { double a[NMAX]; int ip[NMAXSQRT]; double w[NMAX * 5 / 4 - 1]; ip[0] = 0; printf("\n原始数据\n"); for (int i = 0; i < DATA_LENGTH; i++) { a[i] = (i+1) % 5; printf("%10.5f\t", a[i]); } ddct(DATA_LENGTH, -1, a, ip, w); //dct变换 // 正变换归一化 for (int i = 0; i < DATA_LENGTH; i++) { a[i] = a[i] / (sqrt(DATA_LENGTH*0.5)); } a[0] = a[0] / 2; printf("\nDCT结果:\n"); for (int i = 0; i < DATA_LENGTH;i++) printf("%10.5f\t", a[i]); ddct(DATA_LENGTH, 1, a, ip, w); //dct反变换 // 反变换归一化 for (int i = 0; i < DATA_LENGTH; i++) { a[i] = a[i] / (sqrt(DATA_LENGTH*0.5)); } printf("\nIDCT结果:\n"); for (int i = 0; i < DATA_LENGTH; i++) printf("%10.5f\t", a[i]); getchar(); }