Matlab里面的浮点数与FPGA定点数的相互转化应用(含Matlab代码,封装成函数可直接调用)
微信公众号获取更多FPGA相关源码:

1.前言
Matlab里面计算通常用的是浮点数,而FPGA在做数字信号处理时,为了节约资源,常常使用的是定点数。在实践中,我们经常需要将Matlab实现中的算法,用FPGA进行实现。
那么,Matlab里面的是浮点数怎么转换为定点数到FPGA里面进行使用,以及FPGA里面计算的定点数,怎么又在Matlab里面又转换为浮点数进行验证呢?
2.模拟信号——>数字信号
模拟信号是需要通过采样、量化、编码才能转化为数字信号进行处理。


通常在Matlab里面仿真算法的时候,只是将模拟信号进行了采样,即时间域上做了离散处理,使模拟信号变成数字序列,但是并没有将幅度值进行量化和编码,是不能够直接用于FPGA处理的。
2.1采样过程
采样过程是进行模拟信号数字化的第一步,模拟信号被采样后,称为采样信号,采样信号在时间上是离散的,但在取值上仍然是连续的,因此仍然是模拟信号。在采样时就不得不提及采样定理:
若想能够从采样后信号中恢复出原始信号,则采样信号的频率至少为原始信号最大频率的2倍,该频率又被称为奈奎斯特频率。
在理想情况下可以看作是用一连串的冲激函数与原始信号进行相乘,若要对采样信号求频谱可以先求冲击串的傅里叶级数,再用傅里叶级数来表示其傅里叶变换,即可以较少的计算量求出采样信号的傅里叶变换。
但在matlab中则不常采用这种方式,常采用的方式为,规定好时间间隔和起始时间后,对原始信号的每个规定时间间隔后的点进行取样,即可得到采样函数。
2.2量化
这里只讨论均匀量化:设模拟抽样信号的取值范围在a和b之间,量化电平数为M,则在均匀量化时的量化间隔为:
Δ v = b − a M Δ v =\frac{b-a}{M} Δv=Mb−a
且量化区间的端点为:
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,(mi−1⩽m(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-out | Input bits (b2 b3) | Q-out |
|---|---|---|---|
| 00 | –3 | 00 | –3 |
| 01 | –1 | 01 | –1 |
| 11 | 1 | 11 | 1 |
| 10 | 3 | 10 | 3 |
映射过后,为了使平均功率一致,还需要乘上归一化因子,这就使得调制后的输出是复数形式的小数。

当输入为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=q∗round(u/q)
其中,y 是量化输出,u 是输入,q 是量化区间。
在matlab命令行窗口输入:
q= quantizer()
如下图:

可以看到量化格式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:Lswitch (data_in(4*k-3))*2+data_in(4*k-2) %data_outIcase 0 %00data_outI(k)=-3;case 1 %01data_outI(k)=-1;case 3 %11data_outI(k)=1;case 2 %10data_outI(k)=3;otherwiseendswitch (data_in(4*k-1))*2+data_in(4*k) %data_outQcase 0 %00data_outQ(k)=-3;case 1 %01data_outQ(k)=-1;case 3 %11data_outQ(k)=1;case 2 %10data_outQ(k)=3;otherwiseend
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相关源码:

相关文章:
Matlab里面的浮点数与FPGA定点数的相互转化应用(含Matlab代码,封装成函数可直接调用)
微信公众号获取更多FPGA相关源码: 1.前言 Matlab里面计算通常用的是浮点数,而FPGA在做数字信号处理时,为了节约资源,常常使用的是定点数。在实践中,我们经常需要将Matlab实现中的算法,用FPGA进行实现。 …...
机器学习笔记——欠拟合、过拟合
欠拟合 将训练损失和测试损失都比较大的拟合叫欠拟合,那么他的预测精度很低 1.一般出现在模型的复杂度小于数据本身的复杂度导致的,这个可能就是模型对数据的分布和实际数据分布之间的差异,这个就可能需要更换模型 2.还可能出现在梯度下降算…...
【二进制部署k8s-1.29.4】七、验证master的安装
文章目录 简介 一.确认kubectl命令是否正常运行二.确认etcd安装是否正常运行三.确认kube-apiserver,kube-controller-manager,kube-scheduler安装是否正常四.配置apiserver和kubelet的访问授权五.master端安装脚本4.1.安装master端所需文件4.2.master快捷安装脚本 简介 本章节主…...
springboot获取当前数据库连接
要获取当前 Spring DataSource 的 URL,可以通过以下几种方法: 方法一:使用 JdbcTemplate 如果你使用的是 Spring 的 JdbcTemplate,可以通过 javax.sql.DataSource 获取连接,再获取它的 URL。 示例代码: …...
【学习笔记】Windows GDI绘图(九)Graphics详解(上)
文章目录 Graphics 定义创建Graphics对象的方法通过Graphics绘制不同的形状、线条、图像和文字等通过Graphics操作对象坐标 Graphics属性Clip(裁切/绘制区域)ClipBounds获取裁切区域矩形范围CompositiongMode合成方式CompositingQuality渲染质量DpiX和DpiY 水平、垂直分辨率Int…...
公告:公众号铁粉粉丝介绍以及说明
大家好,我是公众号博主--夏目 机械电气电机杂谈是我个人建立,为分享机械,电气,电机知识为主,闲谈杂聊社会时事,职场见闻,生活琐事,成长趣事,学习心得,读书观影…...
BioTech - 使用 CombFold 算法 实现 大型蛋白质复合物结构 的组装过程
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/139242199 CombFold 是用于预测大型蛋白质复合物结构的组合和分层组装算法,利用 AlphaFold2 预测的亚基之间的成对相互作用。 CombFold 算法的关键特点包括: 组合和…...
代码随想录算法训练营第36期DAY46
DAY46 完全背包 在闫氏DP法里学过:第i个物品选k个,纸质直至不能选,k从0开始取。就有递推式了。 代码随想录的视频也看了。 518零钱兑换ii 注意与 目标和 那题区分开。 完全背包问题,正向遍历背包容量,就能实现“多次…...
港湾周评|李小加“刀刃向内”裁员
《港湾商业观察》李镭 近年来争议颇大的滴灌通风波不断。 在交100万付费上班不久,最新又被曝出裁员。这位前港交所总裁、金融圈鼎鼎大名的李小加,没想到成立不足三年便迎来了重大挑战。 日前,滴灌通确认了公司组织架构已经调整,…...
超大功率光伏并网逆变器学习(三相)
1.超大功率用的IGBT开关频率通常很低,比如6KHz 2.线电压和相电压的关系 相电压 A AB线电压-CA线电压 相电压 B BC线电压-AB线电压 相电压 C CA线电压-BC线电压 3.坐标变换 ABC三相信号通过Clark坐标变换得到αβ两相静止信号,其中α与A相重合,β与α…...
大豆、棉花深度学习数据集大合集
最近收集了一大波关于大豆和棉花的深度学习数据集,主要有叶片的识别、分类、计数以及病害检测等。 数据集的价值 科研价值:这些数据集为植物学、农业信息技术、机器学习等领域的科研人员提供了宝贵的资源。它们可以用于训练和优化各种深度学习模型&…...
教育数字展馆助力全球教育传播,科技引领数字化教育潮流
一、教育数字展馆助力教育传播 1、提高教育资源的可及性 教育数字展馆通过VR和WEB3D技术,将丰富的教育资源呈现在用户面前。不论是名校的经典课程,还是专家的精彩讲座,均可通过教育数字展馆实现线上展示。用户只需登录平台,即可…...
14.微信小程序之地理定位功能
目录 1.地理定位介绍 1.1 申请开通 1.2 使用方法 2.拒绝授权后的解决方案 3.开通腾讯位置服务 4.LBS 逆地址解析 1.地理定位介绍 小程序地理定位是指通过小程序开发平台提供的 API,来获取用户的地理位置信息。用户在使用小程序时,可以授权小程序获…...
理解lambda表达式
Lambda表达式: 这里不再过多叙述什么事lambda表达式,就说下怎么使用,首先和lambda表达式同时存在的就是另一个定义,就是匿名内部类。匿名内部类首先需要一个接口。 下面用一个例子说明lambda表达式: public class Hel…...
【面试】Java的前端编译器和后端编译器
目录 1. 说明2. 前端编译器2.1 主要功能2.2 工作原理 3. 后端编译器3.1 主要功能3.2 工作原理 1. 说明 1.在Java的编译过程中,编译器通常被划分为前端编译器和后端编译器,各自负责不同的任务。2.前端编译器主要负责源代码的词法分析、语法分析和语义检查…...
教育小程序的性能优化:从前端到后端的综合提升策略
随着教育小程序的普及,其性能直接影响用户体验和教学效果。本文将从前端到后端,详细探讨教育小程序的性能优化策略,帮助开发者打造高效、流畅的教育应用。 一、前端性能优化策略 代码优化 减少HTTP请求:合并CSS、JavaScript文件…...
单链表实现通讯录
之前我们完成了基于顺序表(动态)实现通讯录,现在我们链表学完了,可以尝试着使用链表来实现我们的通讯录。 首先我们要明白我们写的通讯录是由一个个节点组成的,每个节点里存储的就是我们的联系人信息。也就是说 我们需…...
Linux 命令操作技巧
Linux命令行界面提供了丰富的快捷键来提高操作效率,以下是一些常用的Linux终端快捷键,主要基于Bash shell: Tab - 自动补全:输入命令、文件名、目录名或命令选项的开头部分,然后按Tab键,系统会自动补全剩余…...
深度学习21天 —— 卷积神经网络(CNN):识别验证码( 第12天)
目录 一、前期准备 1.1 标签数字化 1.2 加载数据 1.3 配置数据 二、其他 2.1 损失函数 categorical_crossentropy 2.2 plt.legend(loc ) 2.3 history.history 活动地址:CSDN21天学习挑战赛 学习:深度学习100例-卷积神经网络(CNN&…...
利用 Docker 简化Redis部署:快速搭建Redis服务
利用 Docker 简化Redis部署:快速搭建Redis服务 目录 利用 Docker 简化Redis部署:快速搭建Redis服务为什么选择 Docker准备工作拉取Redis镜像快速运行Redis容器验证Redis服务总结 在现代软件开发中,Redis作为一种高性能的键值数据库࿰…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
