c JPEG 1D DCT 优化二(AAN)

这两个图可能就是AAN 的数学模型

5800b8c697ce4accbc2ede90e8731caf.jpeg

 

b13cb6c027574fba9fbe7725f226143c.jpeg

优化DCT就是用代码实现矩阵9,10

9和10已经把64个系数缩小到一半32个了。光从这两图可看出,优化后乘法少了64-32+4=36个,加法少了64-32-8=24。估计优化时间可少百分之40左右。

实际编码640×480 的图片,程序执行时间缩短为0.13秒。

 

要想减少DCT时间就要尽量减少DCT函数的代码量,可以不用查表直接赋值。

最后一种优化就是象ffmpeg一样用汇编写DCT函数部分了。这种就搞不定了。

下一个目标,h264!

实现9,10 矩阵代码:

​
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define PI 3.1415926int main(void){//cs:cos(PI*(2*n+1)*k/16)/*	double cs[64]={1,      1,     1,    1,    1,     1,     1,      1,0.98,  0.83, 0.56, 0.20, -0.20, -0.56,  -0.83, -0.98,0.92,  0.38, -0.38, -0.92, -0.92, -0.38, 0.38, 0.92 ,0.83,  -0.20, -0.98, -0.56, 0.56, 0.98,  0.20, -0.83,0.71,  -0.71, -0.71, 0.71,  0.71,  -0.71, -0.71,0.71,0.56,  -0.98, 0.20, 0.83,  -0.83, -0.20, 0.98, -0.56,0.38, -0.92,  0.92, -0.38, -0.38,  0.92, -0.92, 0.38,0.20,  -0.56, 0.83, -0.98, 0.98,   -0.83, 0.56,  -0.20};//--------------1D DCT-----------------------------------------int  DCT(double i[8],double o[8]){       //ID DCT  参数类型不能用unsigned char ,因为中间系数已超char取值范围double s=0.0;for(int k=0;k<8;k++){for(int n=0;n<8;n++){s=s+i[n]*cs[k*8+n];  //查cs表}if(k==0){s=s*(1.0/(2*sqrt(2)));}else{s=s*(1.0/2);}o[k]=s;s=0.0;}return 0;}*/double cs1[16]={1,      1,     1,    1, 0.92,  0.38, -0.38, -0.92,0.71,  -0.71, -0.71, 0.71,0.38, -0.92,  0.92, -0.38, };double cs2[16]={0.98,  0.83, 0.56, 0.20, 0.83,  -0.20, -0.98, -0.56,0.56,  -0.98, 0.20, 0.83,  0.20,  -0.56, 0.83, -0.98, };int  DCT(double i[8],double o[8]){       //采用AAN 方式double z0=i[0]+i[7];double  z1=i[0]-i[7];double z2=i[1]+i[6];double z3=i[1]-i[6];double z4=i[2]+i[5];double z5=i[2]-i[5];double z6=i[3]+i[4];double z7=i[3]-i[4];o[0]=(cs1[0]*z0+cs1[1]*z2+cs1[2]*z4+cs1[3]*z6)*(1.0/(2*sqrt(2)));o[1]=(cs2[0]*z1+cs2[1]*z3+cs2[2]*z5+cs2[3]*z7)*(1.0/2);o[2]=(cs1[4]*z0+cs1[5]*z2+cs1[6]*z4+cs1[7]*z6)*(1.0/2);o[3]=(cs2[4]*z1+cs2[5]*z3+cs2[6]*z5+cs2[7]*z7)*(1.0/2);o[4]=(cs1[8]*z0+cs1[9]*z2+cs1[10]*z4+cs1[11]*z6)*(1.0/2);o[5]=(cs2[8]*z1+cs2[9]*z3+cs2[10]*z5+cs2[11]*z7)*(1.0/2);o[6]=(cs1[12]*z0+cs1[13]*z2+cs1[14]*z4+cs1[15]*z6)*(1.0/2);o[7]=(cs2[12]*z1+cs2[13]*z3+cs2[14]*z5+cs2[15]*z7)*(1.0/2);return 0;}//--------------------------------------------------------------------double i[64]={-76,-73,-67,-62,-58,-67,-64,-55,-65,-69,-73,-38,-19,-43,-59,-56,-66,-69,-60,-15,16,-24,-62,-55,-65,-70,-57,-6,26,-22,-58,-59,-61,-67,-60,-24,-2,-40,-60,-58,-49,-63,-68,-58,-51,-60,-70,-53,-43,-57,-64,-69,-73,-67,-63,-45,-41,-49,-59,-60,-63,-52,-50,-34};//-------------8行分别1D DCT---------------------double w[64]={};      //中间8×8for(int a=0;a<64;a=a+8){double ls_o[8]={};double ls_i[8]={};memcpy(ls_i,&(i[a]),64);DCT(ls_i,ls_o);memcpy(&(w[a]),ls_o,64);}//----------对中间8×8 列1D DCT-------------------------double zj[8][8]={};    //取中间w的8个8列int t=0;for(int a=0;a<8;a++){for(int b=0;b<8;b++){zj[t][b]=w[b*8+a];}t++;}double ll[64]={};      //现在的列是水平放置的,也就是列变成了行,要转为列for(int a=0;a<8;a++){    //对8列1D DCTdouble zz[8]={};DCT(zj[a],zz);memcpy(&(ll[8*a]),zz,64);}int k=0;double  out[64]={};          //2D DCT 系数for(int a=0;a<8;a++){for(int b=0;b<8;b++){out[8*b+a]=ll[k];k++;}}//----------显示--------------------------------------------for(int a=0;a<8;a++){for(int b=0;b<8;b++){printf("%f ,",out[a*8+b]);}puts("");}return 0;
}​

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/416645.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FlinkSQL【分组聚合-多维分析-性能调优】应用实例分析

FlinkSQL处理如下实时数据需求&#xff1a; 实时聚合不同 类型/账号/发布时间 的各个指标数据&#xff0c;比如&#xff1a;初始化/初始化后删除/初始化后取消/推送/成功/失败 的指标数据。要求实时产出指标数据&#xff0c;数据源是mysql cdc binlog数据。 代码实例 --SET t…

解决系统开发中的跨域问题:CORS、JSONP、Nginx

文章目录 一、概述1.问题场景2.浏览器的同源策略3.解决思路 二、一点准备工作1.创建前端工程12.创建后端工程3.创建前端工程24.跨域问题 三、方法1&#xff1a;使用CORS四、方法2&#xff1a;JSONP五、方法3&#xff1a;Nginx1.安装和启动&#xff08;windows&#xff09;2.使用…

TestNG注释

目录 TestNG注释列表 BeforeXXX和AfterXXX注释放在超类上时如何工作&#xff1f; 使用BeforeXXX和AfterXXX TestNG注释 TestNG是一个测试框架&#xff0c;旨在简化广泛的测试需求&#xff0c;从单元测试&#xff08;隔离测试一个类&#xff09;到集成测试&#xff08;测试由…

【LGR-172-Div.4】洛谷入门赛 #19(A—H,c++详解!)

文章目录 【LGR-172-Div.4】洛谷入门赛 #19A.分饼干 I题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示样例解释 1样例解释 2数据范围与约定思路: 代码 B.分饼干 II题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样…

书生·浦语大模型实战营第四次课堂笔记

先来看看参考作业 哈哈到这才想起来写笔记 倒回去看发现要求将不要葱姜蒜换成自己的名字和昵称&#xff01; 好好好我就是不配玩&#xff08;换成管理员也不行&#xff01;&#xff09; 诶怎么能进这个环境&#xff1f;要进双系统ubuntu&#xff1f; 现在看视频发现原来是…

HarmonyOS 页面跳转控制整个界面的转场动画

好 本文 我们来说 页面间的转场动画 就是 第一个界面到另一个界面 第一个界面的退场和第二个界面的进场效果 首先 我这里 创建了两个页面文件 Index.ets和AppView.ets index组件 编写代码如下 import router from "ohos.router" Entry Component struct Index {b…

鉴源实验室|自动驾驶仿真测试技术分析

01 引言 随着科技的不断发展&#xff0c;自动驾驶技术逐渐成为汽车行业的热门话题。然而&#xff0c;要将自动驾驶车辆投放到真实道路上之前&#xff0c;必须进行广泛的测试&#xff0c;以确保其在各种情况下都能安全可靠地运行。自动驾驶车辆的测试是一个复杂而昂贵的过程。…

大数据开发之Hadoop(完整版+练习)

第 1 章&#xff1a;Hadoop概述 1.1 Hadoop是什么 1、Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 2、主要解决&#xff0c;海量数据的存储和海量数据的分析计算问题。 3、Hadoop通常是指一个更广泛的概念-Hadoop生态圈 1.2 Hadoop优势&#xff08;4高&#xf…

2024年AMC8被强制提前交卷事件应该告一段落了,向前看吧孩子们

原以为到今天开考前一切和往年一样的2024年AMC8竞赛也会和往年一样&#xff08;真绕&#xff09;&#xff0c;没想到出了个大规模强制提前交卷时间&#xff0c;让很多家长和孩子不可理解、很难受&#xff0c;甚至有一些家长在收集证据&#xff0c;准备请相关部门去调查&#xf…

DC-3靶机刷题记录

靶机下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1-P5ezyt5hUbmmGMP4EI7kw?pwdrt2c 提取码&#xff1a;rt2c 参考&#xff1a; http://t.csdnimg.cn/hhPi8https://www.vulnhub.com/entry/dc-32,312/ 官网http://t.csdnimg.cn/5mVZ7DC-3 (1).pdfhttps://…

[AutoSar]BSW_OS 05 Autosar OS_schedule table

目录 关键词平台说明一、调度表 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c;芯片厂商TI 英飞凌编程语言C&#xff0c;C编译器HighTec (GCC) >>>>>回到总目录<<<<<< 一、调度表…

ThinkPad T14/T15/P14s/P15s gen2电脑原厂Win10系统镜像 恢复笔记本出厂时预装自带OEM系统

lenovo联想原装出厂Windows10系统&#xff0c;适用型号&#xff1a; ThinkPad T14 Gen 2&#xff0c;ThinPad T15 Gen 2&#xff0c;ThinkPad P14s Gen 2&#xff0c;ThinkPad P15s Gen 2 &#xff08;20W1,20W5,20VY,20W7,20W0,20W4,20VX,20W6&#xff09; 链接&#xff1…