`
oraclestudy
  • 浏览: 484230 次
文章分类
社区版块
存档分类

快速逆离散余弦变换代码实现(FIDCT)

 
阅读更多
下面的二维快速逆离散余弦变换是在Thomas G. Lane 的代码的基础上,修改而成。可直接用于图像或视频处理。
测试代码是玄机逸士写的。
// fidct.h
void fidct(short *const block);
void fidct_init();
// fidct.cpp
/*****************************************************************************
*
* XVID MPEG-4 VIDEO CODEC
* - Inverse DCT -
*
* These routines are from Independent JPEG Group's free JPEG software
* Copyright (C) 1991-1998, Thomas G. Lane (see the file README.IJG)
****************************************************************************/
/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
#include "fidct.h"
#define W1 2841/* 2048*sqrt(2)*cos(1*pi/16) */
#define W2 2676/* 2048*sqrt(2)*cos(2*pi/16) */
#define W3 2408/* 2048*sqrt(2)*cos(3*pi/16) */
#define W5 1609/* 2048*sqrt(2)*cos(5*pi/16) */
#define W6 1108/* 2048*sqrt(2)*cos(6*pi/16) */
#define W7 565 /* 2048*sqrt(2)*cos(7*pi/16) */
/* private data */
static short iclip[1024];/* clipping table */
static short *iclp;
/* two dimensional inverse discrete cosine transform */
// fidct_init() MUST BE CALLED BEOFRE THE FIRST CALL TO THIS FUNCTION!
void fidct(short *const block)
{
static short *blk;
static long i;
static long X0, X1, X2, X3, X4, X5, X6, X7, X8;

for (i = 0; i < 8; i++)/* idct rows */
{
blk = block + (i << 3);
if (!((X1 = blk[4] << 11) | (X2 = blk[6]) | (X3 = blk[2]) | (X4 = blk[1]) |
(X5 = blk[7]) | (X6 = blk[5]) | (X7 = blk[3])))
{
blk[0] = blk[1] = blk[2] = blk[3] = blk[4] = blk[5] = blk[6] = blk[7] = blk[0] << 3;
continue;
}
X0 = (blk[0] << 11) + 128;/* for proper rounding in the fourth stage */
/* first stage */
X8 = W7 * (X4 + X5);
X4 = X8 + (W1 - W7) * X4;
X5 = X8 - (W1 + W7) * X5;
X8 = W3 * (X6 + X7);
X6 = X8 - (W3 - W5) * X6;
X7 = X8 - (W3 + W5) * X7;
/* second stage */
X8 = X0 + X1;
X0 -= X1;
X1 = W6 * (X3 + X2);
X2 = X1 - (W2 + W6) * X2;
X3 = X1 + (W2 - W6) * X3;
X1 = X4 + X6;
X4 -= X6;
X6 = X5 + X7;
X5 -= X7;
/* third stage */
X7 = X8 + X3;
X8 -= X3;
X3 = X0 + X2;
X0 -= X2;
X2 = (181 * (X4 + X5) + 128) >> 8;
X4 = (181 * (X4 - X5) + 128) >> 8;
/* fourth stage */
blk[0] = (short) ((X7 + X1) >> 8);
blk[1] = (short) ((X3 + X2) >> 8);
blk[2] = (short) ((X0 + X4) >> 8);
blk[3] = (short) ((X8 + X6) >> 8);
blk[4] = (short) ((X8 - X6) >> 8);
blk[5] = (short) ((X0 - X4) >> 8);
blk[6] = (short) ((X3 - X2) >> 8);
blk[7] = (short) ((X7 - X1) >> 8);
}/* end for ( i = 0; i < 8; ++i ) IDCT-rows */
for (i = 0; i < 8; i++)/* idct columns */
{
blk = block + i;
/* shortcut */
if (!
((X1 = (blk[8 * 4] << 8)) | (X2 = blk[8 * 6]) | (X3 = blk[8 * 2]) | (X4 = blk[8 *1])
| (X5 = blk[8 * 7]) | (X6 = blk[8 * 5]) | (X7 = blk[8 * 3])))
{
blk[8 * 0] = blk[8 * 1] = blk[8 * 2] = blk[8 * 3] = blk[8 * 4] =
blk[8 * 5] = blk[8 * 6] = blk[8 * 7] = iclp[(blk[8 * 0] + 32) >> 6];
continue;
}
X0 = (blk[8 * 0] << 8) + 8192;
/* first stage */
X8 = W7 * (X4 + X5) + 4;
X4 = (X8 + (W1 - W7) * X4) >> 3;
X5 = (X8 - (W1 + W7) * X5) >> 3;
X8 = W3 * (X6 + X7) + 4;
X6 = (X8 - (W3 - W5) * X6) >> 3;
X7 = (X8 - (W3 + W5) * X7) >> 3;
/* second stage */
X8 = X0 + X1;
X0 -= X1;
X1 = W6 * (X3 + X2) + 4;
X2 = (X1 - (W2 + W6) * X2) >> 3;
X3 = (X1 + (W2 - W6) * X3) >> 3;
X1 = X4 + X6;
X4 -= X6;
X6 = X5 + X7;
X5 -= X7;
/* third stage */
X7 = X8 + X3;
X8 -= X3;
X3 = X0 + X2;
X0 -= X2;
X2 = (181 * (X4 + X5) + 128) >> 8;
X4 = (181 * (X4 - X5) + 128) >> 8;
/* fourth stage */
blk[8 * 0] = iclp[(X7 + X1) >> 14];
blk[8 * 1] = iclp[(X3 + X2) >> 14];
blk[8 * 2] = iclp[(X0 + X4) >> 14];
blk[8 * 3] = iclp[(X8 + X6) >> 14];
blk[8 * 4] = iclp[(X8 - X6) >> 14];
blk[8 * 5] = iclp[(X0 - X4) >> 14];
blk[8 * 6] = iclp[(X3 - X2) >> 14];
blk[8 * 7] = iclp[(X7 - X1) >> 14];
}
}

void fidct_init()
{
int i;
iclp = iclip + 512;
for (i = -512; i < 512; i++)
iclp[i] = (i < -256) ? -256 : ((i > 255) ? 255 : i);
}
// 测试代码:calculate.cpp
#include <iostream>
#include "fidct.h"
using namespace std;
#define NUM 8
int main(void)
{
int i, j;
double originaldata[NUM][NUM] =
{
{1125.00, -32.00, -185.00, -7.00, 2.00, -1.00, -2.00, 2.00},
{-22.00, -16.00, 45.00, -3.00, -2.00, 0.00, -1.00, -2.00},
{-165.00, 32.00, 17.00, 2.00, 1.00, -1.00, -3.00, 0.00},
{-7.00, -4.00, 0.00, 2.00, 2.00, -1.00, -1.00, 2.00},
{-2.00, 0.00, 0.00, 3.00, 0.00, 0.00, 2.00, 1.00},
{3.00, 1.00, 1.00, -1.00, -2.00, 1.00, 2.00, 0.00},
{0.00, 0.00, 2.00, -1.00, -1.00, 2.00, 1.00, -1.00},
{0.00, 3.00, 1.00, -1.00, 2.00, 1.00, -2.00, 0.00}
};
short *data = new short[NUM * NUM];
for(i = 0; i < NUM; i++)
{
for(j = 0; j < NUM; j++)
{
data[i * NUM + j] = (short)originaldata[i][j];
}
}
fidct_init();
fidct(data);
for(i = 0; i < NUM; i++)
{
for(j = 0; j < NUM; j++)
{
cout << data[i * NUM + j] << '/t';
}
cout << endl;
}
return 0;
}
运行结果:
 89 101 114 125 126 115 105 96
97 115 131 147 149 135 123 113
114 134 159 178 175 164 149 137
121 143 177 196 201 189 165 150
119 141 175 201 207 186 162 144
107 130 165 189 192 171 144 125
96 119 150 171 172 145 116 96
88 107 136 156 155 129 97 75
请对照:
离散余弦正逆变换快速离散余弦变换代码实现(FDCT)
分享到:
评论

相关推荐

    基于Java实现的明日知道系统.zip

    基于Java实现的明日知道系统

    NX二次开发uc1653 函数介绍

    NX二次开发uc1653 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业人士,还是希望提高工作效率的普通用户,NX 二次开发 Ufun 都可以帮助您实现更高效的工作流程。函数覆盖了 NX 软件的各个方面,包括但不限于建模、装配、制图、编程、仿真等。这些 API 函数可以帮助用户轻松地实现自动化、定制化和扩展 NX 软件的功能。例如,用户可以通过 Ufun 编写脚本,自动化完成重复性的设计任务,提高设计效率;或者开发定制化的功能,满足特定的业务需求。语法简单易懂,易于学习和使用。用户可以快速上手并开发出符合自己需求的 NX 功能。本资源内容 提供了丰富的中英文帮助文档,可以帮助用户快速了解和使用 Ufun 的功能。用户可以通过资源中的提示,学习如何使用 Ufun 的 API 函数,以及如何实现特定的功能。

    别墅图纸编号D020-三层-10.00&12.00米- 效果图.dwg

    别墅图纸编号D020-三层-10.00&12.00米- 效果图.dwg

    操作系统实验指导书(2024)单面打印(1).pdf

    操作系统实验指导书(2024)单面打印(1).pdf

    基于Python实现的校园教务系统

    Api Function | Api | Description | Argument | | :-------- | :----- | :---- | | user_login | 登陆函数 | account, password, user_type=1, use_cookie_login=True | | get_schedule | 课表查询 | schedule_year=None, schedule_term=None, schedule_type=None | | get_score | 成绩查询 | score_year=None, score_term=None, use_api=0 | | get_info | 用户信息查询 | | | get_place_schedule| 教学场地课表查询(可用于空教室查询) |campus_list=None,

    Qt+ContentMargin+QWidget设置内容边距

    设置控件窗口边框与内容的边距,包含左、上、右、下四个边距。示例中点击界面按钮设置按钮控件、text browser控件两者与父节点的GridLayout之间的边距,通过点击按钮可看到边距变化导致的界面布局的变化。包含源码可直接在qtcreator中编译运行。

    基于Java的“约时间”应用程序的设计与实现源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    grpcio-1.37.0-cp36-cp36m-manylinux2010_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    程序设计java.rar

    程序设计java.rar

    mmexport1717100094141.mp4

    mmexport1717100094141.mp4

    grpcio-1.37.0-cp37-cp37m-manylinux2010_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    02_完整代码.zip

    02_完整代码

    基于Java的建材运营管理系统源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    FME模板演示:提取CAD扩展属性,以提取地物编码为例

    FME模板演示:提取CAD扩展属性,以提取地物编码为例。 示范如何使用FME软件来提取CAD扩展属性。

    Java开发案例-springboot-48-整合NutDao操作SQL-源代码+文档.rar

    Java开发案例-springboot-48-整合NutDao操作SQL-源代码+文档 Java开发案例-springboot-48-整合NutDao操作SQL-源代码+文档 Java开发案例-springboot-48-整合NutDao操作SQL-源代码+文档 Java开发案例-springboot-48-整合NutDao操作SQL-源代码+文档 Java开发案例-springboot-48-整合NutDao操作SQL-源代码+文档 Java开发案例-springboot-48-整合NutDao操作SQL-源代码+文档

    基于微信小程序的企业生产管理系统的设计与实现源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    Survival Animations 1.0

    一套生存游戏的动画集,包括采集、建造、捕鱼、剥皮/鞣制、篝火等更多内容。 产品描述 总动画数:89 建造/制作 30 篝火 28 饮水 3 水壶 3 觅食 2 治疗 3 空闲 1 原始捕鱼 7 剥皮 1 矛捕鱼 4 伐木 5

    基于Keras的LSTM多变量时间序列预测python源码+文档说明

    基于Keras的LSTM多变量时间序列预测python源码+文档说明 本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。基于Keras的LSTM多变量时间序列预测python源码+文档说明 本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过

    基于Android的X光片管理系统源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    移动电脑硬盘数据恢复软件

    各种恢复

Global site tag (gtag.js) - Google Analytics