鄙人不才,初次接觸信號處理這個方向,通過三週的麥克風陣列信號處理學習,在此幾下我的一點學習經驗。
維納濾波(wiener filtering) 一種基於最小均方誤差準則、對平穩過程的最優估計器。這種濾波器的輸出與期望輸出之間的均方誤差爲最小,因此,它是一個最佳濾波系統。它可用於提取被平穩噪聲所污染的信號。
從連續的(或離散的)輸入數據中濾除噪聲和干擾以提取有用信息的過程稱爲濾波,這是信號處理中經常採用的主要方法之一,具有十分重要的應用價值,而相應的裝置稱爲濾波器。根據濾波器的輸出是否爲輸入的線性函數,可將它分爲線性濾波器和非線性濾波器兩種。維納濾波器是一種線性濾波器。
由於本人目前專門做關於語音處理方面的工作,所以以語音方面的維納濾波爲例來說明。
對於語音信號,設其符合如下模型:
其中爲語音源信號,爲噪聲信號。再定義信號樣值和估計值之間的誤差爲
其中,
爲長度爲L的FIR濾波器(FIR是有限長單位衝擊響應濾波器)。
爲觀測信號,那麼
與濾波器的長度相等,那麼
MSE準則爲
其中,
那麼,最優濾波器爲
由於是不可知的,所以我們無法直接計算,只能對它進行估計,由於,
以下是我個人的代碼。
L = 10000;
N = 100; % 濾波器的階數
a = 0.95;
b1 = sqrt(12 * (1 - a ^ 2)) / 2;
b2 = sqrt(3);
w = random('uniform', -b1, b1, 1, L);
v = random('uniform', -b2, b2, 1, L);
u = ones(1, L);
s = zeros(1, L);
s(1) = w(1);
for i = 2:L
s(i) = a * s(i - 1) + w(i);
end
x = zeros(1, L);
x = s + v;
i = L - 100 : L;
figure;
plot(i, s(i), i, x(i), 'r:');
h1 = zeros(N:1);
for i = 1:N
h1(i) = 0.238 * 0.724 ^ (i - 1) * u(i);
end
%% 解相關矩陣。
Rxx = zeros(N, N);
rxs = zeros(N, 1);
x_v = corrmtx(x, N - 1);
Rxx = x_v' * x_v;
s_v = corrmtx(s, N - 1);
Rxs = x_v' * s_v;
rxs = Rxs(:, 1);
h2 = Rxx ^ (-1) * rxs;
%% 計算Si
Si = zeros(1, L);
Si(1) = x(1);
for i = 2:L
Si(i) = 0.724 * Si(i - 1) + 0.238 * x(i);
end
Sr = zeros(1, L);
for i = 1:L
tmp = 0;
for j = 1 : N- 1
if (i - j <= 0)
continue;
else
tmp = tmp + h2(j) * x(i - j);
end
end
Sr(i) = tmp;
end
i = L-100:L;
figure;
plot(i, s(i), i, Si(i), 'r:');