迭代算法太慢?试试滤波器吧!

1.前言

在信号处理领域,一个信号当前时刻的值常常与其过去时刻的值以及输入信号有关,很多人会用迭代算法去求,这是一种很直观的解决办法,但迭代算法实在是太慢了,尤其是数据量很大时,对实时信号处理简直是灾难!

有什么办法可以加快处理速度吗?答案是“滤波器”!

用信号与系统的角度去观察世界,所有的处理过程都可以看作一个滤波器。

下面以AR(2)模型为例,比较迭代算法和使用滤波器处理的结果!

2.算例

$AR \left( 2 \right)$过程$u_{n}$的差分方程为$u_{n} = -a_{1}u\left( n-1 \right) - a_{2}u\left( n-2 \right) + v\left( n \right)$,其中$v_{n}$是零均值,方差为$\sigma_{v}^{2}=0.0731$的加性白噪声。$AR$参数$a_{1} = -0.975,a_{2} = 0.95$。需要产生$N=512$点的$u_{n}\left( n= 1,2,\cdots,N \right)$.

3.结果比较

可以看到,滤波器实现和迭代实现结果是一样的。

利用$Matlab$的$tic,toc$函数,得到两种方法的运行时间,可以看到基于滤波器实现的时间要比迭代算法实现快一个数量级左右,是这一个很大的提升,特别是样本点数很大时!

4.$Matlab$代码实现及下载

data_len= 512;%样本序列长度
trials = 100;%随机试验的次数
n = 1:data_len;
a1 = -0.975;
a2 = 0.95;
sigma_v_2 = 0.0731;
v = sqrt(sigma_v_2) * randn(data_len,1,trials);%产生噪声v(n)
%滤波器实现
tic;
u0 = [0 0];
num = 1;%分母系数
den = [1 a1 a2];%分母系数
Zi = filtic(num,den,u0);%滤波器的初始条件
u = filter(num,den,v,Zi);%产生样本序列u(n)
toc;
%迭代算法实现
tic;
u1 = zeros(data_len ,1,trials);
u1(1,1,:) = v(1,1,:);
u1(2,1,:) = -a1*u1(1,1,:) + v(2,1,:);
for i = 3:data_len
    u1(i,1,:) = -a1*u1(i-1,1,:)-a2*u1(i-2,1,:)+v(i,1,:);
end
toc

下载代码请移步迭代算法的滤波器实现

你可能也喜欢

发表评论

电子邮件地址不会被公开。