数字信号处理应用中的数值逼近方法概述

作者:

Don Morgan


高级工程师


Ultra Stereo实验室


Email:dgm@baykitty.com


在数字信号处理过程中,经常要采用逼近法,内插法就是一种常用的数值逼近法。内插法通常定义为根据二个已知值估计出中间值,例如一个函数或序列,其 中最常见的形式是线性内插法。线性内插法在二个已知数据点间画一条直线,新的数据点就位于这条直线上,具体位置要根据其值与二个端点之一的接近程度确定。

在以下方程中:

值f(a)和f(b)是x=a和x=b时的已知数据点。

假设在某一特定应用中需要解出指数函数exp(x)的不同值。就像嵌入式系统遇到的情况那样,我们通常没有足够的内存或处理器速度。表1给出的是覆盖了非常小的插值间隔的所有已知值。

如果要解出exp(3.8)的值,那么线性内插法将按以下方式运行:



从图1可以看到,尽管内插器是线性的,但函数f(x)却不是一条直线。因此除了端点外,我们所选用的所有值都不能精确地代表 函数。根据所要的精度、可用数据点数量及其间距,这可能不是什么问题;但如果函数值在数据点之间波动,并且所希望的精度要求这样,那么我们就需要一个更大 些的表格。

例如采用线性内插法的频率综合,它往往需要很大的波表(wave table)才能获得无假频的清晰声音。在数据带宽不受限的情况下,表格的分辨率越大,你的内插器就越精确,但由于受实际内存空间的限制,并不是所有应用 都能提供如此大的表格,因此怎样才能增加精度而又保证表格不至于太大呢?其实有许多解决方案,拉格郎日内插法就是其中之一。

拉格郎日内插器

拉格郎日内插器能将数据拟合为多项式。根据Weierstrass定理,如果x0,x1...,xn互不相关,那么对于y0,y1...,yn就存在唯一的小于等于n次的多项式:

我们可以利用该方程得到通过第n+1个数据点的n次多项式。由此看来,我们可以认为真正的多项式是:



此时每个数据点都作为一项。这时的编码就特别容易,因为所有点可以分解到:



需要解释一下这一步运算的核心:



假设为xi=xj外的所有取样点都定义了一个多项式或函数f(xi)=0并把它写下来:



然后写出只用于非零点的方程:



那么我们就可以用方程8对方程7作归一化处理来得到方程5。

为了进一步演示其工作机理,我们采用了与上述线性内插法案例相同的指数函数和数据点(来自表1),结果却大不相同。拉格郎日 内插器的结果是44.677,线性内插器的结果是47.6956,而这些结果基于的都是同一信息。事实上拉格郎日内插器需要更多的运算,后面我们会进一步 解释,首先让我们看一下实现方法。

为了说明实现的简易性,这里提供一个用C语言编写的函数:


===================================


s = 0;


for (i= 0; i <= m; i++)


{


z = 1.0;


for (j=0; j<=n; j++


{


if (i!=j)z=z*(T-x[j])/(x[i]-x[j]);


}


s = s + z * f[i];


}


==================================


为了提高速度,我们可以预先算出方程2的中间值来减少内插器所需的运算量。由于这些值都可以预先知道,因此可以把它们存储在一个替代yi表格的表格中。这时我们只需要把每个值与相应的gi(x)相乘就可以了,这一过程在8051上运行基本没有问题。图1:内插器是线性的,但函数f(x)却不是一条直线。

该算法用只有10条记录的表格就能获得线性内插法用1,000条记录的表格才能达到的精度,利用预先算出的已知条件还可以达到较快的速度。对于输出必须适配预定数据点集的嵌入式系统来说,这种算法能极大地减轻运算的复杂性。

切比雪夫函数

包括拉格郎日在内的许多内插器在待拟合数据的中段都很有效,但接近端点时性能就会恶化。如果能按一定阶数切比雪夫多项式零点 控制下的间隔重新取样,我们就能从容地修正插值间隔上的误差,这样做听起来有点复杂,但只要简单地作下修改,我们就可以得到与拉格郎日算法具有相同速度和 效率的算法,而且具有更好的兼容性和可靠性。

切比雪夫函数值围绕零点上下波动,波动间隔范围是-1到1。有趣的是,这类函数的频率在间隔端点处会有所提高。因此若要采用符合插值间隔的切比雪夫多项式零点进行采样,在间隔端点上的采样数必须超过间隔中间的采样数。这样才能弥补用等距方法采样时端点处精度的不足。

这并不意味整个内插间隔上的结果会有更高的精度,但它确实会将任何错误分散到整个间隔上。换句话说,在间隔端点上获得的结果有望具有与中心点相同的可靠性。

那么是如何做到这一点的呢?首先需要决定插值的间隔范围。在上面所用例子中,间隔范围是0到9,然后我们就给它配备一个切比 雪夫多项式;如果配备的是拉格郎日算法,那么其阶数要大于拉格郎日多项式。在本例中,拉格郎日多项式的阶数是9,因此切比雪夫多项式的阶数是10。下面的 方程用来选取采样点:

在该方程中,a是间隔的起点,b是间隔的终点,c是所需多项式的阶数。表2给出了新的切比雪夫取样点。



此时的算法就能在插值间隔的任何地方产生有用结果,而且速度相当快,所占存储器空间也比较少。

结论

由于多项式阶数取决于表格的长度,即使有预先计算的部分,但当所需精确数字数量较多时还是需要非常复杂的运算。每个新值都必须从头计算,因为前面估测的结果中根本没有可利用的部分。拉格郎日多项式误差的计算也比较困难,即使对切比雪夫来说也不是件轻易的事。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值