📌  相关文章
📜  使用 Scipy – Python设计 IIR 带通 Chebyshev Type-2 滤波器(1)

📅  最后修改于: 2023-12-03 15:22:16.640000             🧑  作者: Mango

使用 Scipy – Python设计 IIR 带通 Chebyshev Type-2 滤波器

在信号处理领域,信号滤波器是非常重要的工具。它们可用于消除噪声、提取信号和将频率滤波等。在本文中,我们将介绍如何使用Scipy库在Python中设计IIR带通Chebyshev Type-2滤波器。

1. 安装Scipy

在使用Scipy之前,需要先安装它。可以使用以下命令在终端中安装Scipy:

pip install scipy
2. 导入必要的库

在开始设计IIR滤波器之前,首先需要导入numpy,scipy和matplotlib库。这三个库都是Python中最常用的科学计算库。

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
3. 定义滤波器规格

在设计任何类型的滤波器之前,必须明确滤波器的规格。对于IIR带通Chebyshev Type-2滤波器,这些规格通常包括以下内容:

  • 采样频率(fs)
  • 截止频率(f0)
  • 通带衰减(Ap)
  • 阻带衰减(As)
  • 通带和阻带的最大允许纹波(rp和rs)

这些规格由工程或科学应用定义。在本文中,我们将使用以下参数:

# 采样频率
fs = 1000
# 截止频率
f0 = 200
# 通带衰减(dB)
Ap = 1
# 阻带衰减(dB)
As = 30
# 通带最大允许纹波(dB)
rp = 0.1
# 阻带最大允许纹波(dB)
rs = 40
4. 计算滤波器系数

使用Scipy库的signal.iirdesign函数可以根据滤波器的规格计算出IIR滤波器系数。

# 计算滤波器系数
b, a = signal.iirdesign(wp=f0*np.pi/fs, ws=2*f0*np.pi/fs, gpass=Ap, gstop=As, ftype='cheby2', rp=rp, rs=rs)

函数中的参数含义如下:

  • wp:通带截止频率(以弧度/秒为单位)
  • ws:阻带截止频率(以弧度/秒为单位)
  • gpass:通带最大允许衰减(dB)
  • gstop:阻带最小允许衰减(dB)
  • ftype:滤波器类型(这里是Chebyshev Type-2滤波器)
  • rp:通带最大允许纹波(dB)
  • rs:阻带最大允许纹波(dB)

计算出滤波器系数之后,就可以使用信号进行滤波了。

5. 滤波信号

使用Scipy库的signal.filtfilt函数可以对信号进行滤波。这个函数使用IIR滤波器系数进行信号滤波。下面是一个简单的示例:

# 定义输入信号
t = np.linspace(0, 1, fs, endpoint=False)
x = np.sin(2*np.pi*f0*t)

# 滤波信号
y = signal.filtfilt(b, a, x)

首先,我们使用numpy库生成一个长度为1000的正弦波信号。然后,使用signal.filtfilt函数将信号x滤波,输出结果保存在y中。

6. 绘制滤波器响应和滤波后的信号

最后,可以使用matplotlib库绘制滤波器的频率响应和输入/输出信号。这里使用频率响应函数来检查设计的滤波器的行为是否与所需规范一致。使用以下代码可以绘制以角频率为横坐标的滤波器增益,其中单位为dB:

# 绘制滤波器频率响应
w, h = signal.freqz(b, a)
fig = plt.figure(figsize=(8, 6))
plt.title('Chebyshev Type-2 Bandpass frequency response')
ax1 = fig.add_subplot(111)
plt.plot(np.abs(w) * fs / (2*np.pi), 20*np.log10(np.abs(h)), 'b')
plt.ylabel('Amplitude [dB]', color='b')
plt.xlabel('Frequency [Hz]')
plt.grid()
plt.show()

使用以下代码可以将输入/输出信号绘制在同一图形中:

# 绘制输入/输出信号
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6))
fig.suptitle('Chebyshev Type-2 Bandpass Filtered Signal')
ax1.plot(t, x, 'b-')
ax1.set_xlabel('Time [s]')
ax1.set_ylabel('x', color='b')
ax2.plot(t, y, 'r-')
ax2.set_xlabel('Time [s]')
ax2.set_ylabel('y', color='r')
plt.show()
7. 总结

Scipy库是一种强大的Python库,可用于设计和应用各种滤波器。本文介绍了如何使用Scipy库在Python中设计IIR带通Chebyshev Type-2滤波器。我们还演示了如何通过绘制滤波器响应和信号来验证滤波器规格及其滤波效果。