使用Scipy的低通Chebyshev I型滤波器

时间:2017-10-17 07:34:12

标签: numpy filter scipy signal-processing data-processing

我正在读一篇论文,试图重现论文的结果。在本文中,他们在原始数据上使用低通Chebyshev I型滤波器。他们给出了这些参数。

采样频率= 32Hz,Fcut = 0.25Hz,Apass = 0.001dB,Astop = -100dB,Fstop = 2Hz,滤波器的阶数= 5.我发现一些材料可以帮助我理解这些参数

enter image description here

但是当我看一下scipy.signal.cheby1时。此功能所需的参数不同。

cheby1(N, rp, Wn, btype='low', analog=False, output='ba')

这里N:过滤器的顺序; btype:过滤器的类型,在我的例子中,它是'低通'; analog = False,因为数据是采样的,所以它是数字的; output:指定输出的类型。但我不确定rp,Wn。

在文档中,它说:

rp:float 通带中允许的最大纹波低于单位增益。以分贝指定,为正数。

Wn:array_like 给出临界频率的标量或长度为2的序列。对于I型滤波器,这是过渡带中增益首先降至-rp以下的点。对于数字滤波器,Wn从0归一化为1,其中1是奈奎斯特频率,pi弧度/样本。 (因此,Wn处于半周期/采样中。)对于模拟滤波器,Wn是角频率(例如rad / s)。

根据这个问题: How To apply a filter to a signal in python

我知道如何使用过滤器。但我不知道如何创建一个具有上述相同参数的过滤器。我不知道如何转换这些参数并将它们提供给Scipy中的函数。

1 个答案:

答案 0 :(得分:2)

看看the wikipedia page on the Type I Chebyshev filter。请注意,您的图表说明了常规过滤器的特征。然而,低通I型切比雪夫滤波器在阻带中没有纹波。

您可以使用三个可用参数来设计I型切比雪夫滤波器:滤波器阶数,纹波系数和截止频率。这些是scipy.signal.cheby1的前三个参数:

  • cheby1的第一个参数是过滤器的顺序。
  • 第二个参数rp对应于维基百科页面中的δ,显然就是您所谓的Apass
  • 第三个参数是wn,截止频率表示为奈奎斯特频率的一部分。在您的情况下,您可以编写类似

    的内容
    fs = 32      # Sample rate (Hz)
    fcut = 0.25  # Desired filter cutoff frequency (Hz)
    
    # Cutoff frequency relative to the Nyquist
    wn = fcut / (0.5*fs)  
    

一旦选择了这三个参数,所有其他特征 (例如,过渡带宽度,Astop,Fstop等)被确定。所以看来你给出的规格,“采样频率= 32Hz,Fcut = 0.25Hz,Apass = 0.001dB,Astop = -100dB,Fstop = 2Hz,滤波器的阶数= 5”,与I型不兼容切比雪夫过滤器。特别是,我在2 Hz时获得大约-78 dB的增益。 (如果将顺序增加到6,则2 Hz处的增益约为-103。)

这是一个完整的脚本,后面是它生成的图。该图仅显示通带,但您可以更改xlimylim函数的参数以查看更多信息。

import numpy as np
from scipy.signal import cheby1, freqz
import matplotlib.pyplot as plt


# Sampling parameters
fs = 32  # Hz

# Desired filter parameters
order = 5
Apass = 0.001  # dB
fcut = 0.25    # Hz

# Normalized frequency argument for cheby1
wn = fcut / (0.5*fs)

b, a = cheby1(order, Apass, wn)

w, h = freqz(b, a, worN=8000)

plt.figure(1)
plt.plot(0.5*fs*w/np.pi, 20*np.log10(np.abs(h)))
plt.axvline(fcut, color='r', alpha=0.2)
plt.plot([0, fcut], [-Apass, -Apass], color='r', alpha=0.2)
plt.xlim(0, 0.3)
plt.xlabel('Frequency (Hz)')
plt.ylim(-5*Apass, Apass)
plt.ylabel('Gain (dB)')
plt.grid()
plt.title("Chebyshev Type I Lowpass Filter")
plt.tight_layout()

plt.show()

plot