一阶数字低通滤波器:原理、参数推导与代码实现
一阶数字低通滤波器:原理、参数推导与代码实现
在数字信号处理中,滤波器是一种非常重要的工具,它可以帮助我们从信号中去除不需要的频率成分,保留我们感兴趣的部分。低通滤波器就是其中一种,它允许低频信号通过,同时阻止高频信号。一阶数字低通滤波器是最简单的低通滤波器之一,本文将介绍它的基本原理、推导过程,并给出一个简单的示例代码。
基本原理
一阶数字低通滤波器的工作原理基于简单的递归关系。它可以被看作是一个简单的“滑动平均”过程,其中新的输出值是当前输入值和前一输出值的加权平均。权重由滤波器的参数决定,这个参数也影响了滤波器的截止频率。
假设我们有一个离散时间信号$x[n]$,我们想要设计一个一阶低通滤波器来处理这个信号。滤波器的输出$y[n]$可以表示为:
$$
y[n] = \alpha x[n] + (1 - \alpha) y[n-1]
$$
其中:
- $y[n]$是当前的输出样本。
- $x[n]$是当前的输入样本。
- $y[n-1]$是上一个输出样本。
- $\alpha$是滤波器的系数,其取值范围在0到1之间。
这个公式告诉我们,新的输出值是当前输入值的一部分(由$\alpha$控制)加上上一个输出值的一部分(由$1 - \alpha$控制)。$\alpha$取值越小,当前输入权重就越小,输出波形越平滑,但响应灵敏度降低。
参数推导
模拟低通滤波器的传递函数
模拟域中的一阶低通滤波器的传递函数为:
$$
H(s) = \frac{1}{\tau s + 1}
$$
其中,$\tau$是时间常数,$s$是拉普拉斯变换变量。截止频率$f_c$与时间常数$\tau$的关系为:
$$
\tau = \frac{1}{2 \pi f_c}
$$
模拟域到离散域的转换
通过双线性变换 (Bilinear Transformation),将模拟域的传递函数转换到离散域。双线性变换的关系为:
$$
s = \frac{2}{T} \frac{1 - z^{-1}}{1 + z^{-1}}
$$
其中,$T = \frac{1}{f_s}$为采样周期,$z$为变换变量。
化简并求滤波系数
将双线性变换代入模拟传递函数$H(s)$并化简,我们可以得到离散域的传递函数,并从中推导出滤波系数$\alpha$:
$$
\alpha = \frac{2 \pi (f_c / f_s)}{1 + 2 \pi (f_c / f_s)}
$$
代码实现
以下是使用Python实现一阶低通滤波器的代码:
import numpy as np
import matplotlib.pyplot as plt
class FirstOrderLowPassFilter:
def __init__(self, alpha):
self.alpha = alpha
self.previous_output = 0
def filter(self, input_signal):
output_signal = np.zeros_like(input_signal)
for i, x in enumerate(input_signal):
self.previous_output = self.alpha * x + (1 - self.alpha) * self.previous_output
output_signal[i] = self.previous_output
return output_signal
# 设定参数
fs = 1000 # 采样频率
fc = 10 # 截止频率
alpha = 2 * np.pi * fc / fs / (1 + 2 * np.pi * fc / fs) # 计算滤波系数
# 生成测试信号
t = np.linspace(0, 1, fs, endpoint=False) # 时间向量
input_signal = np.sin(2 * np.pi * 5 * t) + 0.5 * np.sin(2 * np.pi * 300 * t) # 5Hz和300Hz的正弦波叠加
# 应用滤波器
filter = FirstOrderLowPassFilter(alpha)
output_signal = filter.filter(input_signal)
# 绘制输入信号和滤波后的输出信号
plt.figure(figsize=(12, 6))
# 绘制输入信号
plt.subplot(2, 1, 1)
plt.plot(t, input_signal, label='Input Signal')
plt.title('Input Signal')
plt.legend()
# 绘制输出信号
plt.subplot(2, 1, 2)
plt.plot(t, output_signal, label='Output Signal', color='r')
plt.title('Output Signal')
plt.legend()
plt.tight_layout()
plt.show()
运行结果如下:
结论
本文详细介绍了一阶数字低通滤波器的原理、参数推导,并提供了Python代码实现。通过调整滤波系数$\alpha$,我们可以控制滤波器的截止频率,从而实现对信号中不同频率成分的滤除。
本文原文来自CSDN