c JPEG 1D DCT

news/2025/3/30 7:30:58/

步骤:

1.  对yuv 8×8   数据  8行分别1D DCT

2,  用8行 1D  DCT 得到的数据生成中间8×8 块 Zj

3,对Zj  的8列再 1D  DCT 后生成8列,用这8列组合成8*8的2D DCT 系数

准备用此1D DCT程序代替以前写的2D DCT,看能减少多少编码时间。

看网上文章,ffmpeg用的DCT也是1D DCT, 只是用了优化的AAN,再加入汇编代码处理。

把以前的jpeg编码程序中的2D dct换成1D的,程序运行时间从2秒多立马减少为0.3秒。太有效了。但用于摄像头压缩还不行,因为这样帧率不会超过5帧。

突然想了一个巧法,可以把64个循环的余弦值手算出来,用if查表法看能不能再大幅减少编码时间。此余弦值是随二个参数变化的,也可处理为这两个数的二维数组。

验证数据:

065591f890e84b9e8b96564a6d1e0ccf.jpeg

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define PI 3.1415926int main(void){//--------------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]*cos(PI*(2*n+1)*k/16);}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 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.ppmy.cn/news/1325279.html

相关文章

深入数仓离线数据同步:问题分析与优化措施

一、前言 在数据仓库领域&#xff0c;离线数仓和实时数仓是常见的两种架构类型。离线数仓一般通过定时任务在特定时间点&#xff08;通常是凌晨&#xff09;将业务数据同步到数据仓库中。这种方式适用于对数据实时性要求不高&#xff0c;更侧重于历史数据分析和报告生成的场景…

C++ 模板 Traits

写一个简单的累加模板&#xff0c;如下&#xff1a; template<typename T> T accum(T const* beg, T const* end) {T total{};while(beg ! end){total * beg; beg;}return total; }int main() {int num[] { 1, 2, 3, 4, 5 };std::cout << "the average val…

使用vue2写一个太极图,并且点击旋转

下面是我自己写的一个代码&#xff0c;命名有些不规范&#xff0c;大家不要介意。 <template><div class"qq"><div class"app" :style"{ transform: rotateStyle }"><div class"app1"><div class"ap…

C语言爬虫采集图书网站百万数据

最近需要查阅一些资料&#xff0c;只给到相关项目名称以及关键词&#xff0c;想通过图书文库找到对应书籍&#xff0c;那么怎么才能在百万数据库中找到自己需要的文献呢&#xff1f; 今天我依然用C语言写个爬虫程序&#xff0c;从百万数据库中查找到适合的文章&#xff0c;能节…

表的增删改查CURD(基础)

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;MySql&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 新增&#xff08;Create&#xff09; 全列插入 指定列…

【安装VMware Tools】实现Vmware虚拟机和主机之间复制、粘贴内容、拖拽文件

https://www.bilibili.com/video/BV1rN411277B/?spm_id_from333.788.recommend_more_video.6&vd_sourcefb8dcae0aee3f1aab700c21099045395 https://blog.csdn.net/wxqian25/article/details/19406673 待解决方案&#xff1a; 重新下载ubuntu&#xff0c;然后按照 https://…

华为:交换机忘记console密码重置

一、背景 许多旧项目经过长时间使用后&#xff0c;因为没有特定的管理运维人员&#xff0c;初始对接人也将初始账号密码等重要信息丢失&#xff0c;现需要进后台查看配置或更改网络配置&#xff0c;需重置密码 二、重置密码&#xff0c;不重置设备方法 1、使用console插入交…

域名群站开源系统分享开源域名授权系统

一、需要自己安装PHP和MYSQL服务器环境。 二、务必设置伪静态规则&#xff0c;否则将无法访问文章栏目页面。 三、启用伪静态功能&#xff0c;请在站点设置中选择使用thinkphp的伪静态规则。 四、在域名的根目录下找到”data/config.php”文件&#xff0c;填入数据库的账号和…