漫谈维纳滤波及MATLAB实现

漫谈维纳滤波及MATLAB实现

  • 1.序幕
  • 2.基础需求
  • 3.深层思考
  • 4.举个例子
  • 5.小结

1.序幕

维纳滤波器与卡尔曼滤波器可以看做是起源一样的,虽然维纳滤波器处理的是平稳信号,并且公式也足够简单,不过对于初学者来说理解起来仍然十分困难,甚至并不如卡尔曼滤波理解起来那样顺理成章,所以根据简单的例子,来理解一下什么是维纳滤波,然后就可以进行深层次的思考了

个人认为维纳滤波器算是自适应滤波器吧,暂且标注在这,学到的话回来修正

2.基础需求

维纳滤波器的理解,并不需要特别具体的例子来引出,只需要看几步推导的公式就足够了,但是想要会用,确实需要一点点的例子来辅助

part 1.维纳滤波的模型
漫谈维纳滤波及MATLAB实现_第1张图片

s ( n ) s(n) s(n)--------真实信号
v ( n ) v(n) v(n)--------各种加性噪声或者干扰
x ( n ) x(n) x(n)--------观测信号
s ^ ( n ) \hat{s}(n) s^(n)--------估计信号
我们认为系统是线性的,真实的信号 s ( n ) s(n) s(n)加入一系列的干扰,噪声 v ( n ) v(n) v(n)后,变成我们看到的信号 x ( n ) x(n) x(n),我们可以根据一些性质(下面提及,就是根据线性空间的知识所得的一些垂直条件),来推算出一个线性的变换,从 x ( n ) x(n) x(n)中恢复出 s ^ ( n ) \hat{s}(n) s^(n)

part 2.维纳滤波的公式推导

公式推导就站在巨人肩膀
看知乎文章维纳滤波原理(Wiener Filter)
以及一个课件现代数字信号处理
讲的很清楚【后面有必要的话再重新整理一下】

3.深层思考

4.举个例子

举个例子,假设我们有一个频率为 f 1 f_1 f1的余弦信号,混进了频率为 f 2 f_2 f2的余弦信号以及高斯噪声,当然这个例子用普通的数字滤波器也是可以做的,这里我们看一下如何用 w i e n e r wiener wiener滤波器处理

%% wiener
clc;clear all;close all;
%% 数据准备
t = 0:0.001:0.2;
f = 20;
sn = 20*cos(2*pi*f*t);
vn = 0.5*wgn(1,length(t),2) + 10*cos(2*pi*120*f*t+0*2*pi);      % 加入噪声
xn = sn + vn;	% 观测信号
xb = cos(2*pi*f*t);       % 期望信号模型
%% 相关函数获取
a = xcorr(xn,xb,'coeff');	% 归一化的观测与期望的互相关函数
b = a(length(t):2*length(t)-1);	% 取出0~N-1点数的互相关函数
c = xcov(xn,xn,'coeff');	% 归一化的观测自相关函数
Rx = c(length(t):2*length(t)-1);	% 取出0~N-1点数的互相关函数
% 按照相关矩阵的形式,准备好相关矩阵Rx即代表的是Rxx
for i = 2:length(t)
    Rx = [Rx;c(length(t)+1-i:2*length(t)-1+1-i)];
end
%% 滤波
w = (Rx)\b.';
sh = xcov(w,xn).';	% 在时域要用卷积处理
sh = fliplr(sh(1:length(t)));	% 注意最后得到的结果取值的时候,存在从后向前取,故需要翻转
%% 展示
figure;hold on;grid on;
plot(t,sn);
plot(t,xn);
plot(t,sh,'g');
legend('sn','xn','$\hat{s}(n)$','Interpreter','latex');
title('wienerfiltering');xlabel('t');ylabel('A');

效果
漫谈维纳滤波及MATLAB实现_第2张图片

注:问题应该主要是在相关函数的求取以及滤波的实现上,对于用矩阵处理的过程而言,判断好矩阵的大小和维数是很重要的

5.小结

参考

  1. 维纳滤波原理
  2. 现代数字信号处理
  3. 维纳滤波器
  4. 维纳滤波器
  5. 维纳滤波
  6. Wiener维纳滤波基本原理及其算法实现

你可能感兴趣的:(算法漫谈,维纳滤波,matlab,滤波)