一、DCT的概念
1. DCT算法

DCT变换的全称是离散余弦变换 Discrete Cosine transform),离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变换是对一个实偶函数进行的通过数字信号处理的学习我们知道实函数的傅立叶变换获得的频谱大多是复数,而偶函数的傅立叶变换结果是实函数。以此为基础,使信号函数成为偶函数,去掉频谱数的虚部,是余弦变换的特点之一。

2. DCT变换的形式:一维和二维

一维DCT变换是二维DCT变换的基础,一维DCT变换分为8种,其中第二种由于运算简单、适用范围广,所以经常使用第二种,公式如下:
F(u)=c(u)∑i=0N−1f(i)cos[(i+0.5)πNu]F(u)=c(u) \sum \limits_{i=0}^{N-1}f(i)cos[\frac{(i+0.5)π}{N}u]F(u)=c(u)i=0∑N−1​f(i)cos[N(i+0.5)π​u]
c(u)={1N,u=02N,u!=0c(u)=\begin{cases}\sqrt\frac{1}{N},& \text{u=0}\\\sqrt\frac{2}{N},& \text{u!=0} \end{cases}c(u)=⎩⎨⎧​N1​​,N2​​,​u=0u!=0​

二维DCT变换就是在一维的基础上再进行一次DCT变换,公式如下:
F(u,v)=c(u)c(v)∑i=0N−1∑j=0N−1f(i,j)cos[(i+0.5)πNu]cos[(j+0.5)πNv]F(u,v)=c(u)c(v) \sum \limits_{i=0}^{N-1} \sum \limits_{j=0}^{N-1}f(i,j)cos[\frac{(i+0.5)π}{N}u]cos[\frac{(j+0.5)π}{N}v]F(u,v)=c(u)c(v)i=0∑N−1​j=0∑N−1​f(i,j)cos[N(i+0.5)π​u]cos[N(j+0.5)π​v]
c(u)={1N,u=02N,u!=0​c(u)=\begin{cases}\sqrt\frac{1}{N},& \text{u=0}\\\sqrt\frac{2}{N},& \text{u!=0} \end{cases}​c(u)=⎩⎨⎧​N1​​,N2​​,​u=0u!=0​​

二、C语言实现DCT

在使用DCT变换时,数据要能构成方阵,在实际应用中对不是方阵的数据都是先补齐再进行变换。

1. 参数及函数语句说明
参数、函数类型 参数意义
int DCT_SIZE 规定输入阵的维数
void TransMat() 求变换矩阵
void DCT() 设A为变换矩阵,I为输入矩阵,即完成AIA’的过程
2. 源程序【DCT.c】
#include "stdio.h"
#include<math.h>
#include <stdlib.h>#define PI 3.1415926535int MAT_SIZE;float DCT_Mat[100][100]; //定于变换矩阵
float DctMap[100][100];  //输入矩阵,计算结束后为输出矩阵
float DctMapTmp[100][100];  //矩阵运算时用的中间矩阵void TransMat()
{int i,j;float a;for(i=0;i<MAT_SIZE;i++){for(j=0;j<MAT_SIZE;j++){a = 0;if(i==0){a=sqrt((float)1/MAT_SIZE);}else{a=sqrt((float)2/MAT_SIZE);}DCT_Mat[i][j]= a*cos((j+0.5)*PI*i/MAT_SIZE); //变换矩阵}}
}void DCT()
{float t=0;int i,j,k;for(i=0;i<MAT_SIZE;i++)  //相当于A*I{for(j=0;j<MAT_SIZE;j++){t=0;for(k=0;k<MAT_SIZE;k++){t+=DCT_Mat[i][k]*DctMap[k][j]; //矩阵的乘法,DCT_Mat的第i行乘DctMap的第j列}DctMapTmp[i][j]=t;}}for(i=0;i<MAT_SIZE;i++)  //相当于(A*I)后再*A‘{for(j=0;j<MAT_SIZE;j++){t=0;for(k=0;k<MAT_SIZE;k++){t+=DctMapTmp[i][k]*DCT_Mat[j][k];}DctMap[i][j]=t;}}
}int main(int argc, char *argv[])
{MAT_SIZE = atoi(argv[1]); //定义矩阵维度float k = 1;int count = 1;for(int i=0;i<MAT_SIZE;i++)   //产生输入数据{for(int j=0;j<MAT_SIZE;j++){DctMap[i][j]=k + 50*cos(k*2*PI/40);k++;}}InitDctMat();DCT();for(int i=0;i<MAT_SIZE;i++){for(int j=0;j<MAT_SIZE;j++){printf("%d\t%f\n",count,DctMap[i][j]); //输出DCT变换结果count++;}}
}

输入信号:k+50×cos(k×2×π/40)k+50 \times cos(k \times 2 \times π/40)k+50×cos(k×2×π/40),其中k∈[1,MAT_SIZE2]k \in [1,MAT\_SIZE^2]k∈[1,MAT_SIZE2]

  • 运行结果:
3. 将DCT变换的结果,用gnuplot作图

作图指令:

set xlabel "N"
set ylabel "DCT"
plot [0:16] [-150:250] "<DCT 8" u 1:2 w l title "DCT 8X8"
  • 运行结果:
五、计算结果验证
1. matlab实现DCT。源程序【DCT.mat】

输入信号:k+50×cos(k×2×π/40)k+50 \times cos(k \times 2 \times π/40)k+50×cos(k×2×π/40),其中k∈[1,MAT_SIZE2]k \in [1,MAT\_SIZE^2]k∈[1,MAT_SIZE2]

I=zeros(8)   %定义I为4x4矩阵
k = 0;
for i=1:8for j=1:8k = k+1;I(i,j)=k + 50*cos(k*2*pi/40);   %产生数据序列end
end
D=dct2(I)   %对I进行DCT变换
D=D'    %D进行转置
D=D(:)  %将D转成1x16的矩阵
plot(1:64,D)  %作图
title('DCT 8X8')
xlabel('N')
ylabel('DCT')
  • 运行结果:
2. 波形图对比
  • c语言画图结果:
  • matlab画图结果:

    对比两图结果一致。

《C》C语言实现DCT算法相关推荐

  1. R语言基于Bagging算法(融合多个决策树)构建集成学习Bagging分类模型、并评估模型在测试集和训练集上的分类效果(accuray、F1、偏差Deviance):Bagging算法与随机森林对比

    R语言基于Bagging算法(融合多个决策树)构建集成学习Bagging分类模型.并评估模型在测试集和训练集上的分类效果(accuray.F1.偏差Deviance):Bagging算法与随机森林对比 ...

  2. R语言使用apriori算法进行关联规则挖掘实战:关联规则概念、频繁项集、支持度(support)、置信度(confidence)、提升度(lift)、apriori算法

    R语言使用apriori算法进行关联规则挖掘实战:关联规则概念.频繁项集.支持度(support).置信度(confidence).提升度(lift).apriori算法 目录

  3. R语言基于机器学习算法进行特征筛选(Feature Selection)

    R语言基于机器学习算法进行特征筛选(Feature Selection) 对一个学习任务来说,给定属性集,有些属性很有用,另一些则可能没什么用.这里的属性即称为"特征"(featu ...

  4. 教你一步一步用C语言实现sift算法、上

    原文:http://blog.csdn.net/v_july_v/article/details/6245939 引言:     在我写的关于sift算法的前倆篇文章里头,已经对sift算法有了初步的 ...

  5. C语言基础排序算法-选择排序

    C语言基础排序算法-选择排序 什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法,第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从 ...

  6. C语言基础排序算法-冒泡排序

    C语言基础排序算法-冒泡排序 什么是冒泡排序? 顾名思义,这种排序方法就像水中的气泡一样,从底逐渐往上冒,一次前进一步.我们来看一个例子,看看到底是怎么冒泡的.假设有一个数组3,2,5,4,1,我们希 ...

  7. DCT算法的原理及实现简介

    DCT算法的原理及实现简介 DCT算法: DCT变换的全称是离散余弦变换(Discrete Cosine Transform),离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变 ...

  8. ML之SVM:利用Js语言设计SVM算法(SMO算法+线性核/高斯核)

    ML之SVM:利用Js语言设计SVM算法(SMO算法+线性核/高斯核) 目录 输出结果 设计思路 设计代码(部分代码) 输出结果 设计思路 设计代码(部分代码) var doTest = functi ...

  9. 动图图解C语言选择排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  10. C语言基础-基本算法

    C语言基础-基本算法 在之前的两篇文章中介绍了C语言的入门程序入门程序1,入门程序2,从这篇文章我们就开始介绍C语言基础. 今天来给大家介绍算法的特性和算法的表示. 算法的基本特性 算法包含两方面的内 ...

最新文章

  1. L - Subway POJ - 2502
  2. python中怎么表示整数的点称为整点_智慧职教云课堂APPPython程序设计基础答案公众号...
  3. python系列(四)python元组与字典
  4. aspiration定义_志愿者的定义、理念与精神核心
  5. Jenkins 部署 jmeter + Ant
  6. 版权:大众保险被判向微软赔偿217万元
  7. iOS组件化方案对比
  8. Excel中文转拼音(完整版)-转
  9. Git的author与committer的区别
  10. Visual Studio Code中比较不同的分支(How to compare different branches in Visual Studio Code)
  11. pytorch进行图像识别_pytorch使用4种不同的模型进行面部表情识别
  12. PHP面试题(遇到的)
  13. 小米手机4c获取Root权限的流程
  14. 数字人民币试点范围扩容;美国科技巨头市值蒸发超5万亿美元;蔡崇信再次出售阿里巴巴股票 | 每日大事件...
  15. “中关村黑马程序员训练营”练习题(二)
  16. 浮生散记——格蠹和我的2021
  17. 一个简单的银行存取款小程序
  18. Mac 域名解析不了,能ping通ip,但ping不通网址
  19. [高项]项目启动会VS开工会
  20. QML新功能——TapHandler信号处理器

热门文章

  1. 【C/C++】多线程中的几种锁
  2. Linux出现“E45: ‘readonly‘ option is set (add ! to override)”的解决方法。
  3. 泰勒公式到欧拉公式的推导
  4. 基于微信小程序的校友录系统毕业设计源码
  5. mysql binlog 查看pos点_如何寻找主库binlog和pos点
  6. 笔记本查看WIFI密码
  7. 第一天计算机谁发明的,世界公认三大天才,尼古拉特斯拉是当之无愧的第一天才...
  8. [统计学笔记] 统计学中的相关关系和三大相关系数
  9. pg 备份恢复(四)—— 逻辑备份(dump与copy导入导出)
  10. vm虚拟机开启蓝屏问题