C语言DCT图像,任意长度DCT变换C语言实现方法
我是在Matlab上找到灵感
先去网站
http://www.fftw.org/
下载
然后调用实现fftw以及ifftw
然后在Matlab里面找到dct 以及idct的文件
把那几行Matlab改成c语言就行了
DCT变换代码:
// AnyLengFDCT.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "fftw3.h"//引用库文件
#include
#define PI 3.1415926
static double *as = NULL;
static double *ax = NULL;
static fftw_complex *in, *out;
static int n = 4;
void InitData();
void dft(int dn);
void fft_dct(double *a, int dn);
int _tmain(int argc, _TCHAR* argv[])
{
double a[4] = {1, 2, 3, 4};
InitData();
dft(n);
fft_dct(a, n);
return 0;
}
void InitData(){
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * 2*n); //FFT变换前数据
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * 2*n);//FFT变换后数据
as = (double*)malloc(n*sizeof(double));
ax = (double*)malloc(n*sizeof(double));
}
//*******************************************************************
//方法名称:dft
//说明:对所变幻的数据的长度进行DFT,因为每次变换的数据长度一致,所以单独拿出来,防止重复计算
//日期:2012.4.19
//参数说明:
//as: DFT变换后数据的实数
//ax:DFT变换后数据的虚部
//dn:DFT变换数据的个数
//*******************************************************************
void dft(int dn){
int i;
double x = 0.0;
double y;
//Compute weights to multiply DFT coefficients
for(i = 0; i < dn; i++){
y = -i*PI/(2*dn);
as[i] = exp(x)*cos(y)/sqrt(2.0*dn);
ax[i] = exp(x)*sin(y)/sqrt(2.0*dn);
}
as[0] = as[0]/sqrt(2.0);
for(i = 0; i < dn; i++){
printf("%f, %f\n", as[i], ax[i]);
}
}
//*******************************************************************
//方法名称:fft_dct
//说明:任意长度的快速DCT变换
//日期:2012.4.19
//参数说明:
//a: 数据
//dn:变换数据的大小
//*******************************************************************
void fft_dct(double *a, int dn){
int l;
int j;
int k;
fftw_plan p;
if(dn%2 == 1){
//奇数的DCT变换
for(l = 0; l < dn; l++){
in[l][0] = a[l];
in[dn+l][0] = a[dn-1-l];
}
p=fftw_plan_dft_1d(2*dn,in,out, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(p); /* repeat as needed*/
}else{
//偶数的DCT变换
for(l = 0; l < dn; l++){
as[l] = as[l]*2;
ax[l] = ax[l]*2;
//printf("%f, %f\n", as[i], ax[i]);
}
for(l = 0, j = 0,k = dn-1; l < dn; l++){
if(l%2){
in[k][0] = a[l];
--k;
}else{
in[j][0] = a[l];
++j;
}
}
p=fftw_plan_dft_1d(dn,in,out, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(p); /* repeat as needed*/
}
for(l = 0; l < dn; l++){
a[l] = as[l]*out[l][0] - ax[l]*out[l][1];
//printf("%f\n", a[l]);
}
fftw_destroy_plan(p);
fftw_free(in);
fftw_free(out);
free(as);
free(ax);
}
反DCT变换:
// AnyLengFIDCT.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "fftw3.h"//引用库文件
#include
#define PI 3.1415926
//static double *ias = NULL;
//static double *iax = NULL;
//static fftw_complex *in, *out;
//static int n = 6;
//void InitData();
//void idft(int dn);
//void ifft_idct(double *a, int dn);
void idft(int dn, double *ias, double *iax);
void ifft_idct(int dn, fftw_plan p, double *a, double *data, double *ias, double *iax, fftw_complex *in, fftw_complex *out);
int _tmain(int argc, _TCHAR* argv[])
{
int n = 6;
//double a[5] = {6.708204, -3.1495, 0, -0.283990, 0};
double a[6] = {8.573214, -4.162562, 0, -0.408248, 0, -0.080079};
double *ias = (double*)malloc(n*sizeof(double));
double *iax = (double*)malloc(n*sizeof(double));
double *data = (double*)malloc(n*sizeof(double));
fftw_plan p = NULL;
fftw_complex *in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * 2*n); //IFFT变换前数据
fftw_complex *out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * 2*n);//IFFT变换后数据
idft(n, ias, iax);
ifft_idct(n, p, a, data, ias, iax, in, out);
for(int i = 0; i < n; i++)
printf("%d %f\n", i+1, data[i]);
return 0;
}
//*******************************************************************
//方法名称:idft
//说明:对所变幻的数据的长度进行IDFT,因为每次变换的数据长度一致,所以单独拿出来,防止重复计算
//日期:2012.4.19
//参数说明:
//as: DFT变换后数据的实数
//ax:DFT变换后数据的虚部
//dn:DFT变换数据的个数
//*******************************************************************
void idft(int dn, double *ias, double *iax){
int i;
double x = 0.0;
double y;
//Compute weights to multiply IDFT coefficients
for(i = 0; i < dn; i++){
y = i*PI/(2*dn);
ias[i] = exp(x)*cos(y)*sqrt(2.0*dn);
iax[i] = exp(x)*sin(y)*sqrt(2.0*dn);
}
// for(i =0; i < dn; i++){
// printf("%f, %f\n", ias[i], iax[i]);
// }
}
//*******************************************************************
//方法名称:fft_dct
//说明:任意长度的快速IDCT变换
//日期:2012.4.19
//参数说明:
//a: 数据
//dn:变换数据的大小
//*******************************************************************
void ifft_idct(int dn, fftw_plan p, double *a, double *data, double *ias, double *iax, fftw_complex *in, fftw_complex *out){
int l;
int j;
int k;
double ias_0;
if(dn%2 == 1){
//奇数的DCT变换
ias_0 = ias[0] * sqrt(2.0);
in[0][0] = ias_0*a[0];
in[0][1] = iax[0]*a[0];
for(l = 1; l < dn; l++){
in[l][0] = ias[l]*a[l];
in[l][1] = iax[l]*a[l];
//printf("1==%f, 2==%f\n", in[l][0], in[l][1]);
in[dn+l][0] = iax[l]*a[dn-l];
in[dn+l][1] = -ias[l]*a[dn-l];
//printf("a==%f, b==%f\n", in[dn+l][0], in[dn+l][1]);
}
p=fftw_plan_dft_1d(2*dn,in,out, FFTW_BACKWARD, FFTW_ESTIMATE);
fftw_execute(p); /* repeat as needed*/
for(l = 0; l < dn; l++){
data[l] = out[l][0] / dn/2;
//out[l][1] = out[l][1] / dn;
//data[l] = out[l][0];
//printf("data == %f\n", data[l]);
}
}else{
//偶数的DCT变换
ias_0 = ias[0] / sqrt(2.0);
in[0][0] = ias_0*a[0];
in[0][1] = iax[0]*a[0];
for(l = 1; l < dn; l++){
in[l][0] = ias[l]*a[l];
in[l][1] = iax[l]*a[l];
//printf("%f, %f\n", in[l][0], in[l][1]);
}
p=fftw_plan_dft_1d(dn,in,out, FFTW_BACKWARD, FFTW_ESTIMATE);
fftw_execute(p); /* repeat as needed*/
for(l = 0; l < dn; l++){
out[l][0] = out[l][0] / dn;
out[l][1] = out[l][1] / dn;
//printf("out == %f\n", out[l][0]);
}
for(l = 0, j = 0, k = dn-1; l < dn; l++){
if(l%2){
data[l] = out[k][0];
k--;
}else{
data[l] = out[j][0];
++j;
}
//printf("data == %f\n", data[l]);
}
}
}
注:记得下载FFTW以及IFFTW
C语言DCT图像,任意长度DCT变换C语言实现方法相关推荐
- c语言strcpy两字符串长度不同,(C语言)自己写字符串操作函数(一)——strlen/strcpy/strcat/strcmp/st...
看到很多面试都会要求你写一些简单的字符串操作函数,这些函数看起来挺简单的,但是自己写的时候就会发现不少的问题.所以我自己把大部分的字符串操作函数都写了一遍,然后用了个测试程序来测试自己写的函数与库函数 ...
- c语言万年历计算任意年的天数,C语言万年历.doc
C语言万年历 C 语 言 课 程 设 计 报 告 设计题目:学生姓名:学生学号:专业班级:学院名称:同组人姓名:指导老师:姚 兰 年 月 日 1 需求分析 问题描述输入数据要求 /*如果给定的日期中年 ...
- c语言bmp图像均衡化,浅谈应用C语言实现图象灰度的均衡化问题
摘要通过对灰度直方图进行修正的理论.建模.算法和程序的论述,说明如何实现图象的灰度直方图均衡化,达到图象增强的目的. [关键词]均衡化 灰度 图象增强技术 图象的灰度直方图均衡化是图象增强技术的一种, ...
- dct余弦离散c语言,离散余弦变换C语言实现(DCT)
离散余弦变换 实现了一维DCT.二维DCT及其反变换 void initDCTParam(int deg) { // deg 为DCT变换数据长度的幂 if(bHasInit) { return; / ...
- 常见的变换总结与代码:DCT,STFT,K-L变换等
文章目录 前言 一.从DFT到DCT 二.从CTFT到STFT 三.K-L变换与降维思想 四.K-L变换实例:人脸识别(含代码和详细注释) 五.参考资料 前言 之前学信号和DSP的时候,除了常见的 ...
- 【图像压缩】DCT图像无损压缩【含GUI Matlab源码 726期】
⛄一.DCT图像无损压缩简介 1 图像压缩 图像压缩按照压缩过程中是否有信息的损失以及解压后与原始图像是否有误差可以分为无损压缩和有损压缩两大类.无损压缩是指不损失图像质量的压缩,它是对文件的存储方式 ...
- MATLAB中 DCT变换、DCT反变换、分块DCT变换
DCT变换.DCT反变换.分块DCT变换 欢迎转载,但请注明出处!转:http://www.tuicool.com/articles/nUfmAf2 一.引言 DCT变换的全称是离散余弦变换(Disc ...
- dct变换可以用什么方法代替_「dct变换」DCT变换自学笔记 - seo实验室
dct变换 一.DCT简介 此处,DCT指Discrete Cosine Transform,意思是离散余弦变换(下文均用DCT表示),其常见用途是对音视频进行数据压缩.维基百科上的解释:DCT以不同 ...
- 【DCT笔记】DCT变换、DCT反变换、分块DCT变换
DCT变换.DCT反变换.分块DCT变换 欢迎转载,但请注明出处! 一.引言 DCT变换的全称是离散余弦变换(Discrete Cosine Transform),主要用于将数据或图像的压缩,能够将空 ...
- matlab dct反变换,MATLAB中 DCT变换、DCT反变换、分块DCT变换
DCT变换.DCT反变换.分块DCT变换 欢迎转载,但请注明出处!转:http://www.tuicool.com/articles/nUfmAf2 一.引言 DCT变换的全称是离散余弦变换(Disc ...
最新文章
- failed to load external entity file:/C:/Users/fmm/.AndroidStudio3.4/config/options/updates.xml
- 【Python】Label组件 Button组件 Checkbutton组件
- banana pi 板上跑树莓派镜像
- python教程:dict字典常用方法总结,数据解构(解包)
- 手机用鸿蒙,魅族“很聪明”:宣布加入鸿蒙,让大家以为手机用鸿蒙,其实不是...
- 【PyTorch】lr_scheduler.StepLR==>调整学习率的方法
- My in 2007
- 13数据库表空间回收
- linux下printf函数为什么不加\n就不能输出相关的内容 ?
- java jdbc 连接mysql 数据库
- 【综合实训】图书管理系统——详细设计说明书
- 投入产出表matlab,投入产出分析投入产出表.doc
- 为什么OSPF在广播网络里面,DD和LSR采用单播,而LSU hello采用组播。
- Kafka教程(一)基础入门:基本概念、安装部署、运维监控、命令行使用
- ftp服务器怎么添加文件夹,批量建立文件夹,为Serv_U批量创建用户
- (转)使用Wireshark抓包软件提示The NPF driver isn’t running解决办法
- 计算机大赛提交文件自制,【获奖分享】第十九届全国电脑制作大赛获奖心得
- $.ajax的各个参数
- css transition left 不起作用
- php获取目录下所有文件及目录(多种方法)
热门文章
- leetcode电话号码java_【LeetCode(Java) - 379】电话目录管理系统
- 常见随机变量的数学期望和方差
- MacOS工程替换MainMenu.xib
- 如何防止网站静态文件被挂马
- Base64的Woff2字体信息如何转成成文件
- Python实现远程控制桌面功能(不使用微信等任何接口),并在不同局域网下控制(已更新)
- oracle adpatch 回退,Oracle EBS使用adpatch工具打patch过程【Z】 - huak
- html的表格怎么设置样式,html 静态表格样式的设置
- 数据统计分析——常用统计检验方法
- 全新天狼星网络验证系统源码+功能强大