设滤波器传递函数为H(z),则输入信号X(z)到输出信号Y(z)的滤波变换是:
Y(z)=X(z)H(z)
滤波时输入信号X(z)和系统函数H(z)已知,通过滤波过程计算输出信号Y(z);逆滤波时则是输出信号Y(z) 和系统函数H(z)已知,试图从输出信号Y(z)中恢复输入信号X(z),即实现X(z)=Y(z)/H(z)变换。
如果滤波过程没有让X(z)损失任何成分,只是各种频谱成分数值变化了,则从Y(z)通过逆滤波可以几乎完整地恢复出X(z)。例如,一个单频正弦波,通过一个截止频率远高于信号频率的低通滤波器,则从滤波后信号恢复原始信号很容易,只要把系统函数H(z)的分子分母颠倒作为逆滤波器系统函数就可以了,恢复信号误差几乎为0。但是,如果过滤的是个语音信号,由于频谱损失难免(变成0值),则通过逆滤波恢复出的原始信号就不那么理想了。
下面总结几个主要概念
一、滤波器与逆滤波器
MATLAB中滤波与逆滤波都可以用filter实现,只要根据滤波器参数指标设计出相应形式的滤波器就行。滤波器形式可以有多种选择。例如,设计一个4阶低通Butterworth滤波器,分别实现滤波与逆滤波。其MATLAB代码是
[B, A] = butter(4, 0.5);
SigY = filter(B,A,SigX);
xSig = filter(A,B,SigY);
其中B,A是数字滤波器系数;SigX是输入信号时间序列,SigY是输出信号时间序列,xSig是SigX的逆滤波信号。下面两个图是所设计4阶Butterworth滤波器滤波和逆滤波的幅频特性和相频特性曲线图,可以看到滤波与逆滤波特性是完全互补的。
二、正弦信号的滤波与逆滤波
产生一个单频正弦波信号,用上面的滤波器滤波,再逆滤波,绘图比较结果
% 产生正弦波并滤波,再对滤波后信号逆滤波
t = 0:0.02:2;
originalSig = sin(2*pi*40*t);
[B, A] = butter(4,0.5);
filteredSig = filter(B,A,originalSig);
inversedSig = filter(A,B,filteredSig);
% 绘图比较原始信号和逆滤波信号
xI = 1 : length(originalSig);
subplot(211);
plot(xI, originalSig, 'k-', xI, inversedSig, 'r--');
% 原始信号与逆滤波信号样点差值的绝对值
subplot(212);
xDiff = abs(originalSig - inversedSig);
plot(xDiff);
三、语音信号的滤波与逆滤波
取MATLAB R2018b中一个语音信号,用上面的滤波器滤波。代码如下:
% strong.mat文件中有两个信号:英语单词strong的男女声发音
load(fullfile(matlabroot,'examples','signal','strong.mat'))
originalSig = his;
[B, A] = butter(4,0.5);
filteredSig = filter(B,A,originalSig);
inversedSig = filter(A,B,filteredSig);
% 绘图比较原始信号和逆滤波信号,
xI = 1 : length(originalSig);
subplot(211);
plot(xI, originalSig, 'k-', xI, inversedSig, 'r--');
% 误差信号:原始信号与逆滤波信号样点差的绝对值
subplot(212);
xDiff = abs(originalSig - inversedSig);
plot(xDiff);
可以看到,虽然逆滤波后的波形与原始波形还是高度重叠,但是误差数值与正弦波情况下相比,已经上升了几个数量级。
实际中,一般不知道滤波器传递函数,都是假设其为具有某些参数的某种形式滤波器,然后通过一些优化原则得到模型参数。例如,处理室内混响语音时,一般假设混响语音是室内声源直达麦克风的信号与六个墙面(四面墙加上地面和屋顶)多次反射并衰减信号的组合,把这种思路建模为一个室内冲激响应。想得到原始语音,就要对混响语音逆滤波。这时候就要想办法通过混响信号找到一个逆滤波器,通过逆滤波尽可能恢复原信号。