关注公众号

关注公众号

手机扫码查看

手机查看

喜欢作者

打赏方式

微信支付微信支付
支付宝支付支付宝支付
×

近乎完美的DDS正弦波信号音生成器(二)

2020.10.13

在软件中实现高精度NCO

如同著名的惠普分析仪,或者如同应用笔记AN-1323中描述的那样,构建与最出色的模拟振荡器具备同等或更出色的失真性能的高精度交流信号振荡器并不容易,即使是针对音频频谱(直流至20 kHz范围)。然而,如前所述,利用嵌入式处理器具有的足够运算精度来执行相位计算(ωt)和正弦函数(sin(ωt))近似计算,从而完整实施软件,这显然有助于最大限度减少量化的不利影响、噪声和由此导致的杂散。这意味着图2中的所有NCO功能模块都会转换成代码行(不是VHDL!),从而实现一个满足实时约束的软件版本,以确保实现最小的采样速率和所需的频率带宽。

对于相位-正弦幅度转换引擎,完整的LUT方案或任何变化都需要用到太多的存储空间或太多的插值运算来实现完美的正弦一致性。相反,用于计算正弦近似值的多项式方法允许使用成本极低的通用DSP,在复杂性与精度之间达成了不错的平衡。多项式级数展开也很有吸引力,因为它相对简单,并且能够采用选择的幂级数类型提供充分的灵活性,并且调整算法来实现给定精度。它不需要很大的存储空间(可能不到100行SHARC DSP汇编代码),只需要几个RAM位置来存储多项式系数和变量,因为正弦值只在采样时刻计算。

首先,对于正弦近似值函数,显然会选择使用具有适当顺序的泰勒/麦克劳林幂级数来满足目标精度。但是,由于幂级数在端点处往往会失效,所以在执行任何多项式求值之前,必须将参数输入范围缩小到更小的区间。如果不缩小参数范围,只能使用非常高阶的多项式来支持在功能域(例如[–π, +π])中实现高精度。所以,需要对初等函数进行一些变换,以获取所需的约化参数,例如sin(|x|) = sin(f + k × π/2)和sin(f) = sin(x – k × π/2),其中0 ≤f<π/2。因此,对于三角函数,要特别注意不要使用减法相消,以免严重降低精度,并导致灾难性后果,特别是在运算精度极差的情况下。在我们的例子中,当相位输入大于或接近π/2的整数倍数时,会发生这种情况。

除了周期性和modulo-2π重复之外,sin(x)函数的对称性可用于进一步缩小近似值范围。鉴于正弦函数在区间[0, 2π]内,关于点x = π不对称,所以能够使用以下关系式:

近乎完美的DDS正弦波信号音生成器

将范围缩小到[0, π]。采用同样的方式,sin(x)在区间[0, π]内,关于由x = π/2定义的线对称,所以:

近乎完美的DDS正弦波信号音生成器

x在区间[0, π/2]以内,这会进一步缩小角输入近似值的范围。通过进一步缩小参数区间(例如[0, π/4])来提高精度并不是有效方法,因为这需要同时估算正弦和余弦函数的值,如常用三角关系所示:sin(a+b) = sin(a) × cos(b) + cos(a) × sin(b),从生成正交信号这一角度,这有其价值。

ADI公司的ADSP-21000系列应用手册第1卷描述了一个近乎理想的(用于嵌入式系统)正弦近似值函数,该函数基于为第一个ADI DSP浮点处理器编写的幂级数优化,即ADSP-21020,后者基本上属于SHARC核。这种sin(x)的实现方法依赖于Hart等人4发布、由Cody和Waite5完善、适用于浮点运算的极大极小逼近多项式,以减少舍入错误和避免出现前面提到的取消。极大极小方法依赖于切比雪夫多项式和雷米兹交换算法来确定所需的最大相对误差的系数。如图3中的MATLAB所示,与第七阶泰勒多项式6相比,设置系数的微小变化可能会明显提高极小极大值的精度。为了实现精度与速度的最佳平衡,这个正弦近似值函数的角输入范围应该缩小到[–π/2至+π/2]区间内,且软件程序包含一个有效的范围缩减滤波器,约占总“正弦”子程序执行时间的30%。

近乎完美的DDS正弦波信号音生成器

图3.不同于泰勒-麦克劳林方法围绕0进行定义,极小极大正弦逼近方法在[–π/2至+π/2]区间内,会最小化和均衡最大相对误差。

虽然所有计算都可以使用32位定点算法执行,但多年以来,最常见和最方便的数学计算格式是IEEE 754浮点标准,特别是在处理长数字时。作为一家DSP VLSI芯片制造商,ADI公司从一开始就率先采用了IEEE 754-1985标准。当时还没有单芯片浮点DSP处理器,只有简单的浮点乘法器和ALU计算IC,如ADSP-3212和ADSP-3222。这种格式取代了计算机行业的大多数专有格式,成为所有SHARC DSP处理器的本机格式,采用单精度32位、扩展精度40位,以及最近出现的适用于ADSP-SC589 和ADSP-SC573的双重精度64位。

具备32位尾数的SHARC 40位扩展单精度浮点格式为这种正弦波生成应用提供了足够的精度(u 2–32),且有助于保持均等,Cody和Waite表示第15阶多项式的总体近似精度为32位,在[0至+π/2]输入域内具有均匀分布的误差。为了最大限度减少运算次数并保持精度,最后的调整是对多项式计算执行霍纳法则,这是一种快速求幂的方法,可以求取一个点的多项式值,所以:

近乎完美的DDS正弦波信号音生成器

R1至R7是多项式级数的Cody和Waite系数,只需要进行8次乘法和7次加法即可计算任何输入参数ε[0, π/2]的正弦函数值。以汇编子程序的形式编写的完整sin(x)近似代码在SHARC处理器上大约执行22个核心周期。原有的汇编子程序在更改之后,在获取40位多项式浮点系数时执行同步双存储器访问,以减少6个周期。

近乎完美的DDS正弦波信号音生成器

图4.软件DDS简化框图给出了处理单元之间的各种量化步骤的数据运算格式和位置。


推荐
关闭