AAN算法描述及其实现

从算法到电路:基于AAN算法的JPEG DCT FPGA高效实现路径 本文深入探讨了基于AAN算法的JPEG DCT在FPGA上的高效实现路径。通过AAN算法的数学优化,将传统DCT的64次乘法运算降至仅需5次,显著节省FPGA的DSP资源并提升处理速度。文章详细解析了算法原理、硬件实现技巧及实际项目中的优化经验,为图像处理领域的FPGA设计提供了实用指导。 阅读详情

AAN算法描述及其实现

 

最近在学习DCT和MDCT发现网络上JPEG编码的资料蛮多, 而且DCT是JEPG压缩里头比较重要的一个环节. 单单描述DCT算法的资料比较少, 看看JEPG编码里头的DCT部分也不失为一个好的学习方法.

 

 

二维DCT

 

如果按照二维DCT公式来计算8*8像素的话, 获得一个DCT系数需要8*8=64次乘法和8*8=64次加法, 而完成整个8*8像素的DCT需要8*8*8*8=4096次乘法和8*8*8*8=4096次加法. 计算量是相当的大!

 

伪代码(N=8, PI=3.1415926):

 

int           u, v, i, j;   // u, v描述输出; i,j描述输入.

double        c_u, c_v;  //

unsigned char in_data[N][N] = { 数据 }; // 注意输入数据的类型, 色彩空间的范围是[0, 255]

double        out_data[N][N] = null;

 

for(u=0; u<N; u++)

{

    for(v=0, out_data[u][v]=0.0; v<N; v++)

{

    // 内层处理输入

       for(i=0; i<N; i++)

       {

           for(j=0; j<N; j++)

           {

              if(u==0)   c_u = sqrt(1.0/N);

              else       c_u = sqrt(2.0/N);

              if(v==0)   c_v = sqrt(1.0/N);

              else       c_v = sqrt(2.0/N);

             

    out_data[u][v] += c_u*c_v*in_data[i][j]

*cos((2*i+1)*u*PI/(2*N))*cos((2*j+1)*v*PI/(2*N)) / 4;

           }

}

}

}

这就是和二维DCT公式对应的伪代码, 未做任何优化, 运算量非常庞大, 复杂度为(N*N*N*N). 无论是软件还是硬件实现(即使是对这个算法进行优化, 如果架构不修改的化)都是非常的困难的!

 

 

一维DCT

 

二维DCT可以转换为一维DCT来计算, 那么8行8列的话, 对于一行来说需要计算的是(8*8)次乘法和(8*8)次加法, 而8行就需要计算8*(8*8)次乘法和8*(8*8)次加法. 对于列来说也是同样. 那么处理完一个block就需要计算2*(8*(8*8))=1024次乘法和2*(8*(8*8))=1024次加法, 运算量变为二维计算的1/4.

但是仍然显得够大.

 

伪代码

So tired! 以下省略代码100行...

 

 

 

 

 

AAN算法描述

a1=0.707, a2=0.541, a3=0.707, a4=1.307, a1=0.383

整个AAN算法流程如上图. 其中黑点表示加法, 箭头表示乘以-1, 方块表示乘法. 可以看出算法分为6个层.

输入为f[N] = {f0, f1, f2, f3, f4, f5, f6, f7};

输出为F[N] = {F0, F1, F2, F3, F4, F5, F6, F7};

 

那么AAN算法的伪代码描述为 :

 

// 第一层. 有一点FFT蝶型算法的味道. 第一层是以原始数据作为输入的.

tmp1_0 = f0 + f7;

tmp1_1 = f1 + f6;

tmp1_2 = f2 + f5;

tmp1_3 = f3 + f4;

tmp1_4 = f3 + (-1)*f4;   // 就是减法, 可以认为箭头是减法的.

tmp1_5 = f2 + (-1)*f5;

tmp1_6 = f1 + (-1)*f6;

tmp1_7 = f0 + (-1)*f7;

 

// 第二层, 是以第一层输出作为输入的

tmp2_0 = tmp1_0 + tmp1_3;

tmp2_1 = tmp1_1 + tmp1_2;

tmp2_2 = tmp1_1 + (-1)*tmp1_2;

tmp2_3 = tmp1_0 + (-1)*tmp1_3;

 

tmp2_4 = (-1)*tmp1_4 + (-1)*tmp1_5;

tmp2_5 = tmp1_5 + tmp1_6;

tmp2_6 = tmp1_6 + tmp1_7;

tmp2_7 = tmp1_7;

 

// 第三层, 是以第二层输出作为输入的

tmp3_0 = tmp2_0 + tmp2_1;

tmp3_1 = tmp2_0 + (-1)*tmp2_1;

tmp3_2 = tmp2_2 + tmp2_3;

tmp3_3 = tmp2_3;  // 这些可以不需要的

tmp3_4 = tmp2_4;

tmp3_5 = tmp2_5;

tmp3_6 = tmp2_6;

tmp3_7 = tmp2_7;

 

// 第四层, 是以第三层的输出作为输入的

tmp4_0 = tmp3_0;

tmp4_1 = tmp3_1;

tmp4_2 = tmp3_2*a1;

tmp4_3 = tmp3_3;

tmp4_4 = tmp3_4*a2*(-1) + (tmp3_4+ tmp3_6)*a5*(-1);

tmp4_5 = tmp3_5*a3;

tmp4_6 = tmp3_6*a4 + (tmp3_4 + tmp3_6)*a5*(-1);

tmp4_7 = tmp3_7;

 

// 第五层

tmp5_0 = tmp4_0;

tmp5_1 = tmp4_1;

tmp5_2 = tmp4_2 + tmp4_3;

tmp5_3 = tmp4_2*(-1) + tmp4_3;

tmp5_4 = tmp4_4;

tmp5_5 = tmp4_5 + tmp4_7;

tmp5_6 = tmp4_6;

tmp5_7 = tmp4_5*(-1) + tmp4_7;

 

// 第六层, 也该到终点了, 寡人都累坏了 :)

tmp6_0 = tmp5_0;

tmp6_1 = tmp5_1;

tmp6_2 = tmp5_2;

tmp6_3 = tmp5_3;

tmp6_4 = tmp5_4 + tmp5_7;

tmp6_5 = tmp5_5 + tmp5_6;

tmp6_6 = tmp5_5 + (-1)*tmp5_6;

tmp6_7 = (-1)*tmp5_4 + tmp5_7;

 

// 功德圆满

F[0] = tmp6_0;

F[4] = tmp6_1;

F[2] = tmp6_2;

F[6] = tmp6_3;

F[5] = tmp6_4;

F[1] = tmp6_5;

F[7] = tmp6_6;

F[3] = tmp6_7;

 

伪代码怎么看怎么像FFT蝶形算法.

这个描述比较中规中矩, 中间有一些空心圆, 是可以直接优化的. 不需要这么多临时变量的. 为了使算法描述的更新清晰和AAN运算流更一致, 我觉得规范的AAN算法应该要写出这些”不必要”的部分.

 

下面给出JEPG编码里头的AAN部分, 这个代码是经过优化的.

优化思想有2个方面.

1. 空心点不在参与到代码中;

2. 完成第一阶后, 之后的阶都是很明显个行其事的, tmpi_0到 tmpi_3是相关的, tmpi_4到tmpi_7是相关的. 很明显的分为了两条路. (其中i表示层, i>1)

    /*

     * AAN算法第一阶变换

     */

    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];

   

    /* Even part 偶数部分 */

    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) * ((double) 0.707106781);

    dataptr[2] = tmp13 + z1; /* phase 5 */

    dataptr[6] = tmp13 - z1;

   

    /* Odd part 奇数部分 */

    tmp10 = tmp4 + tmp5; /* phase 2 */

    tmp11 = tmp5 + tmp6;

    tmp12 = tmp6 + tmp7;

   

    /* The rotator is modified from fig 4-8 to avoid extra negations. */

    z5 = (tmp10 - tmp12) * ((double) 0.382683433); /* c6 */

    z2 = ((double) 0.541196100) * tmp10 + z5; /* c2-c6 */

    z4 = ((double) 1.306562965) * tmp12 + z5; /* c2+c6 */

    z3 = tmp11 * ((double) 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;

   

   

为什么?

只知其然不知其所以燃是不对的, 对于AAN算法的理论推导我很困惑. 只是模糊的知道一点点, 很可能不对.一并记录如下 :

1. 信号是具有频率的, 有高频低频, 不管是图象还是Audio, 人类都是对低频部分是比较敏感, 那么处理JPEG图象或者Audio的时候都是希望能让低频部分保留多一些, 高频部分过滤多一些.

2.

 

 

参考文献

<<Implementation of Motion-JPEG Using an ASIC Prototype Board>>  Master’s Thesis

 

FPGA上实现JPEG压缩核心:手把手教你用AAN算法搞定8x8 DCT(附Verilog代码) 本文详细介绍了在FPGA上利用AAN快速算法实现8x8 DCT变换模块的全过程,从JPEG压缩基础到Verilog代码实现。通过优化算法和硬件设计,将传统DCT的64次乘法减少到仅需5次,显著提升FPGA资源利用效率。文章包含完整的工程解决方案,适合嵌入式图像处理开发者参考实践。 阅读详情

相关推荐

FPGA上做图像处理,别从零写DCT了!聊聊AAN算法如何省掉8个乘法器

本文深入探讨了在FPGA上实现高效图像处理的关键技术,重点介绍了AAN算法如何通过数学优化将8点DCT的乘法操作从8次减少到5次,显著节省硬件资源。通过Verilog代码示例和量化模块协同设计,展示了该算法在Zynq 7000等中低端FPGA上的实际应用价值,帮助开发者实现更高效的JPEG编码器设计。

weixin_42530458的博客 185

快速DCT算法:AAN实现解析

本文介绍了AAN快速DCT算法在JPEG图像压缩中的应用。针对8点一维DCT变换,通过将偶频和奇频部分分别处理,利用余弦函数特性和中间变量优化,将计算量从64次乘法降至5次乘法和29次加减法。文章详细推导了算法原理,并给出MATLAB实现代码,验证了与标准DCT函数结果的一致性。对于二维DCT变换,可通过行列两次一维变换实现。该算法显著提升了计算效率,适用于资源受限的JPEG压缩场景。

FuJin_的博客 1066

FPGA资源不够用?试试用AAN算法给JPEG的DCT模块“瘦身”,实测节省多少逻辑单元

本文探讨了在FPGA资源受限情况下,如何通过AAN算法优化JPEG的DCT模块,实现逻辑单元的高效节省。实验数据显示,采用AAN算法后,LUTs资源节省达40%以上,同时保持图像质量无损。文章详细解析了算法实现、位宽精度平衡及实战优化技巧,为边缘计算和小型化图像处理系统提供了可行的解决方案。

weixin_26795617的博客 176

aan 算法 c 语言示例 (转)

aan 算法 c 语言示例 (转)[@more@]static int SpreSC[64]={ 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, 22725, ...

circularr9834的博客 373

AAN算法 图像压缩方面的

AAN算法 图像压缩 希望能给你带来帮助

图像的离散余弦变换(DCT)

离散余弦变换(DCT,Discrete Cosine Transform)的变换核为实数的余弦函数,因而DCT的计算速度要比变换核为复指数的DFT要快得多。离散余弦变换是仅次于K-L变换的次最佳正交变换,且有这样的性质:许多有关图像的重要可视信息都集中在DCT变换的一小部分系数中,因此已被广泛应用到图像压缩编码、语音信号处理等众多领域,并成为许多图像编码国际标准的核心。

JPEG 简易文档 V2.11- -

 转载:JPEG 简易文档 V2.11- -                                       写在前面--------1. 为什么写这个文档?    云风想对 JPEG/MPEG 有一个系统的研究, 但是苦于找到好的资料. 而英文水平又    不怎样, 所以在学习的过程,    将已经了解了的东西记录下来. 方便自己在编写    代码

gotomic的专栏 1636

从零构建:四轴机械臂D-H参数建模与MATLAB实战指南

本文详细介绍了四轴机械臂D-H参数建模的完整流程与MATLAB实战应用。从机械臂运动学基础出发,解析D-H参数原理与坐标系建立规则,提供MATLAB Robotics Toolbox的安装、模型创建及正逆运动学求解的代码实现。特别针对四轴机械臂的逆运算优化、轨迹规划和奇异位形规避等高级应用给出实用解决方案,是机器人开发者的实战指南。

weixin_29062255的博客 420

c JPEG 1D DCT 优化二(AAN)

优化DCT就是用代码实现矩阵9,10。这两个图可能就是AAN 的数学模型。

m0_59802969的博客 755

PL/SQL 中的数据导入和导出:CSV 文件格式详解

在 PL/SQL 开发中,数据的导入和导出是常见的操作。本文将深入探讨如何使用 PL/SQL 导入和导出 CSV 文件格式的数据,帮助你轻松地实现数据迁移、备份和数据交换等需求。CSV(Comma-Separated Values)是一种常见的文本文件格式,它以逗号作为字段的分隔符,每行表示一个记录。使用 CSV 格式可以方便地在不同的系统之间共享和传输数据。下面我们将分步介绍如何在 PL/SQL 中导入和导出 CSV 文件格式的数据。

pleaseprintf的博客 8838

机器学习之性能度量

废话不说,本文分为两个部分: 第一部分,我对周志华教授《机器学习》这本书中性能度量知识点中疑难点的学习感悟;第二部分,我感觉该书2.3节 性能度量 中最后部分的代价曲线表述有误,苦于没找到联系教授的正确方式,故希望与广大网友一起探讨。

hustqb的博客 4630

自适应对抗网络(AAN)深度解析:原理、应用与未来布局

总结:AAN的优缺点一览优点训练稳定:动态机制有效缓解了模式崩溃和训练震荡。灵活适应:能自动适应不同数据、任务和资源约束。生成质量高:通过渐进式、条件化生成,细节更丰富。可控性强:对生成过程的干预更精细,便于与人类意图对齐。缺点计算复杂:动态调整引入额外开销,训练和推理速度可能慢于固定架构模型。设计复杂:元控制器、门控机制等组件的设计需要深厚的领域知识。理论分析难:动态系统行为比静态网络更难以分析和保证收敛性。自适应对抗网络(AAN)通过引入动态调整机制,有效提升了生成模型的稳定性适应性和。

523

PCI Express 权威指南:从协议原理到芯片实现

目录 全文总览第一部分:PCIe体系结构概览第1章 互连技术的演进与PCIe的诞生1.1 从ISA到PCI:并行总线的辉煌与瓶颈1.2 PCI-X的尝试与局限1.3 串行革命:从AGP、PCI到PCIe的范式转移1.4 PCIe的核心优势第2章 PCIe系统全局视角2.1 系统拓扑:Root Complex, Switch, Endpoint的职能与关系2.2 拓扑结构实例:服务器、工作站、嵌入式系统2.3 枚举与配置:系统如何发现和组织PCIe设备2.4 地址空间第3章 PCIe协议分层架构3.1 分层模

qq_42882296的博客 2897

aan 算法 c 语言示例

static int SpreSC[64]={  16384, 22725, 21407, 19266,  16384, 12873, 8867,  4520,  22725, 31521, 29692, 26722,  22725, 17855, 12299, 6270,  21407, 29692, 27969, 25172,  21407, 16819, 11585, 5906,  1926

baojinlong的专栏 1457

RHCA III之路---EX436-1

由于ha这门课有大量命令需要在3个节点上同步执行.如果执行history会出现前面数字,复制多行会有些麻烦.lab环境是nodea,nodeb,nodec 考试环境是node1,node2,node3。就可以快速将历史命令实现可多行复制,当然也可以用awk进行分割,个人喜好随意。技巧只能加快答题速度,对考试得分帮助不大。确认3个红框内容一致,且没报错即可。再执行一个histrory。3个node节点上运行。这样就能1次复制3行。

Q先生 1011

华为OD机试真题 新系统 2026-08-02 C++ 实现【战士技能规划设计】

你为一款动作游戏设计战士角色的技能。战士每个技能会消耗不同能量,释放技能有两个约束:连续释放技能数量不能超过 m 个,技能能量总和不能超过能量上限 k;如果超过则必须中断当前技能,进入调息状态,也就是分段。

MISAYAONE的博客 77

8x8离散余弦的快速精确实现使用数据流单指令多数据扩展指令集进行转换MMX 说明书

1.2.

m0_59802969的博客 719

RK3588开发笔记-Hailo AI模块调试

本文详细介绍了在RK3588开发板上调试HailoAI模块的全过程。首先概述了RK3588处理器的强大性能(4核A76+4核A55,6TOPS算力)和Hailo-8 AI加速模块的特点,重点阐述了通过PCIe接口连接两者的硬件方案。调试步骤包括:确认内核PCIe配置、编译Hailo驱动、下载固件文件并部署到指定目录,最后通过运行resnet模型验证模块性能(实测FPS达2456)。文中提供了完整的软件包下载地址和GitHub源码链接,为开发者实现类似AI加速方案提供了实用参考。

flypig has a dream! 965

离散余弦变换的改进

离散余弦变换的改进fficeffice" />[/B] 邓景仁(sgdjr2003) 2004年11月12日星期五 摘要:[/B] 关键词:[/B] 1 前言[/B] 由于我还是高一新丁,文学底子很薄弱,对于一些技术方面的知识,我是有口说不出,无法用文字表达出来,因此这里提供的知识只是我 所知道的1/4左右,还有3/4我不知该如何表达,特别是第三节“ 深入研究DCT”,我个人认为简直是浅入

dd167的专栏 5107

手把手教你学pcie--用Verilog搭建PCIe控制器核心模块

PCIe控制器是硬件设计的核心模块,负责实现设备与主机之间的高速通信。本文将以Verilog语言为例,分步骤讲解如何从零构建一个简化的PCIe控制器核心模块,涵盖事务层(TLP)生成、数据链路层(DLLP)处理和物理层(PHY)接口适配。目标是为嵌入式开发者、FPGA工程师提供一个可扩展的硬件设计框架。​。

MHD0815的博客 341

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【图像压缩】基于DCT实现图像压缩matlab源码含GUI

一、简介 1 DCT算法:DCT变换的全称是离散余弦变换(Discrete Cosine Transform),离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变换是对一个实偶函数进行的。通过数字信号处理的学习我们知道实函数的傅立叶变换获得的频谱大多是复数,而偶函数的傅立叶变换结果是实函数。以此为基...

Matlab_dashi的博客 76

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

FPGA实现8x8二维DCT:从算法选型到硬件架构全复盘

离散余弦变换(DCT)是图像与视频压缩标准中的核心算法,通过将像素域变换到频率域实现能量集中与去相关,为后续量化与熵编码奠定基础。在实时图像处理场景下,FPGA凭借数据流规则、乘加密集、天然适合流水线与并行化的优势,成为硬件加速的优选方案。本文从二维DCT的可分离性出发,详解行列分解、AAN快速算法、蝶形运算与旋转因子的硬件映射,重点讨论行-转置-列三段式流水线架构、乒乓RAM缓冲、位宽规划与定点化精度控制,并结合Verilog实现骨架给出工程实践路径。内容覆盖从算法选型到上板验证的完整闭环,为构建可复用的

weixin_29185167的博客 187

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: FFT原理及实现(Radix-2)
下一篇: 数据结构与问题求解(AS2描述)
xiaomantoubaba
博客等级 码龄23年 75粉丝 44原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值