scipy.signal.remez¶
- scipy.signal.remez(numtaps, bands, desired, weight=None, Hz=None, type='bandpass', maxiter=25, grid_density=16, fs=None)[源代码]¶
使用雷米兹交换算法计算最小极大最优过滤。
利用雷米兹交换算法计算过滤有限冲激响应(FIR)过滤的系数,其传递函数在指定频段内使期望增益与已实现增益之间的最大误差最小化。
- 参数
- numtaps集成
过滤中所需的点击数量。点击次数是过滤中的条数,也就是过滤订单中的条数加一。
- bandsarray_like
包含带边的单调序列。所有元素都必须是非负的,并且小于由给出的采样频率的一半 fs 。
- desiredarray_like
包含每个指定频带中所需增益的频带大小的一半的序列。
- weightARRAY_LIKE,可选
要赋予每个波段区域的相对权重。的长度 weight 必须有一半的长度 bands 。
- Hz标量,可选
Deprecated. Use `fs` instead. 以Hz为单位的采样频率。默认值为1。
- type{‘带通’,‘微分器’,‘希尔伯特’},可选
过滤的类型:
“带通”:以频段为单位的平坦响应。这是默认设置。
“微分器”:频带比例响应。
- “希尔伯特”对称奇数的过滤,即III型
(对于偶数阶)或类型IV(对于奇数阶)线性相位滤波器。
- maxiter整型,可选
算法的最大迭代次数。默认值为25。
- grid_density整型,可选
栅格密度。中使用的密集栅格
remez
是有大小的(numtaps + 1) * grid_density
。默认值为16。- fs浮动,可选
信号的采样频率。默认值为1。
- 退货
- outndarray
包含最优(在极小极大意义下)过滤的系数的秩1数组。
参考文献
- 1
J.H.McClellan和T.W.Parks,“一种设计最佳FIR线性相位数字滤波器的统一方法”,IEEE Transans。“电路理论”,第一卷。CT-20,第697-701页,1973年。
- 2
J.H.McClellan,T.W.Parks和L.R.Rabiner,“设计最佳FIR线性相位数字滤波器的计算机程序”,IEEE译。音频电声,第一卷。Au-21,第506-525页,1973年。
示例
在这些示例中
remez
习惯于创建带通、带阻、低通和高通过滤。使用的参数是过滤阶数、具有相应频率边界的数组、期望衰减值和采样频率。使用freqz
计算并绘制相应的频率响应。>>> from scipy import signal >>> import matplotlib.pyplot as plt
>>> def plot_response(fs, w, h, title): ... "Utility function to plot response functions" ... fig = plt.figure() ... ax = fig.add_subplot(111) ... ax.plot(0.5*fs*w/np.pi, 20*np.log10(np.abs(h))) ... ax.set_ylim(-40, 5) ... ax.set_xlim(0, 0.5*fs) ... ax.grid(True) ... ax.set_xlabel('Frequency (Hz)') ... ax.set_ylabel('Gain (dB)') ... ax.set_title(title)
此示例显示了根据小过渡宽度和高过滤顺序的陡峭低通过渡:
>>> fs = 22050.0 # Sample rate, Hz >>> cutoff = 8000.0 # Desired cutoff frequency, Hz >>> trans_width = 100 # Width of transition from pass band to stop band, Hz >>> numtaps = 400 # Size of the FIR filter. >>> taps = signal.remez(numtaps, [0, cutoff, cutoff + trans_width, 0.5*fs], [1, 0], Hz=fs) >>> w, h = signal.freqz(taps, [1], worN=2000) >>> plot_response(fs, w, h, "Low-pass Filter")
此示例显示高通过滤:
>>> fs = 22050.0 # Sample rate, Hz >>> cutoff = 2000.0 # Desired cutoff frequency, Hz >>> trans_width = 250 # Width of transition from pass band to stop band, Hz >>> numtaps = 125 # Size of the FIR filter. >>> taps = signal.remez(numtaps, [0, cutoff - trans_width, cutoff, 0.5*fs], ... [0, 1], Hz=fs) >>> w, h = signal.freqz(taps, [1], worN=2000) >>> plot_response(fs, w, h, "High-pass Filter")
对于以22 kHz采样的信号,使用雷米兹算法计算通带为2-5 kHz的带通过滤。转换宽度为260 Hz,过滤订单为10:
>>> fs = 22000.0 # Sample rate, Hz >>> band = [2000, 5000] # Desired pass band, Hz >>> trans_width = 260 # Width of transition from pass band to stop band, Hz >>> numtaps = 10 # Size of the FIR filter. >>> edges = [0, band[0] - trans_width, band[0], band[1], ... band[1] + trans_width, 0.5*fs] >>> taps = signal.remez(numtaps, edges, [0, 1, 0], Hz=fs) >>> w, h = signal.freqz(taps, [1], worN=2000) >>> plot_response(fs, w, h, "Band-pass Filter")
可以看出,对于这个带通过滤来说,低阶导致较高的涟漪和较小的陡峭跃迁。在阻带有很低的衰减,在通带几乎没有过冲。当然,过滤阶数越高,期望的增益越接近。
下一个示例显示了一个带阻挡的过滤。由于过滤订单较高,过渡过程相当陡峭:
>>> fs = 20000.0 # Sample rate, Hz >>> band = [6000, 8000] # Desired stop band, Hz >>> trans_width = 200 # Width of transition from pass band to stop band, Hz >>> numtaps = 175 # Size of the FIR filter. >>> edges = [0, band[0] - trans_width, band[0], band[1], band[1] + trans_width, 0.5*fs] >>> taps = signal.remez(numtaps, edges, [1, 0, 1], Hz=fs) >>> w, h = signal.freqz(taps, [1], worN=2000) >>> plot_response(fs, w, h, "Band-stop Filter")
>>> plt.show()