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