当前位置:   article > 正文

Levinson-Durbin算法的实现_levinsondurbin算法过程

levinsondurbin算法过程

    在实现维纳滤波器和预测器的时候,需要计算数据的自相关矩阵的逆。但是当数据量比较大的时候,计算矩阵的逆花费的代价比较大,所以需要使用Levinson-Durbin算法来实现系数的求解。

一、数据模型

k阶前向维纳预测器:

                                    

对上述模型进行变换:

                                    

所以a(0) = 1 , a(i) = -w(i)

注意,在Levinson-Durbin算法中,求解的是a(i), 不是w(i)。


二、Levinson-Durbin迭代算法的实现步骤

    其实关于Levinson-Durbin迭代算法的原理,如果不太清楚的话,也没有关系。只要根据下列步骤就能实现迭代算法。m是预测器的阶数。

1、

2、

3、

4、

初始化值:p(0) = r(0),  a(m-1, 0) = 1,    a(m-1, m) = 0。

其中 r( i ) 是数据的自相关矩阵。


三、matlab实现代码

  1. %alex
  2. clear all;clc
  3. N = 1024;
  4. u = randn(1,N); %产生均值为0,方差为1的高斯白噪声
  5. y(1:2) = u(1:2);
  6. y(3) = -0.69*y(1)+u(3);
  7. y(4) = -0.69*y(2)-0.044*y(1)+u(4);
  8. for n=5:N
  9. y(n) = -0.69*y(n-2)-0.044*y(n-3)+0.0672*y(n-4)+u(n);
  10. end
  11. %根据耶鲁沃克方程实现如下函数
  12. %求得是前向预测器,所以只用到了数据的自相关。若是滤波则需要用到互相关
  13. %M是预测器的阶数,改变M即可改变预测器的阶数
  14. %ry是训练数据的输入自相关
  15. M = 4; %M为预测器的阶数
  16. [ ry ] = myxcorr(y,M+1);
  17. Ry = toeplitz(ry(1:M));
  18. Rxy = ry(2:M+1)';
  19. w = inv(Ry)*Rxy;
  20. w = w'
  21. %根据levinson迭代公式实现如下函数
  22. %M是预测器的阶数,改变M即可改变预测器的阶数
  23. %ry是训练数据的输入自相关
  24. %init
  25. p(1) = ry(1);
  26. for m = 1:M
  27. a(m,1) = 1;
  28. a(m,m+1) = 0;
  29. tmp = 0;
  30. for L = 0:m-1
  31. tmp = tmp + ry(m-L+1)*a(m-1+1,L+1);
  32. end
  33. delt(m) = tmp; %delt(1)相当于delta(0
  34. k(m) = -delt(m)/p(m); %k(1)就是看k(1)
  35. p(m+1) = p(m)*(1-abs(k(m))^2); %p(m+1)相当于p(m)就是p(2)相当于p(1)
  36. for L = 0:m
  37. a(m+1,m-L+1) = a(m-1+1,m-L+1) + k(m)*a(m-1+1,L+1);
  38. end
  39. end
  40. levinson_w = -a(M+1,2:M+1)
  41. levinson_a = a(M+1,:)
  42. %采用matlab库函数所求的系数
  43. [r,lg] = xcorr(y,'biased');
  44. r(lg<0) = [];
  45. stand_ar = levinson(r,4)
  46. 输出结果:
  1. w =
  2.     0.0327   -0.6450   -0.0261    0.0731
  3. levinson_w =
  4.     0.0327   -0.6450   -0.0261    0.0731
  5. levinson_a =
  6.     1.0000   -0.0327    0.6450    0.0261   -0.0731
  7. stand_ar =
  8.     1.0000   -0.0327    0.6441    0.0260   -0.0725
  1. function [ rx ] = myxcorr( x, M )
  2. %该函数用于求出 x 的自相关函数,从r(1)到r(M)
  3. % 输入x为一个1 X N 维矩阵的矩阵,M阶数
  4. % 输出rx为自相关函数
  5. N = length(x);
  6. rx = zeros(1,M);
  7. for i = 1:M    %加一是为了求Rxy
  8.     rx(i) = x(i:N)*x(1:N-i+1)'/(N-i+1);
  9. end
  10. % Rx = toeplitz(rx);
  11. end
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/182703
推荐阅读
相关标签
  

闽ICP备14008679号