本文适合快速了解维纳滤波,并能够进行实际数据的处理。
* 有蛮多视频进行了详细的讲解,这里不在赘述。参考如下:
语音增强-维纳滤波1_哔哩哔哩_bilibili
语音增强-维纳滤波2_哔哩哔哩_bilibili
1. 维纳滤波是根据全部过去观测值和当前观测值来估计信号的当前值;
2. 维纳滤波只适用于平稳随机过程;
3.设计维纳滤波器要求已知信号与噪声的相关函数。
(1) 原始一维信号:Signal_Original = sin(2 * pi * 10 * t) + sin(2 * pi * 20 * t) + sin(2 * pi * 30 * t)
Fs = 1000; # 采样率
N = 1000; # 采样点数
n = 0:N - 1;
t = 0:1 / Fs:1 - 1 / Fs; # 时间序列
##期望信号
Signal_Original = sin(2 * pi * 10 * t) + sin(2 * pi * 20 * t) + sin(2 * pi * 30 * t);
plot(Signal_Original)
title('期望信号');
axis([0 1000 -4 4]); # 设置坐标轴在指定的区间
xlabel('Time(n)');
ylabel('Amplitude');
(2) 噪声信号:Noise_White
##噪声信号
##前500点高斯分布白噪声,后500点均匀分布白噪声
Noise_White = [0.3 * randn(1, 500), rand(1, 500)];
plot(Noise_White)
title('噪声信号');
xlabel('Time(n)');
ylabel('Amplitude');
(3) 混合信号:Signal_Original + Noise_White
##噪声干扰后信号
Mix_Signal = Signal_Original + Noise_White; # 构造的混合信号
subplot(2,2,3)
plot(Mix_Signal)
title('噪声干扰后混合信号');
axis([0 1000 -4 4]); # 设置坐标轴在指定的区间
xlabel('Time(n)');
ylabel('Amplitude');
* 结合下面整体结构框架的关键点,再学习维纳滤波原理,会更有帮助~
* 主要步骤如下:
(1) 混合信号的自相关系数Rxx (维纳滤波原理中有提及);
(2) 混合信号与原始信号的互相关系数Rxy (维纳滤波原理中有提及);
xcorr函数:用于计算两数据的相关系数
(3)设定阶数M = 100 (可调参数,影响滤波效果);
(4)通过循环构建混合信号自相关矩阵rxx(i,j) (维纳滤波原理中有提及);
(5)得到混合信号与原始信号的互相关向量rxy(i) (维纳滤波原理中有提及);
(6)得到设计的Wiener滤波器系数(关键数据,用于后续对信号进行维纳滤波操作):
h = inv(rxx)*rxy'
inv函数:用于求逆矩阵;若出现报错可采用pinv函数,求伪逆矩阵。
##维纳滤波
Rxx = xcorr(Mix_Signal,Mix_Signal);# 得到混合信号的自相关函数
Rxy = xcorr(Mix_Signal,Signal_Original);# 得到混合信号和原始信号的互相关函数
M = 100;# 维纳滤波阶数
for i = 1:M # 得到混合信号的自相关矩阵
for j = 1:M
rxx(i,j) = Rxx(N-i+j);
end
end
for i = 1:M # 得到混合信号和原信号的互相关向量
rxy(i) = Rxy(i+N-1);
end
# 得到所要设计的Wiener滤波器系数
h = pinv(rxx)*rxy';
filter函数:用于根据所设计滤波器对信号进行滤波处理。
##维纳滤波后的信号
Signal_Filter = filter(h,1,Mix_Signal);# 将输入信号通过维纳滤波器
plot(Signal_Filter);
title('维纳滤波后的信号');
axis([0 1000 -4 4]); # 设置坐标轴在指定的区间
xlabel('Time(n)');
ylabel('Amplitude');
应用subplot函数,将四幅图同时显示,最终效果如下:
*均方误差常用于评价滤波前后的信号差异
(通过数值方式评价滤波效果,而不是通过图像显示直接观察,更有说服力)
*通常根据不同的实际情况,可采用不同的评价指标。
fprintf('引入噪声后信号相对原信号的统计均方误差:\n');
mse1 = mean((Mix_Signal-Signal_Original).^2); # 滤波后的信号相对原信号的统计均方误差
mse1
fprintf('滤波后的信号相对原信号的统计均方误差:\n');
mse2 = mean((Signal_Filter-Signal_Original).^2); # 滤波后的信号相对原信号的统计均方误差
mse2
mean函数:平均值计算。
* 引入噪声后信号相对原信号的统计均方误差:
mse1 = 0.2172
* 滤波后的信号相对原信号的统计均方误差:
mse2 = 0.0306
应用维纳滤波后,信号更接近于原始信号。