Levinson Durbin演算法的實現

2021-08-18 01:20:14 字數 2366 閱讀 8278

在實現維納濾波器和**器的時候,需要計算資料的自相關矩陣的逆。但是當資料量比較大的時候,計算矩陣的逆花費的代價比較大,所以需要使用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實現**

%alex

clear all;clc

n = 1024;

u = randn(1,n); %產生均值為0,方差為1的高斯白雜訊

y(1:2) = u(1:2);

y(3) = -0.69*y(1)+u(3);

y(4) = -0.69*y(2)-0.044*y(1)+u(4);

for n=5:n

y(n) = -0.69*y(n-2)-0.044*y(n-3)+0.0672*y(n-4)+u(n);

end%根據耶魯沃克方程實現如下函式

%求得是前向**器,所以只用到了資料的自相關。若是濾波則需要用到互相關

%m是**器的階數,改變m即可改變**器的階數

%ry是訓練資料的輸入自相關

m = 4; %m為**器的階數

[ ry ] = myxcorr(y,m+1);

ry = toeplitz(ry(1:m));

rxy = ry(2:m+1)';

w = inv(ry)*rxy;

w = w'

%根據levinson迭代公式實現如下函式

%m是**器的階數,改變m即可改變**器的階數

%ry是訓練資料的輸入自相關

%init

p(1) = ry(1);

for m = 1:m

a(m,1) = 1;

a(m,m+1) = 0;

tmp = 0;

for l = 0:m-1

tmp = tmp + ry(m-l+1)*a(m-1+1,l+1);

enddelt(m) = tmp; %delt(1)相當於delta(0)

k(m) = -delt(m)/p(m); %k(1)就是看k(1)

p(m+1) = p(m)*(1-abs(k(m))^2); %p(m+1)相當於p(m)就是p(2)相當於p(1)

for l = 0:m

a(m+1,m-l+1) = a(m-1+1,m-l+1) + k(m)*a(m-1+1,l+1);

end

endlevinson_w = -a(m+1,2:m+1)

levinson_a = a(m+1,:)

%採用matlab庫函式所求的係數

[r,lg] = xcorr(y,'biased');

r(lg<0) = ;

stand_ar = levinson(r,4)

輸出結果:

w =

0.0327   -0.6450   -0.0261    0.0731

levinson_w =

0.0327   -0.6450   -0.0261    0.0731

levinson_a =

1.0000   -0.0327    0.6450    0.0261   -0.0731

stand_ar =

1.0000   -0.0327    0.6441    0.0260   -0.0725

function [ rx ] = myxcorr( x, m )

%該函式用於求出 x 的自相關函式,從r(1)到r(m)

% 輸入x為乙個1 x n 維矩陣的矩陣,m階數

% 輸出rx為自相關函式

n = length(x);

rx = zeros(1,m);

for i = 1:m    %加一是為了求rxy

rx(i) = x(i:n)*x(1:n-i+1)'/(n-i+1);

end% rx = toeplitz(rx);

end

KNN,TC text category 基本演算法

knn分類演算法 knn分類演算法是一種傳統的基於統計的模式識別方法。演算法思想很簡單 對於一篇待分類文件,系統在訓練集中找到k個最相近的鄰居,使用這k個鄰居的類別為該文件的候選類別。該文件與k個鄰居之間的相似度按類別分別求和,減去乙個預先得到的截尾閾值,就得到該文件的類別測度。用knn也表示所選k...

日常練習 算

問題背景 zhx幫他妹子做數學題。問題描述 求 如 n 3,m 3,這個值為1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3 56。輸入格式 僅一行,包含兩個數 n和 m.輸出格式 僅一行,包含所求的答案 mod10 9 7的值。樣例輸入 3 3 樣例輸出 資料範圍與規定 對於...

遞迴算年齡

問題描述1 第1個人10歲,第2個人比第乙個人大3歲,第3個人比第2個人大3歲 第8個人比第7個人大3歲,那麼第8個人是多少歲?public class getage 測試 public static void main string args 問題描述2 第8個人的年齡是36歲,第7個人比第8個人...