出于好奇,是否可以在 MATLAB 上实际反转过滤。例如,如果我有
[b,a] = butter(6,0.6);
dataIn = randn(1000,1);
dataOut = filter(b,a,dataIn);
在这个例子中是否有一些方法可以dataOut获取?dataIn我能够或多或少地以非常简单的方式到达那里
dataOutprime = filter(a,b,dataOut);
dataOutprime仍然没有完全覆盖在上面dataIn。
出于好奇,是否可以在 MATLAB 上实际反转过滤。例如,如果我有
[b,a] = butter(6,0.6);
dataIn = randn(1000,1);
dataOut = filter(b,a,dataIn);
在这个例子中是否有一些方法可以dataOut获取?dataIn我能够或多或少地以非常简单的方式到达那里
dataOutprime = filter(a,b,dataOut);
dataOutprime仍然没有完全覆盖在上面dataIn。
一般来说,只能实现因果过滤器和稳定过滤器。使用边缘稳定的过滤器也有例外,但这不适用于这里。因此,如果要反转给定的滤波器,只有当它的零点在复平面的单位圆内时才有可能(这种滤波器称为最小相位滤波器)。给定滤波器的零点成为逆滤波器的极点,因此如果零点在单位圆内,则逆滤波器的极点也将在单位圆内,因此得到的滤波器是因果且稳定的。
您示例中过滤器的问题是它在,即在单位圆上。因此,这个滤波器不是严格意义上的最小相位,它不能被一个因果稳定的滤波器反相。但是,它可以通过因果和稳定的过滤器近似地反转。实现这种近似反演的一种方法是最小化理想和实际滤波器响应之间的均方误差。在实践中,向输出添加一些延迟通常是可以接受的,这将更容易通过因果和稳定的滤波器来近似所需的响应。
请注意,瞬变不起作用。问题在于逆滤波器的不稳定性。
举个例子,用一个带系数的滤波器
b = [1,0,-0.5]; a = [1,0.3,0.1];
分子多项式(带系数b)的零点都在单位圆内,因此逆滤波器是因果且稳定的。
x = 兰德(100,1); y = 过滤器(b,a,x); x2 = 过滤器(a,b,y); max(abs(x2-x)) % 1e-16量级,即机器精度
我认为一般方法是正确的。由于高阶 IIR 滤波器的数值不稳定性,您不会得到相同的结果。您可以尝试将过滤器分解为 2 阶过滤器的级联,然后执行相同操作(交换 a 和 b)