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