查找反向一极低通滤波器

信息处理 过滤器 过滤器设计 低通滤波器 无限脉冲响应 反卷积
2022-02-13 05:27:36

我需要找到一个可以恢复当前信号的单极滤波器的滤波器,一个使用 Python(或 MATLAB)的函数scipy.signal.filtfiltscipy.signal.lfilter

我要恢复的“原始”信号是:

[0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] 

我拥有的“过滤”信号是:

[ 0., 0., 0., 0., 0., 0., 0., 0.25956786, 0.48537242, 0.68182373, 0.85275161, 1.00148237, 1.1309067, 1.24353671, 1.34155607, 1.42686391, 1.50111103, 1.62198067, 1.67093897, 1.71355379, 1.81104326, 1.83550966, 1.85680735, 1.87534702, 1.89148581, 1.90553486, 1.9177649, 1.92841125, 1.93767929, 1.95277071]

我想找到 ( b, a) 值来执行“ original=signal.filtfilt(b,a,filtered)

原始 = 红色 过滤 = 蓝色

过滤=蓝色,原始=红色

2个回答

蓝色曲线似乎不准确,并且有点不平滑。但是,我将给出一个单极滤波器来近似它。

不难证明,滤波器的阶跃响应 形式为

H(z)=1p1pz1

s[n]=(1pn+1)u[n]

要找到阶跃响应,只需将问题中给出的信号向左移动并将其除以就足够了。因此,零时的输出为要找到参数,请在给定方程中将其替换为20.25956786/2=0.1298ps[n]n=0

0.1298=1pp=0.8702
所以我们要找的滤波器是 更清楚的是,
H(z)=0.129810.8702z1
b=0.1298a=[1,0.8702]

这是 Matlab 中的比较: 在此处输入图像描述

可以看出前输出与实际输出非常接近。但是,输出变得不平滑后,会出现一个小错误。或者,我们可以使用的术语作为参考。在这种情况下,这将导致大处的误差10n=22

1.95277071/2=1p23p=0.8497.
nn

使用代码

y = [0.25956786, 0.48537242, 0.68182373, 0.85275161, 1.00148237, 1.1309067, 1.24353671, 1.34155607, 1.42686391, 1.50111103, 1.62198067, 1.67093897, 1.71355379, 1.81104326, 1.83550966, 1.85680735, 1.87534702, 1.89148581, 1.90553486, 1.9177649, 1.92841125, 1.93767929, 1.95277071]
fun = @(P)2*(1-P.^(1:23))-y;
p = lsqnonlin(fun,.5);

p=0.8644给出了这个问题的最小二乘 (LS) 解决方案,它与下图中的原始输出 ( ) 进行了比较:SSE=0.02796

在此处输入图像描述

请注意,如果前向滤波器是,那么是反向滤波器,它为您提供原始输入。如果无法修复阶跃响应中的误差,您可以对整体输出应用 LS 方法(考虑逆滤波器)以获得更好的结果。(b,a)(a,b)

  • 使用

    b=[0.1298]
    a=[1,-.8702]

    在此处输入图像描述

  • 使用

    b=[1-.8497]
    a=[1,-.8497]

    在此处输入图像描述