文件

数字波形生成:实现近似正弦波

这个例子展示了设计和评估用于嵌入式系统和任意波形产生仪器中的数字波形合成应用的正弦波数据表所需的一些主要步骤。

使用嵌入式处理器和数字信号处理器(dsp)连接到数字-模拟转换器(dac)进行模拟波形的实时直接数字合成,即使在最小的系统中也越来越普遍。开发用于嵌入式系统或实验室仪器的波形可以使用MATLAB®和Simulink®的紧密集成进行简化。金宝app在使用目标硬件上的Simulink®Coder™实现之前,您可以在桌面上开发和分析波形生成算法及其相关数据。金宝app

在可行的情况,以数字方式合成的正弦波的最准确的方法是直接计算的全精度罪()函数为每个时间步长,折叠的ω* T入间隔为0〜2 * PI。在实时系统中,计算负担通常是太大,允许这种做法。围绕这一障碍的一种流行方式是使用值的表,从0到2 * PI,甚至半波或四分之一波数据,以充分利用对称性近似罪()函数的行为,无论是。

权衡考虑包括算法的效率,需要的数据ROM大小和执行的准确性/频谱纯度。执行自己的波形设计时,需要类似的分析。该表中的数据和查找算法本身并不能确定在场上的表现。还需要以评估总体性能额外的考虑,如精度和实时时钟的稳定性,和数字 - 模拟转换器。信号处理工具箱™和DSP系统工具箱™补充MATLAB和Simulink的能力,在这方面的工作。金宝app

近似正弦波行为的另一种流行的方式是使用Cordic近似方法。Cordic是坐标旋转数字计算机的首字母缩写。基于GIVENS旋转的CORDIC算法是最硬件高效的算法之一中,因为它只需要移位添加迭代操作。如果您有定点设计师许可,那么您可以看到fi_sin_cos_demo关于CORDIC近似的教程样式示例。

该示例中的失真分析是基于“使用DSP56001 / DSP56002”的“数字正弦波合成”中提出的原理,由Andreas Chrysafis,Motorola®Inc.1988

在双精度浮点中创建一个表

以下命令生成256点正弦波,并测量其总谐波失真时,首先在点上采样,然后通过使用线性插值每步跳2.5点的delta。类似的计算是用CORDIC正弦近似代替正弦值。对于基于频率的应用,光谱纯度可能比表中的绝对误差更重要。

文件Ssinthd.m.在该示例中的核心功能。它用于计算数字正弦波生成的总谐波失真(THD)具有或不具有内插。这种过度波的整数倍THD算法进行到实现准确的结果。使用波的周期数是A.由于步长大小“增量”是A / B和遍历波将在表中的至少一个时间,这是需要准确找到跨一个完整周期的平均THD击中的所有点。

用于计算THD的关系为:

THD = (et - ef) / et

et =总能量,ef =基本能量

ET和EF之间的能量差是虚假的能量。

N = 256;角度= 2*pi * (0:(N-1))/N;S = sin(Angle)';thd_ref_1 = ssinthd(s, 1, N, 1,)'直接的')thd_ref_2p5 = ssinthd(s,5/2,2 * n,5,“线性”)CS = Cordicsin(角度,50)';thd_ref_1c = ssinthd(cs,1,n,1,'直接的')thd_ref_2p5c = ssinthd(CS,5/2,2 * N,5,“线性”
THD_REF_1 = 4.7198E-32 THD_REF_2P5 = 1.4176E-09 THD_REF_1C = 1.2544E-30 THD_REF_2P5C = 1.4176E-09

将正弦波近似放入模型中

您可以将上面设计的正弦波放入Simulink模型中,并了解它是如何用线性插值和Cordic近似的金宝app直接查找。该模型将浮点表的输出与SIN()函数进行比较。从THD计算中预期,与SIN()函数相比,线性插值与直接表查找较低的误差。与线性插值方法相比,CORDIC近似示出了较低的误差余量。该边缘取决于计算CORDIC SIN近似时的迭代次数取决于迭代的数量。您通常可以通过增加迭代次数(对应于更长的计算时间)来实现更高的准确性。Cordic近似消除了对显式乘法器的需求。当乘法器在硬件中效率低或不存在时使用它。

打开sldemo_tonegen模型

Open_System(“sldemo_tonegen”);set_param(“sldemo_tonegen”'stopfcn''');出= SIM(“sldemo_tonegen”);currentFig =系数(“颜色”,[1,1,1]);副区(3,1,1),图(out.tonegenOut.time,out.tonegenOut.signals(1).values);网格标题({“直接查找的区别”“和参考信号”});子图(3,1,2),绘图(out.tonegenout.time,out.tonegenout.signals(2).values);网格标题({“插值查找差异”“和参考信号”});次要情节(3、1,3),情节(out.tonegenOut。时间,out.tonegenOut.signals (3) . values);网格标题({“CORDIC正弦之间的区别”“和参考信号”});

以在波形精度近距离查看

放大4.8到5.2秒之间的信号(例如),你可以看到不同的算法所使用的不同特征:

AX = GET(currentFig,'孩子们');套(斧头(3),'xlim',[4.8,5.2])组(AX(2),'xlim',[4.8,5.2])组(AX(1),'xlim',[4.8,5.2])

同桌,在定点实现

现在使用“最近”的舍入将浮点表转换为24位分数数。新表在每步1,2和3点处直接查找模式测试全谐波失真,然后用固定点线性插值。

比特= 24;是= num2fixpt(s,sfrac(bits),[],'最近''在');thd_direct1 = ssinthd(是,1,n,1,'直接的')thd_direct2 = ssinthd(是,2,n,2,'直接的') thd_direct3 = ssinthd(is, 3, N, 3,)'直接的')THD_LINTERP_2P5 = SSINTHD(是,5/2,2 * N,5,“丝状线”
THD_DIRECT1 = 2.6423E-15 THD_DIRECT2 = 2.8660E-15 THD_DIRECT3 = 2.6423E-15 THD_LINTERP_2P5 = 1.4175E-09

比较不同表和方法的结果

选择的每步8.25点(4分之33),通过双精度跳转表步进率和固定点表中直接和线性模式和比较失真的结果:

thd_double_direct = ssinthd(S,4分之33,4 * N,33,'直接的')thd_sfrac24_direct = ssinthd(是,33/4,4 * n,33,'直接的')thd_double_linear = ssinthd(S,4分之33,4 * N,33,“线性”)thd_sfrac24_linear = ssinthd(是,4分之33,4 * N,33,“丝状线”
Thd_double_direct = 4.7061e-05 thd_sfrac24_direct = 4.7061e-05 thd_double_linear = 7.9741e-10 thd_sfrac24_linear = 8.1751e-10

使用预配置的正弦波块

金宝appSimulink还包括具有连续和离散模式的正弦波源块,以及固定点SIN和余弦功能块,其利用线性内插查找表来实现函数近似,该表利用正弦和余弦的四分之一波对称。示例SLLDEMO_TONEGEN_FIXPT使用采样的正弦波源作为参考信号,并将其与带有或不具有插值的查找表进行比较,并且在固定点数据类型中具有CORDIC SINE近似。

打开sldemo_tonegen_fixpt模型

Open_System('sldemo_tonegen_fixpt');set_param('sldemo_tonegen_fixpt''stopfcn''');出= SIM('sldemo_tonegen_fixpt');数字(“颜色”,[1,1,1]);副区(3,1,1),图(out.tonegenOut.time,out.tonegenOut.signals(1).values);网格标题({“直接查找的区别”“和参考信号”});子图(3,1,2),绘图(out.tonegenout.time,out.tonegenout.signals(2).values);网格标题({“插值查找差异”“和参考信号”});次要情节(3、1,3),情节(out.tonegenOut。时间,out.tonegenOut.signals (3) . values);网格标题({“CORDIC正弦之间的区别”“和参考信号”});

使用时钟输入的正弦功能

该模型还将与SIN()函数的正弦波源引用进行比较,其输入角度在弧度中的输入角度是基于时间的(使用时钟计算)。本节测试假设时钟输入将返回SIN()函数的可重复结果2 * PI。以下绘图显示SIN()函数在其输入是基于时间时累积错误。这还表明采样的正弦波源更准确用作波形发生器。

次要情节(1,1,1),情节(out.tonegenOut。时间,out.tonegenOut.signals (4) . values);网格标题({“基于时间的罪恶之差()”“和参考信号”});

直接查询和线性插值的行为调查

文件sldemo_sweeptable_thd.m执行定点表的全频扫描,将让我们更加深入了解这种设计的行为。24位小数固定点表中的总谐波失真在每个步长被测量,移动通过它在一个时间,其中d是从1至N / 2的数,由0.25分递增二维点。N是在该实施例中256个点;1,2,2.5和3例以上进行。频率是离散的,因此一个采样速率的函数。

注意在情节失真特性的模式。他们配合常识:精确地处于一个点从表中检索时,误差最小;线性内插具有比在点之间直接查找较小的误差。什么是不直观的是,该错误是每个了模式奈奎斯特频率的相对恒定。

数字(“颜色”,[1,1,1])抽动,sldemo_sweeptable_thd(24,256),TOC
运行时间为2.564139秒。

下一步

为了进一步了解这个示例,请尝试不同的表精度和元素计数,以查看每种方法的效果。使用CORDIC近似,尝试不同的迭代次数,以查看对准确性和计算时间的影响。您可以使用Simulink Coder提供的自动代码生成来研究波形合成算法的不同实现选项,并使用Embedded Coder™生成产品代码。金宝appEmbedded Target产下载188bet金宝搏品提供到各种实时处理器和dsp的直接连接,包括在目标实时运行时返回到Simulink图的连接。金宝app信号处理工具箱和DSP系统工具箱提供了预先打包的功能,可以用MATLAB和Simulink设计和实现各种基于样本和基于框架的信号处理系统。金宝app

bdclose(“sldemo_tonegen”);bdclose('sldemo_tonegen_fixpt'