本文简要介绍 python 语言中 scipy.signal.remez
的用法。
用法:
scipy.signal.remez(numtaps, bands, desired, *, weight=None, Hz=<object object>, type='bandpass', maxiter=25, grid_density=16, fs=None)#
使用 Remez 交换算法计算 minimax 最优滤波器。
使用 Remez 交换算法计算有限脉冲响应 (FIR) 滤波器的 filter-coefficients,该滤波器的传递函数可最大限度地减少指定频带中所需增益和实现增益之间的最大误差。
- numtaps: int
滤波器中所需的抽头数。抽头数是过滤器中的项数,或过滤器阶数加一。
- bands: array_like
包含带边的单调序列。所有元素必须是非负的,并且小于 fs 给出的采样频率的一半。
- desired: array_like
在每个指定频带中包含所需增益的频带大小的一半的序列。
- weight: 数组,可选
赋予每个波段区域的相对权重。重量的长度必须是带子长度的一半。
- Hz: 标量、可选、已弃用
采样频率(以 Hz 为单位)。默认值为 1。
- type: {‘bandpass’, ‘differentiator’, ‘hilbert’},可选
过滤器类型:
‘bandpass’ : flat response in bands. This is the default.
‘differentiator’ : frequency proportional response in bands.
- ‘hilbert’ filter with odd symmetry, that is, type III
(for even order) or type IV (for odd order) linear phase filters.
- maxiter: 整数,可选
算法的最大迭代次数。默认值为 25。
- grid_density: 整数,可选
网格密度。
remez
中使用的密集网格的大小为(numtaps + 1) * grid_density
。默认值为 16。- fs: 浮点数,可选
信号的采样频率。默认值为 1。
- out: ndarray
包含最优(在极小极大意义上)滤波器的系数的 rank-1 数组。
参数 ::
返回 ::
参考:
[1]J. H. McClellan 和 T. W. Parks,“优化 FIR 线性相位数字滤波器设计的统一方法”,IEEE Trans。电路理论,第一卷。 CT-20,第 697-701 页,1973 年。
[2]J. H. McClellan、T. W. Parks 和 L. R. Rabiner,“用于设计最佳 FIR 线性相位数字滤波器的计算机程序”,IEEE Trans。音频电声,卷。 AU-21,第 506-525 页,1973 年。
例子:
在这些示例中,
remez
用于设计low-pass、high-pass、band-pass 和band-stop 滤波器。定义每个滤波器的参数包括滤波器阶数、频带边界、边界的过渡宽度、每个频带中所需的增益以及采样频率。我们将在所有示例中使用 22050 Hz 的采样频率。在每个示例中,每个频带中的所需增益为 0(对于阻带)或 1(对于通带)。
freqz
用于计算每个滤波器的频率响应,下面定义的实用函数plot_response
用于绘制响应。>>> import numpy as np >>> from scipy import signal >>> import matplotlib.pyplot as plt
>>> fs = 22050 # Sample rate, Hz
>>> def plot_response(w, h, title): ... "Utility function to plot response functions" ... fig = plt.figure() ... ax = fig.add_subplot(111) ... ax.plot(w, 20*np.log10(np.abs(h))) ... ax.set_ylim(-40, 5) ... ax.grid(True) ... ax.set_xlabel('Frequency (Hz)') ... ax.set_ylabel('Gain (dB)') ... ax.set_title(title)
第一个示例是 low-pass 滤波器,截止频率为 8 kHz。滤波器长度为 325,从通过到停止的过渡宽度为 100 Hz。
>>> cutoff = 8000.0 # Desired cutoff frequency, Hz >>> trans_width = 100 # Width of transition from pass to stop, Hz >>> numtaps = 325 # Size of the FIR filter. >>> taps = signal.remez(numtaps, [0, cutoff, cutoff + trans_width, 0.5*fs], ... [1, 0], fs=fs) >>> w, h = signal.freqz(taps, [1], worN=2000, fs=fs) >>> plot_response(w, h, "Low-pass Filter") >>> plt.show()
此示例显示了 high-pass 过滤器:
>>> cutoff = 2000.0 # Desired cutoff frequency, Hz >>> trans_width = 250 # Width of transition from pass to stop, Hz >>> numtaps = 125 # Size of the FIR filter. >>> taps = signal.remez(numtaps, [0, cutoff - trans_width, cutoff, 0.5*fs], ... [0, 1], fs=fs) >>> w, h = signal.freqz(taps, [1], worN=2000, fs=fs) >>> plot_response(w, h, "High-pass Filter") >>> plt.show()
此示例显示了 band-pass 滤波器,其中 pass-band 的频率范围为 2 kHz 至 5 kHz。过渡宽度为 260 Hz,滤波器的长度为 63,小于其他示例:
>>> band = [2000, 5000] # Desired pass band, Hz >>> trans_width = 260 # Width of transition from pass to stop, Hz >>> numtaps = 63 # 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], fs=fs) >>> w, h = signal.freqz(taps, [1], worN=2000, fs=fs) >>> plot_response(w, h, "Band-pass Filter") >>> plt.show()
低阶导致更高的纹波和不太陡峭的转变。
下一个示例显示band-stop 过滤器。
>>> band = [6000, 8000] # Desired stop band, Hz >>> trans_width = 200 # Width of transition from pass to stop, 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], fs=fs) >>> w, h = signal.freqz(taps, [1], worN=2000, fs=fs) >>> plot_response(w, h, "Band-stop Filter") >>> plt.show()
相关用法
- Python SciPy signal.residue用法及代码示例
- Python SciPy signal.residuez用法及代码示例
- Python SciPy signal.resample_poly用法及代码示例
- Python SciPy signal.resample用法及代码示例
- Python SciPy signal.ricker用法及代码示例
- Python SciPy signal.czt_points用法及代码示例
- Python SciPy signal.chirp用法及代码示例
- Python SciPy signal.iirdesign用法及代码示例
- Python SciPy signal.max_len_seq用法及代码示例
- Python SciPy signal.kaiser_atten用法及代码示例
- Python SciPy signal.oaconvolve用法及代码示例
- Python SciPy signal.hilbert用法及代码示例
- Python SciPy signal.group_delay用法及代码示例
- Python SciPy signal.cheb2ord用法及代码示例
- Python SciPy signal.get_window用法及代码示例
- Python SciPy signal.lfilter用法及代码示例
- Python SciPy signal.morlet用法及代码示例
- Python SciPy signal.coherence用法及代码示例
- Python SciPy signal.dfreqresp用法及代码示例
- Python SciPy signal.TransferFunction用法及代码示例
- Python SciPy signal.dbode用法及代码示例
- Python SciPy signal.bilinear_zpk用法及代码示例
- Python SciPy signal.firls用法及代码示例
- Python SciPy signal.impulse用法及代码示例
- Python SciPy signal.buttord用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.signal.remez。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。