学习麦克风阵列信号处理(一)——维纳滤波器

        维纳滤波(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:');

 

 

发布了26 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/sad490/article/details/81414733