首页 > 其他分享 >有符号浮点运算的基本步骤:以双线性插值为例

有符号浮点运算的基本步骤:以双线性插值为例

时间:2024-08-16 18:26:59浏览次数:9  
标签:以双 12 为例 src always clk 线性插值 posedge rst

参考:韩彬的图像处理书、无双软件学院方法。

步骤一:无损定点化

浮点数在硬件计算中首先需要做的便是定点化,一般是左移一定位宽,可以是2048或4096;

这个过程要注意保障无损;

步骤二:运算和位宽匹配;

要确定所有参与计算的数小数位位宽是匹配的,否则无法进行任何层次的计算;

需要特别注意很多小数在计算的时候也需要定点化,例如:

always@(posedge clk)
    if(rst)    
        src_xf0 <= 'd0;
    else if(dst_de==1'b1)
        src_xf0 <= {dst_hcnt,2'd0} + 2;
    else
        src_xf0 <= 'd0;

这里做的计算是修改后的双线性插值中的中心对齐操作;

0.5左移两位变成了2;

步骤三:相乘后的截位处理

发生了相乘操作以后,整数和小数位宽都会发生变化,注意匹配;

此处小数位位宽为12,0.5左移12位后为2048;

//fix16_2 * fix16_12  = fix32_14        
always@(posedge clk)
    if(rst)    
        src_xf1 <= 'd0;
    else
        src_xf1 <= src_xf0*sx;
//fix26_12 - fix12_12  = fix26_12 可能为负数
always@(posedge clk)
    if(rst)    
        src_xf2 <= 'd0;
    else
        src_xf2 <= src_xf1[27:2] - 2048;

步骤四:加减处理后的正负判断;

目前为止的公式:src_x = (dst_x + 0.5) * scale_x - 0.5

always@(posedge clk)
    if(rst)    
        src_xf3 <= 'd0;
    else
        src_xf3 <= src_xf2;        

always@(posedge clk)
    if(rst)    
        src_x0 <= 'd0;
    else if(src_xf2[25]==1'b1)
        src_x0 <= 'd0;        
    else
        src_x0 <= src_xf2[25:12];

在这里的运算中,相减可能出现负数,这是显而易见的,但是此处xf2指的是坐标;(当然,相加如果坐标大于图像尺寸也会做匹配处理)

坐标不能有负数,最小是0;

在sobel里我也做了类似的操作;

always@(posedge clk)
    if(rst)    
        region_type <= 0;
    else if(src_x0>=SRC_IW-1&&src_y0>=SRC_IH-1&&src_xy_de==1'b1)
        region_type <= 1;
    else if(src_y0>=SRC_IH-1&&src_xy_de==1'b1)
        region_type <= 2;
    else if(src_x0>=SRC_IW-1&&src_xy_de==1'b1)    
        region_type <= 3;
    else
        region_type <= 4;

步骤五:符号化:

这里计算的就不是坐标,而是实际的像素值了;

实际的像素值也没有负值,但是这里计算出的数据可以用来后续对像素的增减,重要性判断,所以有正有负;

//fix26_12 - fix26_12 = fix26_12
always@(posedge clk)
    if(rst)    
        v <= 'd0;
    else
        v <= $signed(src_xf3) - $signed({src_x0,12'd0});    

后面没有太多指的说的,只需要记住实际使用的时候取出整数位数据;

还有就是小数位第一位是1代表了0.5,如果希望做四舍五入的话需要在整数位+1处理;

//fix25_12
always@(posedge clk)
    if(rst)
        cast_data <= 'd0;
    else if(line_data[24]==1'b1)
        cast_data <= 0;    
    else if(line_data[22:12]>=255)
        cast_data <= 255;
    else
        cast_data <= line_data[11] ? line_data[19:12] + 1'b1 : line_data[19:12];

 

标签:以双,12,为例,src,always,clk,线性插值,posedge,rst
From: https://www.cnblogs.com/VerweileDoch/p/18363433

相关文章

  • Linux--内核驱动框架(以字符设备驱动为例)
    下面将介绍一个简单的Linux内核驱动程序(部分),用于处理一个假设的字符设备(鼠标、键盘、串口、LED...),具体介绍如下:1头文件导入#include<linux/fs.h>//用于声明file_operations结构体和其他文件系统相关函数。#include<linux/module.h>//用于声明module_i......
  • 【微调大模型参数详解】以chatGLM为例
    微调chatGLM3-6b-base时涉及的一些重要参数的详细解释batch_size:批量大小,默认为4,每个GPU的训练批量大小。增加该值可以提高训练速度,但可能需要更多的显存。lora_r:LoraR维度,默认为64,指定Lora训练中用于调节的R维度大小。该参数影响Lora模块的复杂度和模型的表现。......
  • 以定时器为例研究一手 Python asyncio 的协程事件循环调度
    在使用Python的asyncio库实现异步编程的过程中,协程与事件循环这两个概念可以说有着千丝万缕的联系,常常是形影不离的出现,如胶似漆般的存在,asyncio库到底是如何调度协程的?下面以Python3.8中的asyncio.sleep定时器为例研究一手asyncio的源码实现。几个主要的概念首先......
  • 环境配置:如何在IntelliJ IDEA中安装和修改JDK版本配置(以Windows为例)
    环境配置:如何在IntelliJIDEA中安装和修改JDK版本配置(以Windows为例)为了在Java开发中使用最新的功能和优化,升级和配置JDK版本是必不可少的。本文将详细介绍如何下载、安装、配置最新的JDK版本,并在IntelliJIDEA中正确设置项目的JDK版本,确保你的开发环境能够支持最新的Java......
  • 使用SiliconCloud尝试GraphRag——以《三国演义》为例(手把手教程,适合小白)
    使用SiliconCloud尝试GraphRag——以《三国演义》为例(手把手教程,适合小白)使用OpenAI模型体验GraphRag——以《边城》为例在使用SiliconCloud之前,先使用OpenAI的模型看看GraphRag的效果。GraphRAG是一种基于AI的内容理解和搜索能力,利用LLMs,解析数据以创建知识图谱,并对用户......
  • 以DenseNet为例进行AI算法部署集成
    以DenseNet为例进行AI算法部署集成AI越用越广,但落地使用的时候各种bug多多,这里提供一些离线集成的导引方便大家学习,后面也会尝试更新一些webapi的集成方式,请期待后续的博客简单性能表格下列表格为一些简单的部署数据搜集,通过部署器进行离线集成,可以看到可以大大降低资源......
  • 使用SiliconCloud尝试GraphRag——以《三国演义》为例(手把手教程,适合小白)
    使用OpenAI模型体验GraphRag——以《边城》为例在使用SiliconCloud之前,先使用OpenAI的模型看看GraphRag的效果。GraphRAG是一种基于AI的内容理解和搜索能力,利用LLMs,解析数据以创建知识图谱,并对用户提供的私有数据集回答用户问题的方法。GitHub地址:https://github.com/microsoft......
  • 『SD』Stable Diffusion WebUI 安装插件(以汉化为例)
    前言本文简介StableDiffusionWebUI是允许用户自行安装插件的,插件的种类有很多,有将页面翻译成中文的插件,也有提示词补全插件,也有精细控制出图的插件。以汉化为例,StableDiffusionWebUI默认是英文的,我们只需装个汉化插件然后重启一下项目就能把页面变成中文了。安装......
  • 深度学习基础案例2--从0到1构建CNN卷积神经网络(以识别CIFR10为例)
    ......
  • 以Zed项目为例学习大型Rust项目的组织与管理
    说明Zed项目代码:https://github.com/zed-industries/zed.git本文项目代码:https://github.com/VinciYan/zed_workspace.gitZed是一款由Atom创始人开发的高性能、协作友好的现代开源代码编辑器,使用Rust编写,集成AI辅助功能,旨在结合传统编辑器的速度和现代IDE的智能特性Zed项目......