我正在读一篇论文,试图重现论文的结果。在本文中,他们在原始数据上使用低通Chebyshev I型滤波器。他们给出了这些参数。
采样频率= 32Hz,Fcut = 0.25Hz,Apass = 0.001dB,Astop = -100dB,Fstop = 2Hz,滤波器的阶数= 5.我发现一些材料可以帮助我理解这些参数
但是当我看一下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中的函数。
答案 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。)
这是一个完整的脚本,后面是它生成的图。该图仅显示通带,但您可以更改xlim
和ylim
函数的参数以查看更多信息。
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()