Python 设计带阻滤波器(在SciPy firwin)

Python 设计带阻滤波器(在SciPy firwin),python,python-3.x,scipy,Python,Python 3.x,Scipy,我正试图使用kaiserord窗口和firwin为我的数据设计一系列过滤器。我已经根据互联网上提供的信息创建了一个低通滤波器和一个带通滤波器。但是,我既不能创建带阻滤波器,也不能创建高通滤波器。我使用firwin的pass_zero输入选择滤波器是带通/低通滤波器还是带阻/高通滤波器() 我对高通滤波器使用以下代码: from scipy.signal import kaiserord, firwin, freqz from pylab import figure, clf, plot, xla

我正试图使用kaiserord窗口和
firwin
为我的数据设计一系列过滤器。我已经根据互联网上提供的信息创建了一个低通滤波器和一个带通滤波器。但是,我既不能创建带阻滤波器,也不能创建高通滤波器。我使用firwin的pass_zero输入选择滤波器是带通/低通滤波器还是带阻/高通滤波器()

我对高通滤波器使用以下代码:

from scipy.signal import kaiserord, firwin, freqz
from pylab import figure, clf, plot, xlabel, ylabel, xlim, ylim, title, grid, axes, show

# The Nyquist rate of the signal.
nyq_rate = sample_rate / 2.0

# The desired width of the transition from pass to stop,
# relative to the Nyquist rate.
width = 5/nyq_rate

# The desired attenuation in the stop band, in dB.
ripple_db = 60.0

# Compute the order and Kaiser parameter for the FIR filter.
N, beta = kaiserord(ripple_db, width)
print('Filter order: ', N)

# Use firwin with a Kaiser window to create the high-pass FIR filter.
taps = firwin(N, 15/nyq_rate, window=('kaiser', beta), pass_zero=False)

figure(1)
clf()
w, h = freqz(taps, worN=8000)
plot((w/pi)*nyq_rate, absolute(h), linewidth=2)
xlabel('Frequency (Hz)')
ylabel('Gain')
title('Frequency Response')
ylim(-0.05, 1.05)
grid(True)
这会引发以下错误:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Users\DT\Miniconda3\envs\cmoenv\lib\site-packages\scipy\signal\fir_filter_design.py", line 409, in firwin
    raise ValueError("A filter with an even number of coefficients must "
ValueError: A filter with an even number of coefficients must have zero response at the Nyquist frequency.
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Users\DT\Miniconda3\envs\cmoenv\lib\site packages\scipy\signal\fir\u filter\u design.py”,第409行,firwin
raise VALUERROR(“系数为偶数的过滤器必须”
ValueError:系数为偶数的滤波器在奈奎斯特频率下必须具有零响应。
有人能帮我用kaiserord设计高通和带阻滤波器吗

非常感谢!
DT

在调用
firwin
之前,添加语句

N |= 1
这将确保N是奇数。该语句相当于N=N | 1,|是按位or运算符。该语句将N的最低位设置为1

从函数的docstring中引用

此函数计算有限脉冲响应滤波器的系数。滤波器将具有线性相位;如果
numtaps
为奇数,则为I型;如果
numtaps
为偶数,则为II型

II型滤波器在Nyquist频率下始终具有零响应,因此,如果使用
numtaps
偶数调用firwin,并且通带的右端处于Nyquist频率,则会引发ValueError异常

换言之:firwin返回的系数数组始终具有偶数对称性,从数学上讲,偶数对称和偶数抽头的滤波器在奈奎斯特频率下将自动具有零响应,因此,设计具有firwin的高通或带阻滤波器是没有意义的这是偶数个轻敲


查看此问答,了解有关FIR滤波器类型的更多背景信息:

在调用
firwin
之前,添加以下语句

N |= 1
这将确保N是奇数。该语句相当于N=N | 1,|是按位or运算符。该语句将N的最低位设置为1

从函数的docstring中引用

此函数计算有限脉冲响应滤波器的系数。滤波器将具有线性相位;如果
numtaps
为奇数,则为I型;如果
numtaps
为偶数,则为II型

II型滤波器在Nyquist频率下始终具有零响应,因此,如果使用
numtaps
偶数调用firwin,并且通带的右端处于Nyquist频率,则会引发ValueError异常

换言之:firwin返回的系数数组始终具有偶数对称性,从数学上讲,偶数对称和偶数抽头的滤波器在奈奎斯特频率下将自动具有零响应,因此,设计具有firwin的高通或带阻滤波器是没有意义的这是偶数个轻敲


查看此问答了解有关FIR滤波器类型的更多背景信息:

在调用
firwin
之前,添加语句
N |=1
。这将确保
N
是奇数。(该语句相当于
N=N | 1
,而
|
是按位
运算符。该语句将
N
的最低位设置为1。)写这句话的一个较长的方法是使用
if
,例如
if N%2==0:N=N+1
。这是在一个类似的问题中完成的:Awesome@WarrenWeckesser!确实有效:)。但实际上,我为什么需要这样做呢?(也许把你的答案作为答案张贴出来,这样我才能正确地标记它)在调用
firwin
之前,添加语句
N |=1
。这将确保
N
是奇数。(该语句相当于
N=N | 1
,而
是按位
运算符。该语句将
N
的最低位设置为1。)编写该语句的较长方法是使用
if
,例如
if N%2==0:N=N+1
。在类似的问题中是这样做的:Awesome@WarrenWeckesser!确实有效:)。但实际上,我为什么要这么做呢?(也许把你的答案作为答案贴出来,这样我就可以把它标对了)