Matlab里面的浮点数与FPGA定点数的相互转化应用(含Matlab代码,封装成函数可直接调用)

微信公众号获取更多FPGA相关源码:
在这里插入图片描述

1.前言

Matlab里面计算通常用的是浮点数,而FPGA在做数字信号处理时,为了节约资源,常常使用的是定点数。在实践中,我们经常需要将Matlab实现中的算法,用FPGA进行实现。

那么,Matlab里面的是浮点数怎么转换为定点数到FPGA里面进行使用,以及FPGA里面计算的定点数,怎么又在Matlab里面又转换为浮点数进行验证呢?

2.模拟信号——>数字信号

模拟信号是需要通过采样、量化、编码才能转化为数字信号进行处理。
image

模拟信号——>数字信号

通常在Matlab里面仿真算法的时候,只是将模拟信号进行了采样,即时间域上做了离散处理,使模拟信号变成数字序列,但是并没有将幅度值进行量化和编码,是不能够直接用于FPGA处理的。

2.1采样过程

采样过程是进行模拟信号数字化的第一步,模拟信号被采样后,称为采样信号,采样信号在时间上是离散的,但在取值上仍然是连续的,因此仍然是模拟信号。在采样时就不得不提及采样定理:

若想能够从采样后信号中恢复出原始信号,则采样信号的频率至少为原始信号最大频率的2倍,该频率又被称为奈奎斯特频率。

在理想情况下可以看作是用一连串的冲激函数与原始信号进行相乘,若要对采样信号求频谱可以先求冲击串的傅里叶级数,再用傅里叶级数来表示其傅里叶变换,即可以较少的计算量求出采样信号的傅里叶变换。

但在matlab中则不常采用这种方式,常采用的方式为,规定好时间间隔和起始时间后,对原始信号的每个规定时间间隔后的点进行取样,即可得到采样函数。

2.2量化

这里只讨论均匀量化:设模拟抽样信号的取值范围在a和b之间,量化电平数为M,则在均匀量化时的量化间隔为:
Δ v = b − a M Δ v =\frac{b-a}{M} Δv=Mba

且量化区间的端点为:
m i = a + i Δ v m i =a+i \Delta v mi=a+iΔv

设对模拟信号的抽样值为: m ( k T s ) m(kTs) m(kTs) 所选均匀量化的量化区间端点为: m 1 , m 2 , m 3 . . . . . . m n m_1,m_2,m_3......m_n m1,m2,m3......mn
,则根据公式:
m q ( k T s ) = q i ,( m i − 1 ⩽ m ( k T s ) ⩽ m i ) m_q\left( kT_s \right) =q_i\text{,(}m_{i-1}\leqslant m\left( kT_s \right) \leqslant m_i\text{)} mq(kTs)=qi,(mi1m(kTs)mi

就把模拟抽样信号 m ( k T s ) m(kTs) m(kTs)变换成了量化后的离散抽样信号,即量化信号。

非均匀量化读者感兴趣可以自行查阅相关资料。

2.3编码

前面的几篇文章中,我们详细讲解了计算机算法中的数字表示法。在使用FPGA进行信号处理时,常采用有符号的二进制补码进行存储计算。

定点数表示法

以 8 位为例,我们约定从高位开始,1位符号位,4位整数位,后3位表示小数部分。

对于数字 -1.5 用定点数表示就是这样:

首先表示数字正的1.5,即原码:
1. 5 ( D ) = 0000110 0 ( B ) 1.5_{(D)} = 00001 100_{(B)} 1.5(D)=00001100(B)
符号位不变,其余各位取反,+1得:
0111001 1 ( B ) + 1 = 0111010 0 ( B ) 01110 011_{(B)} + 1 = 01110 100_{(B)} 01110011(B)+1=01110100(B)
然后对于负数,符号位填充为"1"得数字 -1.5 用定点数表示:
− 1. 5 ( D ) = 1111010 0 ( B ) -1.5_{(D)} = 11110 100_{(B)} 1.5(D)=11110100(B)

表示步骤如下:

1.在有限的 bit 宽度下,先约定小数点的位置,一般取高位为符号位
2.先不管符号,整数部分和小数部分,分别转换为二进制表示
3.对于正数,两部分二进制组合起来,即是结果
4.对于负数,除符号位进行取反,然后+1,符号位填充"1"

3.举例说明

比如前面在进行OFDM调制映射时,复数以8位定点数形式进行输出,格式为:1位符号位,一位整数位,6位小数位,负数以补码形式表示。

16QAM调制的星座图映射如下表:

Input bits (b0 b1)I-outInput bits (b2 b3)Q-out
00–300–3
01–101–1
111111
103103

映射过后,为了使平均功率一致,还需要乘上归一化因子,这就使得调制后的输出是复数形式的小数。

归一化因子

当输入为0 1 1 0时,映射后实部和虚部输出分别是-1,3。进行归一化后为 − 0.3125 + 0.9531 i -0.3125 + 0.9531i 0.3125+0.9531i。编码过后是11000011 + 00111101i。

这一步是怎么做到的呢?在Matlab中我是这样做的,当然也有其他办法,答案不唯一。

3.1 Quantizer函数:按给定间隔将输入离散化

在Matlab中,Quantizer 模块使用量化算法离散化输入信号。该模块使用舍入到最邻近整数方法将信号值映射到由量化区间定义的输出端的量化值。平滑的输入信号在量化后可能会呈现阶梯形状。

可以去看官方文档:https://ww2.mathworks.cn/help/simulink/slref/quantizer.html

以下方程用数学方法说明舍入到最邻近整数方法:

y = q ∗ r o u n d ( u / q ) y = q * round(u/q) y=qround(u/q)
其中,y 是量化输出,u 是输入,q 是量化区间。

在matlab命令行窗口输入:

q= quantizer()

如下图:
image
可以看到量化格式q包含着四个参数‘datamode’,‘roundmode’,‘overflowmode’,‘format’,默认分别是’fixed’,‘floor’,‘saturate’,[16,15]。

quantizer函数的4个输入参数,不限制输入顺序,不限制输入个数。但还是按顺序分别输入好。

四个参数的意思和可选择的模式如下:

1)DataMode数据类型,默认是’fixed’。除默认还有4种。

‘fixed’— 有符号定点模式。

‘ufixed’— 无符号定点模式。

‘float’— 自定义精度浮点模式。

‘single’— 单精度模式。此模式将覆盖所有其他属性设置。

‘double’— 双精度模式。此模式将覆盖所有其他属性设置。

2)RoundMode取整模式,默认是‘floor’。除默认还有5种

‘floor’— 向下舍入到下一个允许的量化值。
‘convergent’— 舍入到最接近的允许量化值。仅当舍入后的最低有效位设置为 0 时,恰好位于两个最接近的允许量化值之间的数字才会向上舍入。

‘fix’— 向上舍入负数,将正数向下舍入到下一个允许的量化值。

‘ceil’— 向上舍入到下一个允许的量化值。

‘nearest’— 舍入到最接近的允许量化值。介于两个最接近的允许量化值之间的数字将向上舍入。

‘round’— 舍入到最接近的允许量化值。介于两个最接近的允许量化值之间的数字将以绝对值向上舍入。

3)OverFlowMode溢出如何处理,默认’saturate’,针对定点类型的参数,如果对浮点型设置了这个参数会没用,不会报错。

‘saturate’— 溢出饱和。

当要量化的数据值位于数据格式属性指定的最大和最小可表示数字的范围之外时,这些值将量化为最大或最小可表示值的值,具体取决于哪个值最接近。

‘wrap’— 溢出换行到可表示值的范围。

更换范围。超出动态范围的浮点数溢出到 ±Inf

4)Format数据的格式,默认[16,15]。

对于fixed和ufixed是【数据全长,小数位长】

例如fixed,设置[8,6],数据全长8,小数位长6,符号位占1位,整数位占1位,所以能表示的数据范围是[-2,1.984375]。对应二进制’10000000’ ‘01111111’。

以上四种参数按需求设置即可。

3.2 num2bin函数:使用 quantizer 对象将数字转换为二进制表示

语法:

y = num2bin(q,x);

说明:

y = num2bin(q,x) 使用 quantizer 对象 q 指定的数据类型属性,将数值数组 x 转换为在 y 中返回的二进制字符向量。

如果 x 是包含数值矩阵的元胞数组,则 y 将是包含二进制字符串的相同维数的元胞数组。如果 x 是结构体,则 x 的每个数值字段都会转换为二进制。

[y1,y2,…] = num2bin(q,x1,x2,…) 将数值矩阵 (x1, x2 …) 转换为二进制字符串 (y1, y2 …)。

更详细的,可以去官网查看:https://ww2.mathworks.cn/help/fixedpoint/ref/num2bin.html

4.Matlab代码

下面是一个16-QAM调制映射,复数以8位定点数形式进行输出,格式为:1位符号位,一位整数位,6位小数位,负数以补码形式表示的Matlab代码。

%function [map_data]=maping(data_in)
data_in = [0 1 1 0];
%16QAM调制,符合802.11a标准
%%data_in为输入数据
%data_outI,data_outQ为映射后的星座数据
% Input bits (b0 b1) I-out Input bits (b2 b3) Q-out
%              00     –3               00     –3
%              01     –1               01     –1
%              11       1               11       1
%              10       3               10       3
Kmod=sqrt(10);%归一化量
L=length(data_in)/4;%I,Q支路输出的长度
%IQ初始化
data_outI=zeros(1,L);
data_outQ=zeros(1,L);
%星座映射
for k=1:L
    switch (data_in(4*k-3))*2+data_in(4*k-2)    %data_outI
        case 0      %00
            data_outI(k)=-3;
        case 1      %01
            data_outI(k)=-1;
        case 3   %11
            data_outI(k)=1;
        case 2      %10
            data_outI(k)=3;
        otherwise
            
    end
    switch (data_in(4*k-1))*2+data_in(4*k)   %data_outQ
        case 0      %00
            data_outQ(k)=-3;
        case 1      %01
            data_outQ(k)=-1;
        case 3      %11
            data_outQ(k)=1;
        case 2      %10
            data_outQ(k)=3;
        otherwise
            
    end
end
%归一化
data_outI=data_outI/Kmod;
data_outQ=data_outQ/Kmod;
map_data = data_outI + data_outQ*1j;
q = quantizer('fixed','round','saturate',[8,6]);
map_data = num2bin(q,map_data);
%map_data = bin2num(q,map_data)';

取消注释第一行,将第二行注释,可以当成函数调用。
微信公众号获取更多FPGA相关源码:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高效训练超越LoRA,北航发布MoRA

什么!LoRA我都没有学懂,又出现了MoRA??? LoRA作为当下最火热的大语言模型参数高效微调技术,正在以前所未有的速度迭代更新。从最初的LoRA到陆续推出的LoRA、DoRA、AsyLoRA等变体,LoRA家族可谓是…

深入探究 threejs 中的材质与纹理应用

深入探究 threejs 中的材质与纹理应用 一、引言 在三维图形开发领域,Three.js 是一个强大而受欢迎的库。其中,材质与纹理的应用对于创建逼真和吸引人的三维场景起着至关重要的作用。通过对材质和纹理的巧妙运用,可以极大地增强模型的视觉效…

C# WinForm —— 26 ImageList 介绍

1. 简介 图片集合,用于存储图像的资源,并在关联控件中显示出来 可以通过 索引、键名 访问每张图片 没有事件 2. 属性 属性解释(Name)控件ID,在代码里引用的时候会用到,一般以 imgList 开头ClolorDepth用于呈现图像的颜色数,默…

【开源】Wordpress自定义鼠标样式插件

插件简介 使用此插件可一键自定义Wordpress前端鼠标指针样式。利用该插件,站长可以快速实现替换多种鼠标指针样式于网站前端。 鼠标图案均来自于网络,插件仅作收集整理,插件完全开源无任何商业性质。 插件截图 使用教程 下载插件文件 下载…

Mybatis第一讲——你会Mybatis吗?

文章目录 什么是MybatisMybatis的作用是什么 Mybatis 怎么使用注解的方式注解的多种使用Options注解ResultType注解 XML的方式update标签 #{} 和 ${}符号的区别#{}占位${}占位 ${}占位的危险性(SQL注入)数据库连接池 什么是Mybatis 首先什么是Mybatis呢?Mybatis是一…

Ps:调整画笔工具

调整画笔工具 Adjustment Brush Tool可以将选区、创建蒙版和应用调整的传统工作流程合并为一个步骤,简化了对图像进行非破坏性局部调整的操作。 快捷键:B 调整画笔工具是 Photoshop 2024 年 5 月版(25.9 版)新增的工具。 ◆ ◆ …

Stable Diffusion生成图片的参数查看与抹除方法

前几天分享了几张Stable Diffusion生成的艺术二维码,有同学反映不知道怎么查看图片的参数信息,还有的同学问怎么保护自己的图片生成参数不会泄露,这篇文章就来专门分享如何查看和抹除图片的参数。 查看图片的生成参数 1、打开Stable Diffus…

Redis常用命令——List篇

提到List,我们第一时间想到的就是链表。但是在Redis中,List更像是一种双端队列,例如C中的deque。它可以快速高效的对头部和尾部进行插入和删除操作。本片文章主要对List列表的相关命令进行详解,希望本篇文章会对你有所帮助。 文章…

vscode常用插件及插件安装方式

一、常用插件 Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code 说明:中文语言包扩展(简体) open in browser 说明:可以在默认浏览器或应用程序中打开当前文件 Auto Rename Tag 说明:自动重…

pyqt 进度条QProgressBar

pyqt 进度条 QProgressBar效果代码 QProgressBar 在 PyQt 应用程序中,进度条(通常称为 QProgressBar)是一个用于显示任务进度的控件。它可以显示一个水平或垂直的条形图,条形图的长度会随着进度的增加而增加。 QProgressBar 的主…

C语言---文件操作

【C语言详解】——文件操作&#xff08;建议收藏&#xff09;_c语言 写文件原理-CSDN博客 一、文件的读取 # define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<errno.h> #include<string.h>int main() {FILE * pffopen("C:\\Users\\zhw\\De…

【电路笔记】-带阻滤波器

带阻滤波器 文章目录 带阻滤波器1、概述2、典型带阻滤波器配置3、带阻滤波器示例14、陷波滤波器5、带阻滤波器示例26、总结带阻滤波器也称为陷波滤波器,阻止并拒绝位于其两个截止频率点之间的频率,并传递该范围两侧的所有这些频率。 1、概述 通过将基本 RC 低通滤波器与 RC …

Python自动实时查询预约网站的剩余名额并在有余额时发邮件提示

本文介绍基于Python语言&#xff0c;自动、定时监测某体检预约网站中指定日期的体检余额&#xff0c;并在有体检余额时自动给自己发送邮件提醒的方法。 来到春招末期&#xff0c;很多单位进入了体检流程。其中&#xff0c;银行&#xff08;尤其是四大行&#xff09;喜欢“海检”…

springboot基础及上传组件封装

简介 本文主要以文件上传为demo&#xff0c;介绍了一些 springboot web 开发的入门的技术栈。 对应刚接触 springboot 的可以参考下。 主要包括文件md5比对、生成图片缩略图、数据库迁移、文件记录持久化、请求全局异常处理等功能。 准备工作 在 idea 中创建项目&#xff…

十大排序 —— 快速排序

十大排序 —— 快速排序 快速排序一些坑快速排序的性能优点&#xff1a;缺点&#xff1a;性能优化&#xff1a; 我们今天来看看十大排序中很出名的一个算法——快速排序&#xff1a; 快速排序 快速排序&#xff08;Quick Sort&#xff09;是一种经典的、高效的排序算法&#…

centos8stream 编译安装 php-rabbit-mq模块

官方GitHub&#xff1a;https://github.com/php-amqp/php-amqp 环境依赖安装 dnf install cmake make -y 1.安装rabbitmq-c cd /usr/local/src/ wget https://github.com/alanxz/rabbitmq-c/archive/refs/tags/v0.14.0.tar.gz tar xvf v0.14.0.tar.gz cd rabbitmq-c-0.14.0/…

Linux下多线程的相关概念

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &#x1f64f;如果内容有误或者有写的不好的地方的话&…

php反序列化入门

一&#xff0c;php面向对象。 1.面向对象&#xff1a; 以“对象”伪中心的编程思想&#xff0c;把要解决的问题分解成对象&#xff0c;简单理解为套用模版&#xff0c;注重结果。 2.面向过程&#xff1a; 以“整体事件”为中心的编程思想&#xff0c;把解决问题的步骤分析出…

实时监控电脑屏幕的软件是什么?三款超受欢迎的电脑监控软件

实时监控电脑屏幕的软件在现代企业管理中扮演着至关重要的角色&#xff0c;它们不仅帮助管理者实时监控员工的工作状态&#xff0c;提高工作效率&#xff0c;还通过数据分析和报告功能&#xff0c;为企业提供了优化管理流程和决策支持的依据。以下将介绍几款市面上广泛使用的实…

Redis过期策略数据淘汰策略

过期策略 一、设置过期时间 redis有四种命令可以用于设置键的生存时间和过期时间&#xff1a; EXPIRE : 将键的生存时间设为 ttl 秒 PEXPIRE :将键的生存时间设为 ttl 毫秒 EXPIREAT :将键的过期时间设为 timestamp 所指定的秒数时间戳 PEXPIREAT : 将键的过期时间设为 times…