Low-pass 切比雪夫 type-I 过滤器 Scipy
Low-pass Chebyshev type-I filter with Scipy
我正在阅读一篇论文,试图重现论文的结果。在本文中,他们对原始数据使用 low-pass Chebyshev type-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:The过滤器的顺序; btype:过滤器的类型,在我的例子中,它是'lowpass'; analog=False,因为数据是采样的,所以是数字的; output:指定输出的类型。但是我不确定rp,Wn。
在文档中,它说:
rp : 浮动
通带中允许低于单位增益的最大纹波。以分贝指定,为正数。
Wn : array_like
给出临界频率的标量或长度为 2 的序列。对于 I 型滤波器,这是过渡带中增益首先降至 -rp 以下的点。对于数字滤波器,Wn 从 0 归一化为 1,其中 1 是奈奎斯特频率,pi radians/sample。 (因此 Wn 在 half-cycles / 样本中。)对于模拟滤波器,Wn 是 angular 频率(例如 rad/s)。
根据这个问题:
How To apply a filter to a signal in python
我知道如何使用过滤器。但我不知道如何创建一个具有与上述相同参数的过滤器。我不知道如何将这些参数转换并提供给Scipy中的函数。
看看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 等)被确定。因此,您给出的规范 "Sampling frequency = 32Hz, Fcut=0.25Hz, Apass = 0.001dB, Astop = -100dB, Fstop = 2Hz, Order of the filter = 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()
我正在阅读一篇论文,试图重现论文的结果。在本文中,他们对原始数据使用 low-pass Chebyshev type-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:The过滤器的顺序; btype:过滤器的类型,在我的例子中,它是'lowpass'; analog=False,因为数据是采样的,所以是数字的; output:指定输出的类型。但是我不确定rp,Wn。
在文档中,它说:
rp : 浮动 通带中允许低于单位增益的最大纹波。以分贝指定,为正数。
Wn : array_like 给出临界频率的标量或长度为 2 的序列。对于 I 型滤波器,这是过渡带中增益首先降至 -rp 以下的点。对于数字滤波器,Wn 从 0 归一化为 1,其中 1 是奈奎斯特频率,pi radians/sample。 (因此 Wn 在 half-cycles / 样本中。)对于模拟滤波器,Wn 是 angular 频率(例如 rad/s)。
根据这个问题: How To apply a filter to a signal in python
我知道如何使用过滤器。但我不知道如何创建一个具有与上述相同参数的过滤器。我不知道如何将这些参数转换并提供给Scipy中的函数。
看看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 等)被确定。因此,您给出的规范 "Sampling frequency = 32Hz, Fcut=0.25Hz, Apass = 0.001dB, Astop = -100dB, Fstop = 2Hz, Order of the filter = 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()