概述
目录
- method1:给定截止频率
- 接口:
- method2:给定期望的频率和增益
- 接口
- 示例
method1:给定截止频率
接口:
scipy.signal.firwin(numtaps, cutoff, width=None, window=‘hamming’, pass_zero=True, scale=True, nyq=None, fs=None)[source]
FIR滤波器设计采用窗口法。
这个函数计算一个有限脉冲响应滤波器的系数。滤波器会有线性相位;如果numtaps是奇数则为Type I,如果numtaps是偶数则为Type II。
Type II过滤器在Nyquist频率处总是响应为零,因此,如果在numtap为偶数的情况下调用firwin并具有右端位于Nyquist频率的通带,则会引发ValueError异常。
参数
numtaps: int
滤波器的长度(系数数目,即滤波器阶数+1)。如果通带包含奈奎斯特频率,则numtaps必须为奇数。
cutoff: float或1-D array_like
滤波器截止频率(单位与fs相同)或截止频率数组(即带边)。在后一种情况下,截止频率应该是正的,并且在0到fs/2之间单调增加。值0和fs/2不能包含在cutoff中。
width:float或None,optional
如果width不是None,那么假设它是Kaiser FIR滤波器设计中使用的过渡区域的近似宽度(用与fs相同的单位表示)。这种情况下,窗口参数被忽略。
window:string or tuple of string and parameter values, optional
想要使用的窗口。看到scipy.signal。Get_window用于Windows和所需参数的列表。
pass_zero{True, False, ’ bandpass ', ’ lowpass ', ’ highpass ', ’ bandstop '},可选
如果为True,则频率0处的增益(即“直流增益”)为1。False表示直流增益为0。也可以是所需过滤器类型的字符串参数(相当于IIR设计函数中的btype)。
scale:bool,可选
设置为True以缩放系数,使频率响应在某一频率上完全为单位。这个频率是:
0 (DC)如果第一个通带从0开始(即pass_zero为True)
如果第一通带结束于fs/2(即滤波器是单带高通滤波器),则fs/2(奈奎斯特频率);否则第一通带的中心
fs:float,可选
信号的采样频率。每个截止频率必须在0到fs/2之间。默认值为2。
返回值:
ndarray h (numtaps)
长度系数numtap FIR滤波器。
or ValueError
如果cutoff中的任何值小于或等于0或大于或等于fs/2,如果cutoff中的值不是严格单调递增的,或者如果numtaps是偶数但通带包含奈奎斯特频率。
示例:
# -*- coding: utf-8 -*-
from scipy import signal
numtaps = 3
f = 0.1
win = signal.firwin(numtaps, f)
print(win)
# array([ 0.06799017, 0.86401967, 0.06799017])
# Use a specific window function:
win = signal.firwin(numtaps, f, window='nuttall')
print(win)
# array([ 3.56607041e-04, 9.99286786e-01, 3.56607041e-04])
# High-pass (‘stop’ from 0 to f):
fir = signal.firwin(numtaps, f, pass_zero=False)
print(fir)
# array([-0.00859313, 0.98281375, -0.00859313])
# Band-pass:
f1, f2 = 0.1, 0.2
fir = signal.firwin(numtaps, [f1, f2], pass_zero=False)
print(fir)
# array([ 0.06301614, 0.88770441, 0.06301614])
# Band-stop:
fir = signal.firwin(numtaps, [f1, f2])
print(fir)
# array([-0.00801395, 1.0160279 , -0.00801395])
# Multi-band (passbands are [0, f1], [f2, f3] and [f4, 1]):
f3, f4 = 0.3, 0.4
fir = signal.firwin(numtaps, [f1, f2, f3, f4])
print(fir)
# array([-0.01376344, 1.02752689, -0.01376344])
# Multi-band (passbands are [f1, f2] and [f3,f4]):
fir = signal.firwin(numtaps, [f1, f2, f3, f4], pass_zero=False)
print(fir)
# array([ 0.04890915, 0.91284326, 0.04890915])
method2:给定期望的频率和增益
接口
scipy.signal.firwin2(numtaps, freq, gain, nfreqs=None, window=‘hamming’, nyq=None, antisymmetric=False, fs=None)[source]
FIR滤波器设计采用窗口法。
从给定的频率和相应的增益增益,该函数构造一个具有线性相位和(近似)给定频率响应的FIR滤波器。
参数
numtaps:int
FIR滤波器中的轻拍次数。Numtaps必须小于nfreqs。
freq:array_like,一维
频率采样点。通常是0.0到1.0,1.0是Nyquist。奈奎斯特频率是一半fs。freq中的值必须是非递减的。一个值可以重复一次以实现不连续。freq的第一个值必须为0,最后一个值必须为fs/2。0和fs/2不能重复。
gain:array_like
滤波器在频率采样点处获得增益。根据筛选器类型,应用了某些获取值的约束,详细信息请参见Notes。
nfreqs:int,可选
用于构造滤波器的插值网格的大小。对于最有效的行为,这应该是2 + 1的幂(例如129,257等)。默认值是比不小于numtaps的2的最小次幂大1。Nfreqs必须大于numtap。
window:string或(string, float)或float,或None,可选
窗口函数的使用。默认是“hamming”。看到scipy.signal。Get_window获取可能值的完整列表。如果为None,则不应用窗口函数。
antisymmetric:bool,可选
产生的脉冲响应是否对称/反对称。参见Notes了解更多细节。
fs:float,可选
信号的采样频率。每个截止频率必须在0到fs/2之间。默认值为2。
返回
taps:ndarray
FIR滤波器的滤波系数,作为长度numtap的一维数组。
从给定的频率和增益集,期望的响应是在频域构造的。将反FFT应用于所需的响应以创建相关的卷积核,并返回该核的第一个numtaps系数,按窗口缩放。
note:
FIR滤波器将有线性相位。过滤器的类型由’ numtaps '的值和反对称标志决定。有四种可能的组合:
奇数numtap,反对称为False,产生I型过滤器
即使numtaps,反对称为False,类型II滤波器产生
奇数numtap,反对称为True,产生III型滤波器
即使numtap,反对称为True,产生IV型滤波器
除I型滤波器外,所有滤波器的幅度响应均受下列约束:
II型-在奈奎斯特频率处为零
III型 -零在零和奈奎斯特频率
IV型-在零频率处为零
示例
#A lowpass FIR filter with a response that is 1 on [0.0, 0.5], and that decreases linearly on [0.5, #1.0] from 1 to 0:
from scipy import signal
taps = signal.firwin2(150, [0.0, 0.5, 1.0], [1.0, 1.0, 0.0])
print(taps[72:78])
# [-0.02286961 -0.06362756 0.57310236 0.57310236 -0.06362756 -0.02286961]
参考:
Signal processing (scipy.signal) — SciPy v1.9.3 Manual
最后
以上就是会撒娇鱼为你收集整理的scipy 窗函数进行设计FIR滤波器的全部内容,希望文章能够帮你解决scipy 窗函数进行设计FIR滤波器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复