#include <iostream>
using namespace std;
#define DCTSIZE 8
void FDCT(double* lpBuff)
{
double tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
double tmp10, tmp11, tmp12, tmp13;
double z1, z2, z3, z4, z5, z11, z13;
double* dataptr;
int ctr;
/* 第一部分,对行进行计算 */
dataptr = lpBuff;
for (ctr = DCTSIZE-1; ctr >= 0; ctr--)
{
tmp0 = dataptr[0] + dataptr[7];
tmp7 = dataptr[0] - dataptr[7];
tmp1 = dataptr[1] + dataptr[6];
tmp6 = dataptr[1] - dataptr[6];
tmp2 = dataptr[2] + dataptr[5];
tmp5 = dataptr[2] - dataptr[5];
tmp3 = dataptr[3] + dataptr[4];
tmp4 = dataptr[3] - dataptr[4];
/* 对偶数项进行运算 */
tmp10 = tmp0 + tmp3; /* phase 2 */
tmp13 = tmp0 - tmp3;
tmp11 = tmp1 + tmp2;
tmp12 = tmp1 - tmp2;
dataptr[0] = tmp10 + tmp11; /* phase 3 */
dataptr[4] = tmp10 - tmp11;
z1 = (tmp12 + tmp13) * (0.707106781); /* c4 */
dataptr[2] = tmp13 + z1; /* phase 5 */
dataptr[6] = tmp13 - z1;
/* 对奇数项进行计算 */
tmp10 = tmp4 + tmp5; /* phase 2 */
tmp11 = tmp5 + tmp6;
tmp12 = tmp6 + tmp7;
z5 = (tmp10 - tmp12) * ( 0.382683433); /* c6 */
z2 = (0.541196100) * tmp10 + z5; /* c2-c6 */
z4 = (1.306562965) * tmp12 + z5; /* c2+c6 */
z3 = tmp11 * (0.707106781); /* c4 */
z11 = tmp7 + z3; /* phase 5 */
z13 = tmp7 - z3;
dataptr[5] = z13 + z2; /* phase 6 */
dataptr[3] = z13 - z2;
dataptr[1] = z11 + z4;
dataptr[7] = z11 - z4;
dataptr += DCTSIZE; /* 将指针指向下一行 */
}
/* 第二部分,对列进行计算 */
dataptr = lpBuff;
for (ctr = DCTSIZE-1; ctr >= 0; ctr--)
{
tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
/* 对偶数项进行运算 */
tmp10 = tmp0 + tmp3; /* phase 2 */
tmp13 = tmp0 - tmp3;
tmp11 = tmp1 + tmp2;
tmp12 = tmp1 - tmp2;
dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */
dataptr[DCTSIZE*4] = tmp10 - tmp11;
z1 = (tmp12 + tmp13) * (0.707106781); /* c4 */
dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */
dataptr[DCTSIZE*6] = tmp13 - z1;
/* 对奇数项进行计算 */
tmp10 = tmp4 + tmp5; /* phase 2 */
tmp11 = tmp5 + tmp6;
tmp12 = tmp6 + tmp7;
z5 = (tmp10 - tmp12) * (0.382683433); /* c6 */
z2 = (0.541196100) * tmp10 + z5; /* c2-c6 */
z4 = (1.306562965) * tmp12 + z5; /* c2+c6 */
z3 = tmp11 * (0.707106781); /* c4 */
z11 = tmp7 + z3; /* phase 5 */
z13 = tmp7 - z3;
dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */
dataptr[DCTSIZE*3] = z13 - z2;
dataptr[DCTSIZE*1] = z11 + z4;
dataptr[DCTSIZE*7] = z11 - z4;
++dataptr; /* 将指针指向下一列 */
}
}
int main(void)
{
const short NUM = 8;
short i = 0;
short j = 0;
short u = 0;
short v = 0;
double input[NUM][NUM] =
{
{89.00, 101.00, 114.00, 125.00, 126.00, 115.00, 105.00, 96.00},
{97.00, 115.00, 131.00, 147.00, 149.00, 135.00, 123.00, 113.00},
{114.00, 134.00, 159.00, 178.00, 175.00, 164.00, 149.00, 137.00},
{121.00, 143.00, 177.00, 196.00, 201.00, 189.00, 165.00, 150.00},
{119.00, 141.00, 175.00, 201.00, 207.00, 186.00, 162.00, 144.00},
{107.00, 130.00, 165.00, 189.00, 192.00, 171.00, 144.00, 125.00},
{97.00, 119.00, 149.00, 171.00, 172.00, 145.00, 117.00, 96.00},
{88.00, 107.00, 136.00, 156.00, 155.00, 129.00, 97.00, 75.00}
};
double *data = new double[NUM * NUM];
for(i = 0; i < NUM; i++)
{
for(j = 0; j < NUM; j++)
{
data[i * NUM + j] = input[i][j];
}
}
FDCT(data);
// print the result of FDCT
for(u = 0; u < NUM; u++)
{
for(v = 0; v < NUM; v++)
{
printf("%7.2f ", data[u*NUM + v]);
}
cout << endl;
}
return 0;
}
dct.zip_visual c
版权申诉
95 浏览量
2022-09-23
09:41:25
上传
评论
收藏 710KB ZIP 举报
朱moyimi
- 粉丝: 63
- 资源: 1万+
最新资源
- IMG_20240505_104803.jpg
- AUTOSAR(汽车开放系统架构)深度解析.pdf
- 基于微信小程序的答题系统的设计与实现+全部资料+数据库(毕业设计).zip
- 分析 vs2019 cpp20 规范的 STL 库模板 function ,源码注释并探讨几个问题
- 基于微信小程序+mysql的答题系统的设计与实现+全部资料+详细文档(毕业设计).zip
- H5U的PLC固件,用于EthernetIP通讯时升级固件使用
- Jumpserver堡垒机快速入门视频.zip
- 基于springboot+mysql+redis实现个性化书籍推荐和相似帖子推荐的社区图书馆+论坛+失物招领平台
- 软考中级软件设计师 法律法规通关笔记
- 基于java+sqlserver实现的员工培训系统
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0