有限位宽无限精度DDS设计

news/2025/1/8 17:50:01/文章来源:https://www.cnblogs.com/jiaotaiyang/p/18657628

前言:
DDS的频率精度受限于\(fs/2^N\),其中,\(2^N\)为查找表深度。假设采样率12MHz,地址位宽16位,则最小频率步进为\(\Delta f=12e6/2^{16}=183Hz\)。也就是我们只能产生\(183Hz,183*2Hz\)等频率的信号。如果由于项目需求,我们需要产生更精细的频率,比如10Hz分辨率的信号,由于存储受限,也无法增加存储深度,那该怎么做呢?
上面精度范围有限的原因是固定了频率控制字的数值。如果每次频率控制字可变,则其精度可以更高。通常来说,DDS会在FPGA上实现,固定精度的DDS 很容易实现,那可变精度的呢?说起来容易,在Verilog上怎么实现呢?

首先,假定我们需要产生模拟域频率为\(f_c\)的正弦信号,时钟频率为\(f_s\),采样周期为\(T_s=1/fs\)

\[\begin{equation} x(t)\vert _{t=nT_s}=cos(2\pi f_c t)\vert _{t=nT_s}=cos(2\pi f_c/f_s \cdot n)\label{signal_expression} \end{equation} \]

如果查找表存了整个周期的正弦值,那么地址范围从\([0:1:2^N-1]\)对应了相位的\([0:1/2^N:1-2^{-N}]\),在式\(\eqref{signal_expression}\)中,相位为

\[phase = f_c/f_s \cdot n \]

那么查找表的地址就应该是

\[\begin{equation} addr = floor(phase \cdot 2^N) = floor(f_c/f_s \cdot n \cdot 2^N) = floor(f_c/f_s \cdot n) \cdot 2^N, \space n=0,1,2,...,+\infty\label{addr} \end{equation} \]

当时间无限延展,地址也会无限扩展,显然,由于信号是周期的,我们可以对地址进行绕回,也就是

\[\begin{equation} addr = mod(addr,2^N)\label{addr_wrap} \end{equation} \]

如此生成的正弦波,将会是一个更为精确的数字。

算法中有一个关键的问题:
1.n是无限延展的,如何用定点数表示?
2.如何进行mod操作?
先来解答第一个问题,分析式\(\eqref{addr}\),可以看出,每次addr的增量是固定的,即fc/fs2^N,那么我们可以把乘法替代为累加运算,也就是改写为addr = addr + fc/fs2^N的形式,发生溢出时正常溢出即可,因为无符号数溢出不会影响低位的正确性。
第二个问题,如何进行mod操作?这个也简单,直接取整数部分的低位即可。

\[\begin{array}{l} \hline \boldsymbol{algorithm} \\ \hline\boldsymbol{Input:}fc \\\boldsymbol{Output:}addr \\ \hline 1.addr\_temp=0; \\ 2.根据式\eqref{addr},计算常量值 const0 = fc \cdot 1/f_s \\ 3.计算地址增量 addr\_delta = const0*2^N \\ 4.在每个时钟周期: \\ addr\_temp = addr\_delta + addr\_temp; \\ addr = mod(addr\_temp,2^N) \\ \hline \end{array} \]

给出一个设计的例子。
\(fs=12MHz,\ fc = 18Hz\),查找表深度为\(2^16\)
首先,对 1/fs 进行定点化。


>> fi(1/12e6,0,12)ans = 8.3324e-08DataTypeMode: Fixed-point: binary point scalingSignedness: UnsignedWordLength: 12FractionLength: 35
>> bin(ans)ans ='101100101111'

对输入频率进行量化,假定指定输入频率定点方案为u(16,0),即输入范围为0Hz~2^17-1Hz
对其进行全精度运算,const0=u(12,19)*u(16,0)=u(28,19)
计算地址增量,对const0乘2^16,相当于小数点右移16bit,结果为addr_delta = u(28,3),二进制表示不变
对addr_temp做加法,addr_temp仍然为u(28,3)
addr为取了整数位的addr_temp,即量化方式位wrap,量化结果位u(16,0)
给出伪Verilog代码:

module dds_inftyPrecise
(
input clk,rstn
input [15:0] fc,
output [15:0] addr
)
wire [11:0] 1_fs = 12'b101100101111;
wire [27:0] const0 = fc*1_fs;
wire [27:0] addr_delta = const0;
reg [27:0] addr_temp;
always @(posedge clk or negedge rstn)
if(rstn==0)addr_temp<=0;
elseaddr_temp<=addr_temp+addr_delta;assign addr = addr_temp[18:3];
endmodule

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux文件系统的安全保障---Overlayroot!

`overlayroot` 是一种使用 OverlayFS 实现的功能,可将根文件系统挂载为只读,并通过一个临时的写层实现对文件系统的修改。这种方法非常适合嵌入式设备或需要保持系统文件完整性和安全性的场景。下文以 RK3568 平台为例,介绍制作 overlayroot 的详细步骤。 ​ 1. 制作精简文件…

DirectX 修复工具 V4.3 绿色增强版:完美解决 DirectX 和 C++ 问题,修复 0xc000007b 错误

介绍 DirectX 修复工具 V4.3 是一款高效的系统修复工具,专为解决 系统异常 和 C++ 运行库 问题而设计,尤其对解决 0xc000007b 错误有着极高的修复率。本工具支持对所有版本的 DirectX 进行修复,并在增强版中新增了对 C++ 运行库问题的修复,提供了一个全面且可靠的解决方案。…

用DevEco Studio模拟器这些能力 没真机也能高效调测鸿蒙原生应用

随着鸿蒙生态的快速发展,越来越多的开发者投身于鸿蒙原生应用的开发中。然而,在实际开发中,真机设备短缺、调测场景复杂等问题常困扰着开发者。为解决这些问题,华为在DevEco Studio上为开发者提供了模拟器(Emulator)功能,帮助开发者在真机匮乏或无真机时,高效且低成本地…

renben-openstack-使用操作

管理员操作 (1)上传一个qcow2格式的centos7镜像 (2)管理员------>云主机类型------>创建云主机类型名称:Centos7VCPU数量:1内存: 1024根磁盘: 10G其他的默认点击创建云主机类型即可界面会显示如下创建公网络 (1)创建公网管理员------>网络------>创建网络…

防护用具穿戴智能监测摄像机

防护用具穿戴智能监测摄像机在现代安全管理中扮演着越来越重要的角色。这些先进设备不仅仅是简单的监视工具,更是通过整合高级技术来提升工作效率和安全性,特别是在复杂环境和危险作业场所的应用日益广泛。防护用具穿戴智能监测摄像机不仅仅是一种安全设备,更是提升工作场所…

场景题:假设有40亿QQ号,但只有1G内存,如何实现去重?

当数据量比较大时,使用常规的方式来判重就不行了。例如,使用 MySQL 数据库判重,或使用 List.contains() 或 Set.contains() 判重就不行了,因为数据量太大会导致内存放不下,或查询速度太慢等问题。 1.空间占用量预测 正常情况下,如果将 40 亿 QQ 号存储在 Java 中的 int 类…

Forensia:红队后渗透的痕迹清理工具

简介: 红队反取证工具,用于在后期利用阶段消除一些足迹,减少有效载荷消耗并增加检测倒计时。可用于测试事件响应/取证团队的能力。 功能: 卸载Sysmon驱动 Gutmann方法文件粉碎 USNJrnl功能失效 预取功能失效 日志橡皮擦和事件日志禁用 用户辅助更新时间禁用 访问时间禁用 清…

DirectX修复工具:系统修复必备神器 修复工具 V4.3 绿色增强版

DirectX修复工具是一款专用于修复系统异常的工具,DirectX修复工具还是一款使用简单易上手操作且绿色、可免安装的修复工具。使用DirectX修复工具可自动更新C++组件且完美修复0xc000007b问题异常。如果你的电脑出现了DirectX的异常问题,可直接下载DirectX修复工具进行修复解决…

浅谈异地访问家庭网络的几种方案

家庭网络如何实现公网访问?想必是大家一直在探索的问题。本文带领大家一起来探究适合自己的解决方案吧! 为什么要实现公网访问? 要回答这个问题,每个人的答案或许不一样。但归纳在一起就是三个字爱折腾。在前面的文章中,我们讲到了如何将旧电脑打造属于自己的NAS,而如何远…

Visual Studio 2022 上架腾讯云 AI 代码助手了

近期在Visual Studio 市场上上架了腾讯云 AI 代码助手。该插件可以在 Visual Studio2022 版本(含社区版,版本不低于 17.6 即可)使用智能辅助编码能力,助力 Visual Studio 的开发者提高效率。我们在该平台上支持技术对话、代码补全、单元测试生成、解释代码、修复代码等场景…

CDS标准视图:优先级描述数据 I_GenericPriorityTextData

视图名称:优先级描述数据 I_GenericPriorityTextData 视图类型:基础视图 视图代码:点击查看代码 @AbapCatalog.sqlViewName: IGENPRIOTEXTDATA @AbapCatalog.compiler.compareFilter: true @AccessControl.authorizationCheck: #NOT_REQUIRED @EndUserText.label: Generic P…

deeplearning4j~实现简单模型训练和测试

DeepLearning4j (DL4J) 是一个开源的深度学习库,专为 Java 和 Scala 设计。它可以用于构建、训练和部署深度学习模型。以下是关于如何使用 DL4J 的基本指南以及一个简单的模型训练示例。 本例中使用了MNIST数据集,MNIST(modified national institute of standard and techno…