c JPEG 1D DCT 优化二(AAN)

news2024/11/28 4:30:26

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

5800b8c697ce4accbc2ede90e8731caf.jpeg

 

b13cb6c027574fba9fbe7725f226143c.jpeg

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

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

实际编码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.1415926

int 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×8
	
	for(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 DCT
		double 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.coloradmin.cn/o/1399315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RS-485通讯

RS-485通讯协议简介 与CAN类似&#xff0c;RS-485是一种工业控制环境中常用的通讯协议&#xff0c;它具有抗干扰能力强、传输距离远的特点。RS-485通讯协议由RS-232协议改进而来&#xff0c;协议层不变&#xff0c;只是改进了物理层&#xff0c;因而保留了串口通讯协议应用简单…

预约上门按摩app开发需要具备哪些材料

开发上门按摩预约系统的功能模块&#xff0c;包括用户端、技师端和管理后台。 设计阶段&#xff1a;根据需求分析结果&#xff0c;进行界面设计和数据库设计&#xff0c;并编写相应的技术文档。 开发阶段&#xff1a;根据设计文档&#xff0c;进行上门按摩预约系统的开发工作&a…

spring boot shardingsphere mybatis-plus druid mysql 搭建mysql数据库读写分离架构

spring boot shardingsphere mybatis-plus druid mysql 搭建mysql数据库读写分离架构 ##关于window mysql主从搭建简单教程 传送门 window mysql5.7 搭建主从同步环境-CSDN博客 ##父pom.xml <?xml version"1.0" encoding"UTF-8"?> <project…

YOLOv8算法改进【NO.99】引入最新发布Deformable Convolution v4 (DCNv4)

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 第一…

常用排序算法总结(直接插入排序、选择排序、冒泡排序、堆排序、快速排序、希尔排序、归并排序)

目录 一. 直接插入排序 二:选择排序 三:冒泡排序 四.堆排序 五:希尔排序 六:快速排序(递归与非递归) 七.归并排序(递归与非递归) 一. 直接插入排序 &#x1f31f;排序思路 直接插入排序的基本原理是将一条记录插入到已排好的有序表中&#xff0c;从而得到一个新的、记录…

C++大学教程(第九版)5.25去除break语句 5.27去除cintinue语句

5.25题目 (去除break和continue)break和continue 语句遭到质疑的原因是它们的非结构化性。实际上,break和continue 语句总能用结构化的语句取代。请详述如何从程序的一条循环语中去除break语句&#xff0c;并用某种结构化的手段替代。提示:break 语句用于在循环体内离开一个循…

【分布式监控】zabbix与grafana连接

1.在zabbix- server服务端安装grafana&#xff0c;并启动服务 先在官网下载软件 https://grafana.com/grafana/download/9.4.7?editionenterprise&pggraf&plcmtdeploy-box-1#可以翻译成中文介绍&#xff0c;很详细的教程 yum install -y https://dl.grafana.com/ent…

拓展坞的广泛应用场景

在当今数字化时代&#xff0c;我们的生活与各种电子设备紧密相连。为了方便使用和管理这些设备&#xff0c;拓展坞应运而生&#xff0c;成为我们生活中不可或缺的配件。本文将介绍拓展坞的概念、功能和在生活中的应用&#xff0c;以及如何选择合适的拓展坞。 添加图片注释&…

LeetCode、162. 寻找峰值【中等,最大值、二分】

文章目录 前言LeetCode、162. 寻找峰值【中等&#xff0c;最大值、二分】题目及类型思路及代码思路1&#xff1a;二分思路2&#xff1a;寻找最大值 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿…

【开发必备】泳道图编辑工具及使用

1.什么是泳道图 事情的起因在与博主要和几位小伙伴一起开发一个小程序&#xff0c;那么涉及的人多时就需要用到需求文档这个玩意。然后博主当然要扛起写需求文档这项项目经理 &#xff08;牛马&#xff09;的职责了&#xff01; 然后&#xff0c;博主就发现需求文档中一个看似…

AIGC语言大模型涌现能力是幻觉吗?

Look&#xff01;&#x1f440;我们的大模型商业化落地产品&#x1f4d6;更多AI资讯请&#x1f449;&#x1f3fe;关注Free三天集训营助教在线为您火热答疑&#x1f469;&#x1f3fc;‍&#x1f3eb; 在自然界中&#xff0c;涌现现象无处不在&#xff0c;从鸟群的和谐飞翔到生…

系统架构设计师

软考系统架构设计师笔记 专用的成电路&#xff08;Application Specific Integrated Circuit&#xff0c;ASIC) PTR记录&#xff1a;Pointer Record&#xff0c;常被用于反向地址解析&#xff0c;即通过IP地址查询服务器域名。 软件工程 软件开发模型 【增量模型的优点】 …

嵌入式学习-网络编程-Day5

思维导图 select完成tcp并发服务器模型&#xff1a; 服务器端 #include <myhead.h> #define SER_PORT 8888 #define SER_IP "192.168.122.153"int main(int argc, const char *argv[]) {//1.创建套接字int sfd socket(AF_INET,SOCK_STREAM,0/*IPPROTO_TCP*…

【51单片机Keil+Proteus8.9】控制步进电机+LCD1602显示状态

步进电机控制 设计思路 电路设计&#xff1a; 选用AT89C51单片机作为电路核心部件&#xff0c;外加LM016L液晶显示屏作为显示&#xff0c;显示步进电机的Fast&#xff0c;Slow&#xff0c;Stop的三个状态将AT89C51单片机所选引脚与LM016L控制引脚相连&#xff0c;再将数据通…

【计算机网络】3、IPv6、网络三层模型、网络的规划与设计、网络的规划与设计、网络存储技术、网络地址翻译NAT、默认网关、虚拟局域网VLAN、虚拟专用网VPN、URL

文章目录 IPv6IPv6的特点IPv4和IPv6的过渡期间主要采用三种基本技术双协议栈隧道技术翻译技术 网络三层模型核心层汇聚层接入层 网络的规划与设计工作区子系统水平布线子系统管理子系统垂直干线子系统设备间子系统建筑群子系统总结 廉价磁盘网络存储技术直接附加存储(DAS)网络附…

在WIN从零开始在QMUE上添加一块自己的开发板(二)

文章目录 一、前言往期回顾 二、CPU虚拟化&#xff08;一&#xff09;相关源码&#xff08;二&#xff09;举个例子&#xff08;三&#xff09;测试 三、内存虚拟化&#xff08;一&#xff09;相关源码&#xff08;二&#xff09;举个例子测试 参考资料 一、前言 笔者这篇博客…

电力能源三维可视化合集 | 图扑数字孪生

电力能源是现代社会发展和运行的基石&#xff0c;渗透于工业、商业、农业、家庭生活等方方面面&#xff0c;它为经济、生活质量、环境保护和社会发展提供了巨大的机会和潜力。图扑软件应用自研 HT for Web 强大的渲染引擎&#xff0c;助力现代化的电力能源数字孪生场景&#xf…

新手也能看懂的【前端自动化测试入门】!

前言 最近在网上搜索前端自动化测试相关的文档&#xff0c;但是发现网上的文章都是偏使用&#xff0c;没有把一些基础概念说清楚&#xff0c;导致后续一口气遇到一些karma、Jasmine、jest、Mocha、Chai、BDD等词汇的时候很容易一头雾水&#xff0c;这次一方面整理一下收获的知…

Mysql运维篇(一) 日志类型

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人&#xff0c;如有侵权请留言&#xff0c;我及时删除。 一、mysql相关日志 首先&#xff0c;我们能接触到的&#xff0c;一般我们排查慢查询时&#xff0c;会去看慢查询…

Dicom标准里的 RescaleType

DCM_RescaleType 0x0028, 0x1054 这个 HU 和 us 是代表什么含义 之前去一个公司面试&#xff0c;问我&#xff0c; MR里灰阶是什么 CT里才叫CT值&#xff0c; MR里叫什么呢&#xff1f; DICOMLookup