关于DDS的基础知识

声明:这篇博客是我抄别人的,为什么想抄呢,因为他把DDS中的核心部件,相位累加器以及正弦ROM查找表寻址讲得明明白白,我真的好想把这篇文章据为己有。

DDS是直接数字式频率合成器(Direct Digital Synthesizer)的英文缩写,是一项关键的数字化技术。与传统的频率合成器相比,DDS具有低成本、低功耗、高分辨率和快速转换时间等优点,广泛使用在电信与电子仪器领域,是实现设备全数字化的一个关键技术。

上图所示是一个基本的DDS结构,主要由相位累加器、相位调制器、正弦ROM 查找表和D /A 构成。图中的相位累加器、相位调制器、正弦ROM查找表是DDS结构中的数字部分, 由于具有数控频率合成的功能,又合称为NCO。

相位累加器是整个DDS系统的核心,在这里完成相位累加功能。相位累加器的输入是相位增量B∆θ=2N  X fout /fclk,故相位累加器的输入又称为频率控制字,fclk为系统基准时钟,fout为输出的频率。频率控制字还经过一组寄存器, 该寄存器是同步的, 使得当频率控制字改变时不会干扰相位累加器的工作。

相位调制器接收相位累加器的相位输出, 在这里加上一个相位偏移值, 主要用于信号的相位调制,如应用于通信方面的相移键控等, 不使用此部分时可以去掉, 或者将其设为一个常数输入。同样相位字输入也要用同步寄存器保持同步。正弦ROM查找表,完成fsin(B∆θ)的查找表转换,是相位到幅度的转换, 内部存有一个完整周期正弦波的数字幅度信号,输入是ROM 的地址值, 输出送往D /A, 转化成模拟信号。在参考时钟fclk控制下,频率控制字K与相位寄存器的输出反馈在相位累加器中完成加运算,存入寄存器,作为下一次加运算的一个输入值,相位累加器输出高位数据作为波形存储器的相位抽样地址值,查找波形存储器中相对应单元的电压幅值,得到波形二进制编码,实现相位到电压幅值的转变。波形二进制编码再通过D/A转换器,把数字信号转换成相应的模拟信号。

fout =K X fclk/ 2N

当K=l时,可得DDS的最小分辨率为:fout =fclk/ 2N根据采样定理,K的最大值应小于2N/2。累加器得到的相位是怎么去寻址正弦ROM的,对于N位的相位累加器对应2的N次方数量的相位累加值,如果正弦ROM中存储的点数也是2的N次方的话,对存储容量和资源的要求就比较高了,实际上在寻址正弦ROM表时,用的是相位累加值的高位,也就是说并不是每个时钟fc都从正弦ROM表中取一个数值,而是多个时钟取一个值,这样能保证相位累加器溢出时,从正弦ROM表中取出正好一个正弦周期的样点。因此,相位累加器每计数2的N次方次,对应一个正弦周期。而相位累加器1秒钟计数fc次,在k=1时,DDS输出的时钟频率就是频率分辨率。频率控制字K增加时,相位累加器溢出的频率增加,对应DDS输出的频率变为K倍的DDS频率分辨率。

深入剖析:

设定:ROM存储点数为1024,每个点是用8位二进制表示。即,ROM地址线宽度为10,数据线宽度为8。

根据上述条件可以知道,相位调制器位宽M=10,那么根据DDS原理,相位累加器位宽N=20。那么在相位调制器中与相位控制字进行累加时,应用相位累加器的高10位累加。而相位累加器的低十位只与频率控制字累加。为什么是这样子?

我们以频率控制字K=1为例,相位累加器的低十位一直会加1,直到低十位溢出向高十位进位,此时ROM地址应该是0,也就是说,ROM的0地址中的数据被读了1024次,继续下去,ROM中的1024个点,每个点都将会被读1024次,最终输出的波形频率应该是参考时钟频率的1/1024。 fout =1 Xfclk/ 1024。反过来想,周期被扩大了1024 。同样当频率控制字为10时,相位累加器的低十位一直会加10,那么,相位累加器的低十位溢出的时间比上面会快十倍,则ROM中的每个点相比于上面会少读10次,所以最终输出频率是上述的10倍。fout =10 Xfclk/ 1024。这就是DDS。

DDS 最终输出的正弦波的幅值,必须都是ROM表中的正弦幅值。之前我们说根据采样定理,频率控制字K的最大值应小于2的N次幂除以2,这是有道理的,累加器数据位宽20位,ROM表地址位宽10位,在最终ROM表寻址时,用的是累加器的高10位,而低10位只用来进行累加。由于我们上述说DDS最终输出正弦波的赋值必须是ROM表中的幅值,也就是说,ROM表中的幅值必须都被用到,而不能跳过。以累加器位宽20位为例,它的一半是1024,当频率控制字以超过1024累加时,高十位输出累加值会超过1,也就是在寻址ROM表时跳过某些赋值。根据上述可以得出结论了,频率控制字K的最大值应小于2的N次幂除以2。

关于DDS的基础知识的更多相关文章

  1. 【RAC】RAC相关基础知识

    [RAC]RAC相关基础知识 1.CRS简介    从Oracle 10G开始,oracle引进一套完整的集群管理解决方案—-Cluster-Ready Services,它包括集群连通性.消息和锁. ...

  2. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

  3. RabbitMQ基础知识

    RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...

  4. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  5. selenium自动化基础知识

    什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...

  6. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  7. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  8. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  9. [SQL] SQL 基础知识梳理(四) - 数据更新

    SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...

随机推荐

  1. linux安装Django 以及 生产环境部署实现高并发

    1.首先安装python Python编译安装 主要介绍linux环境下安装 cd  /usr/local/src     //进入安装目录 wget  https://www.python.org/ ...

  2. [ 转 ] RESTful

    一.什么是RESTful 定义: REST全程是Representational State Transfer,表述性状态转移.它首次出现在2000年Roy Fielding的博士论文中,Roy Fi ...

  3. 介质共享型局域网中的介质访问控制(MAC)协议需要具体解决的3个问题,CSMA/CD介质访问控制的基本思想

    1,在某一时刻,那个节点可以发送数据 2,发送时是否会出现冲突 3,出现冲突时如何处理 CSMA/CD介质访问控制的基本思想:先监听,再发送.边发送,边监听,如发生冲突,则等待一段时间后再次发送

  4. 关于SpringMVC的配置流程以及一些细节

    首先说道SpringMvc是什么,SpringMVC是Spring框架里面的一个子框架,它对网站前后端的代码分层做了一套实现,这套实现给我们带来了几个好处,首先第一,SpringMVC实现了一个请求对 ...

  5. L2-007 家庭房产 (25 分)

    L2-007 家庭房产 (25 分)   给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤),随后N行,每行按下 ...

  6. JAVA对mongodb的基本操作

    public class test3 { //连接数据库(不需要验证,用于测试连接本地的mongodb) public static MongoDatabase getDatabase(String ...

  7. Java 8 Lambda 表达式(二)

    lambdas 实现 Runnable 接口 下面是使用 lambdas 来实现 Runnable 接口的示例: // 1.1使用匿名内部类 new Thread(new Runnable() { @ ...

  8. 台达VFD-B变频器调试

    一.变频器上电调试 变频器安装完成后,断开变频器的输出,在没通电前先使用数字表的二极管档对变频器的输入输出进行测量,确保无短路情况,然后接通变频器工作电源,(注意变频器标定的工作电源电压与外部输入电压 ...

  9. s21day20 python笔记

    s21day20 python笔记 一.内容回顾 面向对象的三大特性 封装 函数封装到类 数据封装到对象 继承 多态 二.成员 2.1 类成员 类变量(静态字段) 定义:写在类的下一级,和方法同一级 ...

  10. js: 文件(excel)下载处理

    以前很少接触文件下载的功能,昨天和后台开发人员联调下载功能出现了问题,一开始我请求接口,返回二进制文件流乱码,在网上找了方法,可以解决.后面后台开发人员改了一下,返回文件地址,然后就解决了.所以我了解 ...