學習麥克風陣列信號處理(一)——維納濾波器

鄙人不才,初次接觸信號處理這個方向,通過三週的麥克風陣列信號處理學習,在此幾下我的一點學習經驗。

        維納濾波(wiener filtering) 一種基於最小均方誤差準則、對平穩過程的最優估計器。這種濾波器的輸出與期望輸出之間的均方誤差爲最小,因此,它是一個最佳濾波系統。它可用於提取被平穩噪聲所污染的信號。

        從連續的(或離散的)輸入數據中濾除噪聲和干擾以提取有用信息的過程稱爲濾波,這是信號處理中經常採用的主要方法之一,具有十分重要的應用價值,而相應的裝置稱爲濾波器。根據濾波器的輸出是否爲輸入的線性函數,可將它分爲線性濾波器和非線性濾波器兩種。維納濾波器是一種線性濾波器。

由於本人目前專門做關於語音處理方面的工作,所以以語音方面的維納濾波爲例來說明。

對於語音信號,設其符合如下模型:

                                                y(k) = x(k) + v(k)

其中x(k)爲語音源信號,v(k)爲噪聲信號。再定義信號樣值和估計值之間的誤差爲

                                               e(k)=y(k)-z(k)

                                                       \small =x(k)-h^{T}y(k)

其中,

                                              \small h^{T}=[h_{0}, h_{1}, h_{2}, h_{3} ... h_{L-1}]

爲長度爲L的FIR濾波器(FIR是有限長單位衝擊響應濾波器)。

\small y(k)爲觀測信號,那麼

                                   \small y(k)=[y(k) y(k-1), y(k-2) ,y(k-3) ,y(k-4) ... y(k-L+1)]^{T}

與濾波器的長度相等,那麼

                                                    \small z(k)=h^{T}y(k)

MSE準則爲

                                                   \small J(h)=E[e^{2}(k)]

                                                           \small =h^{T}R_{yy}h-2r_{yx}^{T}h+\sigma ^{2}_{x}

其中,

                                                          \small R_{yy}=E[y(k)y(k)^{T}]

                                                             \small r_{xy}=E[y(k)x(k)]

那麼,最優濾波器爲

                                                           \small h_{w}=\arg \min_{h}J(h)=R_{yy}^{-1}r_{yx}

由於\small x(k)是不可知的,所以我們無法直接計算\small r_{yx},只能對它進行估計,由於,

                                                       \small \begin{aligned} r_{yx}&=E[\textbf{y(k)}x(k)]\\ &=E[\textbf{y(k)}[y(k)-v(k)]] \\ &=E[\textbf{y(k)}y(k)]-E[\textbf{x(k) + v(k)}v(k)]\\ &=E[\textbf{y(k)}y(k)]-E[\textbf(v(k))v(k)]\\ &=\textbf{r}_{yy}-\textbf{r}_{vv} \end{aligned}

以下是我個人的代碼。

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:');

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章