低通滤波器算法LPF的python图像化验证

 

低通滤波器电路在电路中很常见,在算法上也用过几次,但一直缺少太系统的研究。最近比较闲,拿出来耍耍。

一、基本原理

简单的一阶低通滤波器如下图所示:

由上图有:

 

\frac{U_{in}-U_{out}}{R} =C\frac{dU_{out}}{dt}

x_{i} 和y_{i} 替换输入和输出电压,用y_{i}-y_{i-1}代换dU_{out},用\Delta T代换dt,得到上述方程的离散形式:

x_{i}-y_{i}=RC(\frac{y_{i}-y_{i-1}}{\Delta T})

整理可得:

y_{i}=a*x_{i}+(1-a)y_{i-1}

其中

   a=\frac{\Delta T}{RC+\Delta T}     

截止频率

f_{c}=\frac{1}{2\pi RC}     

参数设计过程:

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不需要变化。

代码中如果改变波形频率和取样点数(取样频率)将引起滤波效果变化,原因上文已经做了说明。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

健忘的松鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值