scipy中 filtfilt和lfilter 区别

本文深入探讨了使用Python的SciPy库进行信号滤波的方法。通过对比lfilter和filtfilt函数,展示不同滤波方式对信号的影响,特别是关注滤波后的波形偏移问题。
部署运行你感兴趣的模型镜像
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
t = np.linspace(-1, 1, 201)
x = (np.sin(2*np.pi*0.75*t*(1-t) + 2.1) +
     0.1*np.sin(2*np.pi*1.25*t + 1) +
     0.18*np.cos(2*np.pi*3.85*t))
xn = x + np.random.randn(len(t)) * 0.08
b, a = signal.butter(3, 0.05)
zi = signal.lfilter_zi(b, a)
dss = zi
data = []
data3,_ = signal.lfilter(b,a,xn,zi=dss)
print(dss)
for i in xn:

    z, dss = signal.lfilter(b, a, [i], zi=dss)
    
    data.append(z)
#     data2.append(z2)
# print(data2)
data2 = signal.filtfilt(b, a, xn)
plt.figure
plt.plot(t, xn, 'b', alpha=0.75)
plt.plot(t, data, 'r--')
plt.plot(t,data2,'g')
plt.plot(t,data3,'y^', alpha=0.3)
plt.grid(True)
plt.show()

 

蓝色的是原始波形,

红色的是lfilter 波形,一个一个点滤波

黄色的是lfilter 波形,所有点一起滤波

绿色的是filtfilt波形。好像只能多余12个点才能滤波。

 

lfilter 滤波后的波形有偏移,filtfilt滤波后的没有偏移。

 

 

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### Filtfilt与FIR滤波器的概念 FIR(Finite Impulse Response,有限脉冲响应)滤波器是一种线性相位滤波器,具有固定的延迟特性。这种类型的滤波器通过卷积操作处理输入信号,其中使用的系数决定了频率响应特性[^2]。 `filtfilt` 是一种特殊的滤波方法,它不仅正向过滤一次数据序列,还会反向再过滤一遍该序列的结果。这种方法能够消除相位失真并提供零相移的滤波效果[^1]。 ### FIR滤波器的工作原理 对于FIR滤波器而言,设计过程涉及确定合适的抽头数量以及相应的权重系数。这些参数直接影响到通带纹波、阻带衰减平坦度等性能指标。在实际应用中,可以通过调整上述参数来满足特定应用场景下的需求。例如,在音频处理领域可能更关注于保持原始声音质量;而在通信系统里则会更加注重减少干扰噪声的影响。 ```python import numpy as np from scipy import signal # 设计一个简单的低通FIR滤波器 nyquist_rate = 0.5 * fs # 假设采样率为fs cutoff_frequency = nyquist_rate / 4 taps = 87 # 抽头数目 fir_coefficients = signal.firwin(taps, cutoff_frequency/nyquist_rate) def apply_fir_filter(input_signal): filtered_output = signal.lfilter(fir_coefficients, [1], input_signal) return filtered_output ``` ### filtfilt算法的特点及其优势 相比之下,`filtfilt` 函数实现了前向-后向二次滤波技术,这使得它可以有效地去除由于单次滤波造成的群延时效应所带来的影响。具体来说就是先按照正常的时间顺序对整个时间序列执行标准IIR/FIR滤波运算得到初步结果;然后再逆序读取这个中间产物作为新的待处理样本集重新做一轮相同的滤波流程最终获得理想的无相偏输出形式。 ```python def apply_filtfilt(input_signal): forward_filtered = signal.lfilter(fir_coefficients, [1], input_signal) backward_filtered = signal.filtfilt(fir_coefficients, [1], input_signal) return backward_filtered ``` ### 实现差异对比分析 从实现角度来看: - **FIR Filter**: 主要依赖于 `lfilter()` 或者其他类似的函数来进行一维离散线性卷积计算。 - **filtfilt()**: 则是在此基础上增加了额外的一层逻辑——即前后两次遍历相同的数据流以达到双向补偿的目的。因此虽然两者都基于同样的基础理论框架构建而成,但在具体表现上却有着本质的区别:前者会产生一定的相位扭曲而后者不会。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值