低通滤波器电路在电路中很常见,在算法上也用过几次,但一直缺少太系统的研究。最近比较闲,拿出来耍耍。
一、基本原理
简单的一阶低通滤波器如下图所示:
由上图有:
和 替换输入和输出电压,用代换,用代换dt,得到上述方程的离散形式:
整理可得:
其中
截止频率
参数设计过程:
1、根据需求确定截止频率和采样时间间隔。
2、根据截止频率和采样时间间隔确定滤波器参数a
3、算法实现。
二、验证
(1)proteus:100hz,采样频率采样10K,计算a=0.059
截止频率为100hz
仿真结果如下:
编写python代码:
对比两者幅值和波形变化,基本相同。
其中滤波器代码如下:
def lpf1(listx:list[float],a:float) ->list[float]:
listy:list[float]=list()
yold=listx[0]
listy.append(yold)
for i in range(1,len(listx)):
y=a*listx[i]+(1-a)*yold
listy.append(y)
yold=y
return listy
主程序主要用于生成对应的输入和输出序列,代码如下:
import matplotlib.pyplot as plt
import numpy as np
import sjb
xs=np.linspace(-5,5,201)
ys0=sjb.getSawtooth(xs,2) #此代码用于生成2个周期的锯齿波
ys1=sjb.lpf1(ys0,0.059)
plt.plot(xs,ys0)
plt.plot(xs,ys1)
plt.show()
此处图形用屏幕上显示2个波形代替上文中的100hz,同样,取样点数应该乘以100是200个,所以参数a不需要变化。
代码中如果改变波形频率和取样点数(取样频率)将引起滤波效果变化,原因上文已经做了说明。