DCT和IDCT原始公式计算

代码转自:https://my.oschina.net/VenusV/blog/1797459


#include 

#define WIDTH 5
#define HEIGHT 5

struct Complex_{
    double real;//实部
    double imagin;//虚部
};
typedef struct Complex_ DFT_Complex;

#define VALUE_MAX 255
#define M_PI 3.1415926535897932

int Initdata(double (*src)[WIDTH],int size_w,int size_h){
    srand((int)time(0));
    for(int i=0;i=0)
                printf("%lf+%lfj ",real,imagin);
            else
                printf("%lf%lfj ",real,imagin);
        }
        printf(";\n");
    }
    return 0;
}

//2维逆傅里叶变换函数
int IDFT2D(DFT_Complex (*src)[WIDTH],DFT_Complex (*dst)[WIDTH],int size_w,int size_h){
    for(int i=0;i=0)
                printf("%lf+%lfj ",dst[i][j].real,dst[i][j].imagin);
            else
                printf("%lf%lfj ",dst[i][j].real,dst[i][j].imagin);
        }
        printf(";\n");
    }
    return 0;
}


int _tmain(int argc, _TCHAR* argv[])
{
	double src[WIDTH][HEIGHT];
    DFT_Complex dst[WIDTH][HEIGHT];
    DFT_Complex dst_[WIDTH][HEIGHT];
    Initdata(src, WIDTH, HEIGHT);
    printf("\n\n");
    DFT2D(src,dst,WIDTH,HEIGHT);
    printf("\n\n");
    IDFT2D(dst,dst_,WIDTH,HEIGHT);

	system("pause");
	return 0;
}

DCT和IDCT原始公式计算_第1张图片
对应DCT和IDCT公式可和代码一一对应。
也就是原始图像仅仅是实数,DCT后变为同样大小的复数。
IDCT输入复数,输出也是复数,但是实际虚部都为0
如果要滤波的话就是在DCT后的复数直接和滤波器相乘。

你可能感兴趣的:(傅里叶)