基于维纳滤波的含噪声语音信号的恢复摘要
本文基于随机信号分析与处理的相关理论,采用维纳滤波技术恢复噪声中的鸟鸣声信号,通过仿真达到预期效果,对工程实践有很好的理论支持。
关键词:维纳滤波器频域法
实验目的
1.熟悉维纳滤波的基本概念
2.熟悉线性最小均方估计的基本原理
3.掌握运用维纳滤波理论恢复信号的基本方法
实验原理
信号从发送者传送到接受者往往受到集中形式的变形而削弱,维纳滤波是一种从接收的原始信号中恢复信号的方法。
由于但时域方法要求协方差矩阵的逆,当数据比较长的时候,求逆的运算量非常大,我们在这里采用频域法来求解。
维纳滤波器作为波形估计的一种方法,可以采用多种估计准则。
假定离散时间的观测过程为
00()()(),,1,...,f z n s n v n n n n n =+=+
其中()v n 为噪声,()s n 为原信号,0n 为起始观测时刻,f n 为观测结束时刻。
在实际常采用易于实现的线性最小均方准则。
线性最小均方估计是观测的线性函数,它可以作为观测序列通过离散时间线性系统,即
0(/)(,)()f
n f k n s n n h n k z k ∧
==∑
滤波器的系数的选择可以由线性最小均方估计的正交原理来求取,即
000{[()(,)()]()}0(,1,...,)
n k n E s n h n k z k z i i n n n =-==+∑
即
000(,)(,)(,),(,1,...,)n
sz z k n R n i h n k R k i i n n n ===+∑
上式也称为Wiener-Hopf 方程。
对于信号和观测过程是平稳随机序列,并且是联合平稳随机序列,系统为因果的线性时不变离散时间线性系统,0
n =-∞,则有
()()()()(),0sz z z l R n h l R n l h n R n n +∞==-=*≥∑
求解维纳滤波器即求系数()h n 的过程。
将上式两边做z 变换,得()()()sz z G z H z G z =
所以, ()()()
sz z G z H z G z = ()H z 称为维纳滤波器。
当信号()s n 与观测噪声统计独立时,维纳滤波器为
()()()()
s s v G z H z G z G z =+ 其中,()v G z 为噪声的功率谱,维纳滤波器用离散傅里叶变换可表示为
()()()()
s s v G H G G ωωωω=+
实验步骤
维纳滤波既可以采用频域方法实现,也可以采用时域方法实现,但时域方法要求协方差矩阵的逆,当数据比较长的时候,求逆的运算量非常大。
本实验给定信号为chirp 信号(鸟叫声),数据文件为chirp.mat (可以从MATLAB 中找到),可以用load (‘chirp ’,“Fs ”,‘y ’)调入数据文件。
用始于发实现维纳滤波的步骤如下:
1) 产生信号()s n 和观测()z n ,信号为chirp 信号(鸟叫声),观测为信号叠
加上高斯白噪声;
2) 估计ˆz R 和ˆsz
R ; 3) 计算1ˆˆopt z sz
h R R -=; 4) 计算估计的信号
10
ˆ()()()N T m s
n h m z n m hz -==-=∑
频域法实现维纳滤波的步骤如下:
1) 产生信号()s n 和观测()z n ,信号为chirp 信号(鸟叫声),观测为信号叠加上高斯白噪声;
2) 估计信号()s n 和()z n 的功率谱,计算维纳滤波的传递函数;
3) 计算输入()z t 和输出信号()y t 的频谱,并对输出信号求烦变化得到时域的输出信号。
实验中用到的MATLAB 函数有:
1) 装入数据文件:Load ;
2) 傅立叶变换与反变换:fftn ,ifftn ;
3) 谱估计:periodogra (周期图谱估计),pburg (最大熵谱估计),welch (welch 谱估计);
4)互相关计算:xcorr。
结果仿真
运用MATLAB进行仿真:
仿真程序如下:
clear;
load('chirp','Fs','y');
p=audioplayer(y,Fs);
play(p);
subplot(2,1,1);
plot(y);
title('原始信号')
Py=fftn(y);
subplot(2,1,2);
plot(abs(Py));
title('原始信号频谱') %原始信号时域图、频域图及信号的播放pause();
N=length(y);
sigma=0.1;%控制噪声强度
z=zeros(N,1);
v=randn(N,1)*sigma; %产生噪声
z=y+v;
q=audioplayer(z,Fs);
play(q);
figure();
subplot(2,1,1);
plot(z);
title('观测信号')
Pz=fftn(z);
subplot(2,1,2);
plot(abs(Pz));
title('观测信号的频谱') %观测信号时域图、频域图及信号的播放pause();
Rz=xcorr(z);
Gz=fft(Rz,N);
Rsz=xcorr(z,y);
Gsz=fft(Rsz,N);
H=Gsz./Gz; %维纳滤波器的传递函数
S=H.*Py;
figure;
plot(abs(S));
title('');
ss=real(ifft(S)); %原始信号的估计
ss=ss(1:N);
figure;
plot(ss);
title('恢复出的原始信号');
d=audioplayer(ss,Fs);
play(d); %恢复信号时域图、频域图及信号的播放
仿真结果:
02000400060008000100001200014000
-1-0.5
0.5
1
原始信号
02000400060008000100001200014000
050
100
150
原始信号频谱
02000400060008000100001200014000
-2-1
1
2
观测信号
02000400060008000100001200014000
050
100
150
观测信号频谱
02000400060008000100001200014000
050
100
150
输出信号频谱
02000400060008000100001200014000
-2-1
1
2
恢复出的原始信号
通过观察频谱图和辨认声音可以发现,经维纳滤波器后,鸟鸣声可以较好的
恢复出来。
下面我们改变噪声的强度,再次进行上面的实验。
实验中我们是通过改变sigma 的值来改变噪声强度的,上面的实验我们取sigma=0.1,下面我们增大sigma 的值。
Sigma=0.5:
02000400060008000100001200014000
观测信号
020004000600080001000012000
14000
观测信号频谱
02000400060008000100001200014000
050
100
150
200
输出信号频谱
02000400060008000100001200014000
-1-0.5
0.5
1
Sigma=1:
02000400060008000100001200014000
-50
5
观测信号
02000400060008000100001200014000
0100
200
300
400
观测信号频谱
02000400060008000100001200014000
050
100
输出信号频谱
02000400060008000100001200014000
-0.4-0.2
0.2
0.4
可见,随着噪声强度的增大,检测效果变差,如上图所示,当sigma=1时,虽然可以基本上观察到输出信号与原始信号的相似之处,但是,从辨认声音的角度来看,已经快分辨不出鸟鸣的声音了,这是因为噪声强度过大,滤波器在滤掉噪声的同时,也滤掉部分信号。
结果分析
课本上给出了两种设计维纳滤波器的方法,一个是时域法,一个是频域法,在实验过程中,我们也尝试着用时域法进行仿真,但是由于涉及到求逆,对于鸟鸣声有13129个数据的话,运算量是非常大的。
通过上面的仿真可以看出,随着噪声越大,信号衰减越大,对于信噪比不高的情况滤波效果不理想。
因此,我们提出改进方案,可以在滤波之前做降噪处理
(低噪放大),提高信噪比,再通过维纳滤波恢复原始信号。
参考文献
[1]罗鹏飞,文明.随机信号分析与处理[M].:清华大学,2006.。