在对语音信号预处理的过程中,可能用到以下函数。
考虑scipy库:Scipy
该函数用来计算有限脉冲响应FIR滤波器的系数。使用窗口方法设计 FIR 滤波器。
scipy.signal.firwin(numtaps, cutoff, width=None, window='hamming', pass_zero=True, scale=True, nyq=None, fs=None)
输入参数:
1.numtaps: int
滤波器的长度(系数的数量,即滤波器阶数 + 1)。如果通带包括奈奎斯特频率,则 numtaps 必须是奇数。
2.cutoff: 浮点数或一维 数组
滤波器的截止频率(以与 fs 相同的单位表示)或一组截止频率。在后一种情况下,截止频率应该是正的,并且在 0 和 fs/2 之间单调增加。值 0 和 fs/2 不得包含在截止值中。
3.width: 浮点数或无,可选
如果 width 不是 None,则假定它是用于 Kaiser FIR 滤波器设计的过渡区域的近似宽度(以与 fs 相同的单位表示)。在这种情况下,window 参数将被忽略。
4.window: 字符串或字符串和参数值的元组,可选
想要使用的窗口。有关窗口和所需参数的列表,请参见scipy.signal.get_window。
5.pass_zero: {真,假,‘bandpass’, ‘lowpass’, ‘highpass’, ‘bandstop’},可选
如果为 True,则频率 0(即 “DC gain”)处的增益为 1。如果为 False,则直流增益为 0。也可以是所需滤波器类型的字符串参数(相当于 IIR 设计函数中的 btype )。
6.scale: 布尔型,可选
设置为 True 以缩放系数,以便频率响应在某个频率处完全一致。该频率是:
7.nyq: 浮点数,可选
已弃用。请改用fs
。这是奈奎斯特频率。截止频率中的每个频率必须介于 0 和 nyq 之间。默认值为 1。
8.fs: 浮点数,可选
信号的采样频率。每个截止频率必须介于 0 和 fs/2 之间。默认值为 2。
输出返回
h: (numtaps,) ndarray
numtaps FIR 滤波器长度的系数。
ValueError
如果 cutoff 中的任何值小于或等于 0 或大于或等于fs/2,如果值在隔断不是严格单调递增的,或者如果小数点是偶数,但通带包括奈奎斯特频率。
一般和firwin连用的还有个lfilter
使用 IIR 或 FIR 滤波器沿 one-dimension 过滤数据。
scipy.signal.lfilter(b, a, x, axis=- 1, zi=None)
对数据序列x进行滤波。这适用于许多基本数据类型(包括对象类型)。该滤波器是标准差分方程的直接形式II的转置实现。
对于大多数滤波任务,函数sosfilt(和使用output='sos’的滤波器设计)应该优先于lfilter,因为second-order部分的数值问题较少。
输入参数:
1. b: 类数组
一个一维序列的系数向量,方程的分子。
2. a: 类数组
一维序列系数向量,分母。如果a[0]不是1,那么a和b都由a[0]归一化。
3. x: 类数组
n维输入数组。
4. axis: int, 可选
用于线性滤波器的输入数组的轴。滤波器应用于沿此轴的每一个子数组。默认值为-1。
5. zi: 类数组, 可选
滤波器的延迟的初始条件。它是一个长度为max(len(a), len(b)) - 1的向量(或n维输入的向量数组)。如果zi为None或未给出,则假定初始休眠。
输出返回
1. y: 类数组
数字滤波器的输出。
2. zf: 类数组,可选
如果zi为None,则不返回此值,否则,zf保存最终的滤波器延迟值。
举例:
一个高通滤波,去掉70Hz以下部分
fs = 16000
cutoff = 70
nyquist = fs // 2
norm_cutoff = cutoff / nyquist
fil = firwin(255, norm_cutoff, pass_zero=False)
# 255即系数个数,Pass_zero不写就是低通,False就是高通(f就一个值)或带通(f为多个值如[f1,f2])
l = lfilter(fil, 1, x)
# 分子fil,分母1,