Numpy 带Scipy的低通切比雪夫I型滤波器

Numpy 带Scipy的低通切比雪夫I型滤波器,numpy,filter,scipy,signal-processing,data-processing,Numpy,Filter,Scipy,Signal Processing,Data Processing,我正在读一篇论文,试图重现论文的结果。在本文中,他们对原始数据使用低通切比雪夫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:过滤器的顺序;

我正在读一篇论文,试图重现论文的结果。在本文中,他们对原始数据使用低通切比雪夫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:过滤器的顺序;B类型:过滤器的类型,在我的例子中,它是“低通”;模拟=假,因为数据是采样的,所以是数字的;输出:指定输出的类型。但我不确定rp,Wn

文件中说:

rp:浮动 通带中单位增益以下允许的最大纹波。以分贝为单位的正数

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

根据这一问题:

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

请查看。请注意,绘图显示了常规过滤器的特性。然而,低通I型切比雪夫滤波器在阻带中没有纹波

I型切比雪夫滤波器的设计有三个可用参数:滤波器阶数、纹波系数和截止频率。以下是的前三个参数:

  • 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赫兹时获得了大约-78分贝的增益。 (如果将阶数增加到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()