提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

FPGA信号处理系列文章——DDS的性能和误差分析

  • 前言
  • 误差来源
  • 误差分析
  • xilinx IP手册解读

前言

做通信的童鞋都应该知道DDS,是一个用来产生载波的一个模块,本文不写关于如何使用这个xilinx IP的内容,因为实在是太太太简单了,就不写这种东西来滥竽充数了。尽管大家都用过DDS,但可以肯定的是几乎很少人会去关注DDS的误差分析。这次我就做一次学术派来分析分析DDS设计过程中存在哪些误差。

误差来源

理想DDS是DDS的理想化数学模型,所谓的理想参数DDS具备三个条件:
(1) 没有相位舍入位误差,即相位累加器的N位输出都用于ROM寻址。
(2) 没有幅度量化误差,即ROM输出值用于无限长的码来表示
(3) DAC的分辨率无穷大、并且DAC具有理想的数模转换特性。
实际DDS并不满足理想DDS的3个条件,由于DDS的全数字化结构,因而实际DDS存在着固有的误差。其主要误差来源于三个:
(1) 相位截断误差:在实际DDS电路中,为了取得一定的频率分辨率,通常相位累加器的位数N取得很大,如N = 24,32,48等,但受体积和成本的限制,ROM的容量却远小于2^N,因此寻址ROM时,累加器输出相位序列的低B位就被舍去,而只用其输出的高M(M = N -B)位去寻址,这样就不可避免地引入误差。
(2) 幅度量化误差:ROM中存储着正弦波样点的幅值编码,任何一个幅值要用无限长的比特流才能精确表示,而实际中ROM的输出位D是个有限值,这样就引入了幅度量化误差。
(3) DAC转换误差:DAC的有限分辨率、非线性特性、瞬间毛刺及转换速率等非理想转换特性会影响DDS输出频谱的纯度,产生杂散分量

因为第(3)是外部器件引入的,我们无法控制,这里我们只对前面两个误差来进行分析

误差分析

前面,我们阐述了DDS的误差来源,这里,我们通过matlab程序来进行一下误差分析
在进行误差分析前,我们首先要介绍一个概念
SFDR,英文全称是 Spurious-Free Dynamic range,意为无杂散动态范围。SFDR是指基波强度与最大杂波或谐波的强度之比,所以SFDR值越大则说明系统的噪声水平越低,灵敏度越高。

实际上,我们前面说的两种误差源最终表现就在这个无杂散动态范围上。Matlab有一个专门的函数来测量SFDR,即sfdr,用起来非常方便

第一部分,无误差模型:累加器是20bit,输出的相位也是20bit,且查找表不进行量化相当于查找表的位宽无限大,这样没有任何精度损失

nco_width = 20;
phase_width = 20;
sim_len = 2^nco_width;fs = 25e6;
fc = 2.23e6;nco_freqword = round((2^nco_width)*(fc/fs));nco_acc_reg = 0;
for i = 1 : sim_lennco_acc_reg = nco_acc_reg + nco_freqword;nco_acc_reg = mod(nco_acc_reg,2^nco_width);code_index  = bitshift(nco_acc_reg,-(nco_width - phase_width));cosWave1(i) = cos(code_index*2*pi/(2^phase_width)) + (1e-16)*randn(1);
endsfdr(cosWave1,fs)


第二部分,相位截断误差引起的杂散。累加器是20bit,输出的相位是10bit,且查找表不进行量化相当于查表表的位宽无限大,这样只反映了相位截断误差引起的杂散。

nco_width = 20;
phase_width = 10;
sim_len = 2^nco_width;fs = 25e6;
fc = 2.23e6;nco_freqword = round((2^nco_width)*(fc/fs));nco_acc_reg = 0;
for i = 1 : sim_lennco_acc_reg = nco_acc_reg + nco_freqword;nco_acc_reg = mod(nco_acc_reg,2^nco_width);code_index  = bitshift(nco_acc_reg,-(nco_width - phase_width));cosWave1(i) = cos(code_index*2*pi/(2^phase_width)) + (1e-16)*randn(1);
endsfdr(cosWave1,fs)


第三部分,在实际FPGA实现的过程中,在相位截断的情况下肯定也会存在幅度量化引发的误差。累加器是20bit,输出的相位是10bit,查找表的位宽为7bit。这才是我们正常情况下使用的场景。

nco_width = 20;
phase_width = 12; %相位位数决定了ROM的深度为2^12
sim_len = 2^nco_width;%参数
depth = 2^phase_width;%深度 需2的N次幂
width = 7; %  width = 9 : -128~128
%  width = 8 : -64~64
%  width = 7 : -32~32
%n = 0:depth-1;
cos1 = cos(2*pi*n/depth);
sin1 = sin(2*pi*n/depth);
f_cos = cos1/max(abs(cos1));
f_sin = sin1/max(abs(sin1));q1=round(f_cos.*(2^(width-2))); %注意是width-2
q2=round(f_sin.*(2^(width-2)));
% plot(q1)fs = 25e6;
fc = 2.23e6;nco_freqword = round((2^nco_width)*(fc/fs));nco_acc_reg = 0;
for i = 1 : sim_lennco_acc_reg = nco_acc_reg + nco_freqword;nco_acc_reg = mod(nco_acc_reg,2^nco_width);code_index  = bitshift(nco_acc_reg,-(nco_width - phase_width));cosWave1(i) = q1(code_index + 1);%cosWave1(i) = cos(code_index*2*pi/(2^phase_width)) + (1e-16)*randn(1);
endsfdr(cosWave1,fs)


多次测试后,找到一些规律。


由此可见,phase_width决定了SFDR的最大性能,Data_width增加到一定程度再增加也无法提升SFDR性能。
但如果phase_width在一定的情况下,phase_width的相位宽度增加对于SFDR性能几乎没什么改善。

xilinx IP手册解读

好了,我们再来看下XILINX数据手册,
数据手册上举了两个例子

我们也将条件设置为跟它一样的,仿真结果与其一致



我们也将条件设置为跟它一样的,这个仿真结果也是与其一致


if S dB of spur suppression is required in the output waveform, as referenced to the 0 dB primary tone, the DDS lookup table must support at least [S/6]address bits. For example, if S= 70 dB, which means that the highest spur is 70 dB below the main signal, then the minimum number of address bits for the lookup table is [70/6]=12bits; that is, a 4096-deep table

我们来验证下这句话,显然也是没问题的


以上都是常规DDS的性能。手册叫这种方法为phase truncation DDS

但XILINX ip核提供了两种优化性能的方法

1、 Phase Dithered DDS
在相位位宽和幅度位宽相同的条件下,使用Phase Dithered DDS这种方法能够 提升12dB的SFDR.

2、 Taylor Series Corrected DDS,这个方法就更牛逼了,不过却要消耗乘法器资源

The Taylor series corrected architecture in this example uses a table depth N = 4096 and 18-bit precision samples. However, the precision at the output of the feed-forward error processor is 20 bits. For each plot, the output frequency is different and annotated directly on the plot. A similarly configured phase truncation DDS would produce spurs at – 72 dB and a phase dithered DDS at – 84 dB. The peak spurs for the four plots are –118.25, –118.13, –118.10, and –118.17 dB below the output frequency

可见其牛逼之处


资源分析
我们设置这样的性能条件,看看几种方法的资源消耗情况

1、NONE

2、phase dithering

3、talor series corrected

phase dithering 这种方法能够极大的节省RAM资源。而talor series corrected更能省RAM,但会使用DSP资源,实际使用的时候要进行权衡。


又快12点了,搞一篇花2-3个小时,写东西真TM费时间,但原创还是要坚持下去。。。。睡觉

FPGA信号处理系列文章——DDS的性能和误差分析相关推荐

  1. FPGA信号处理系列文章——码元同步

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章--码元同步 前言 码元粗同步 超前-滞后门同步器 鉴别器 matlab程序 前言 前面,我们将了锁频环和锁相 ...

  2. FPGA信号处理系列文章——FIR半带插值滤波器

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章--FIR半带插值滤波器 信号流 matlab模型 FIR系数生成 IP核的设置 注意事项 信号流 半带插值滤 ...

  3. FPGA信号处理系列文章——数字锁相环

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章--数字锁相环 锁相环的一些概念 鉴相器 Matlab 程序 锁相环的一些概念 1.捕获.锁定与跟踪的概念 捕 ...

  4. FPGA信号处理系列文章——CRC运算的实现

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章--CRC运算的实现 前言 CRC运算的框图 matlab模型 verilog实现 总结 前言 很多协议都会用 ...

  5. FPGA信号处理系列文章——FIR半带插值滤波器-1个时钟2个采样点的优化处理

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章--FIR半带插值滤波器-1个时钟2个采样点的优化处理 前言 设计参数 常规IP设置 优化处理 总结 前言 假 ...

  6. FPGA经验谈系列文章——前言和目录

    FPGA经验谈系列文章--前言和目录 前言 工作内容 最后 前言 转眼间,工作也即将十年时间,也是做FPGA开发的十年,虽然我总是认为我一开始走错了路,我应该去搞互联网的o( ̄︶ ̄)o.但也确实做到了 ...

  7. FPGA经验谈系列文章——FPGA开发方向以及算法开发模型

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA经验谈系列文章--FPGA开发方向以及算法开发模型 前言 接口方向 算法方向 总结 前言 FPGA开发笼统的说可以分为两个方向 ...

  8. FPGA经验谈系列文章——时序不过怎么办

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA经验谈系列文章--时序不过怎么办 前言 如果设计验证和测试已经接近尾声,偶尔进行小改可能出现几条时序违例的情况 逻辑级数过大引 ...

  9. 大话卫星导航中的信号处理系列文章——GPS信号L1频点的中频数据生成与验证

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 大话卫星导航中的信号处理系列文章--GPS信号L1频点的中频数据生成与验证 需求 扩频码的生成 其他 验证 需求 这篇文章,主要记录我 ...

  10. FPGA经验谈系列文章——FPGA资源评估

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA经验谈系列文章--FPGA资源评估 前言 如何评估 哪些资源需要评估 怎么快速的进行资源统计 评估结果 前言 大家在项目中一般 ...

最新文章

  1. 适应安装程序用的TreeView控件
  2. react native release语法问题解决
  3. 给web请求加遮罩动画
  4. Python基础教程(二):基础语法、变量类型
  5. 建智能工厂,可从这6个方面着手!
  6. ssl1615-Frogger【图论,最小生成树,并查集】
  7. 计算机网络【3】网络层
  8. 判断数组中的元素是否连续
  9. 数据库-常见面试题汇总
  10. 服务器系统建立安全连接失败,尝试与系统“ServerName”建立安全连接时,MSDTC遇到错误(HR = 0x80000171)...
  11. 爬虫,酷我音乐接口解析
  12. c语言大学程序设计题库,大连理工大学c语言...程序设计题库.doc
  13. 案例3-数据驱动测试-从excel导入数据
  14. 第12集 关于库卡机器人对需要减速和插值方式说明
  15. 每天一个npm包 之 qs
  16. 前端嫌弃原生Swagger界面太low,于是我给她开通了超级VIP
  17. Chrome 调试 websocket
  18. matlab中的颜色,Matlab里面除了常用的还有哪些颜色?已知的颜色不够怎么办?
  19. COM ATL IDispatchEx InvokeEx 钩子
  20. K8s常见问题分析解决(coreDns)

热门文章

  1. 数控机床CNC编程入门【G-code】
  2. android与单片机wifi通信原理图,基于单片机的wifi模块原理图分析
  3. 手游游戏资源提取 (破解、AssetStudio、VGMToolbox、disunity、Il2CppDumper、 .NET Reflector)...
  4. 学习笔记(5):Google开发专家带你学 AI:入门到实战(Keras/Tensorflow)(附源码)-深度学习“四件套”:数据、模型、损失函数与优化器...
  5. 店铺淘客软件定制,1688分销软件OEM贴牌配合精细化运营提升店铺流量
  6. 左耳朵耗子:编程的本质是什么?
  7. 转载:IEEE1588 ( PTP ) 协议简介
  8. 适合新手绘制房间布置图的电脑软件
  9. 如何制作一个计算机病毒,怎样制作一个简单的电脑病毒
  10. 下载的word excel ppt 文件锁定了,解除操作步骤