python常用的信号处理函数之Scipy

常用的信号处理函数python

在对语音信号预处理的过程中,可能用到以下函数。

滤波器

考虑scipy库:Scipy

scipy.signal.firwin

该函数用来计算有限脉冲响应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 必须是奇数。

  • 滤波器将具有线性相位;如果 numtaps 为奇数则为 Type I,如果 numtaps 为偶数则为 Type II。
  • II 型滤波器在奈奎斯特频率处始终具有零响应,因此如果使用 numtaps 偶数调用 firwin 并且具有右端位于奈奎斯特频率的通带,则会引发 ValueError 异常。

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 以缩放系数,以便频率响应在某个频率处完全一致。该频率是:

  • 0 (DC) 如果第一个通带从 0 开始(即 pass_zero 为真)
  • fs/2(奈奎斯特频率),如果第一个通带以 fs/2 结束(即滤波器是单频带高通滤波器);否则为第一通带中心

7.nyq: 浮点数,可选
已弃用。请改用fs。这是奈奎斯特频率。截止频率中的每个频率必须介于 0 和 nyq 之间。默认值为 1。

8.fs: 浮点数,可选
信号的采样频率。每个截止频率必须介于 0 和 fs/2 之间。默认值为 2。

输出返回
h: (numtaps,) ndarray
numtaps FIR 滤波器长度的系数。

ValueError
如果 cutoff 中的任何值小于或等于 0 或大于或等于fs/2,如果值在隔断不是严格单调递增的,或者如果小数点是偶数,但通带包括奈奎斯特频率。

一般和firwin连用的还有个lfilter

scipy.signal.lfilter

使用 IIR 或 FIR 滤波器沿 one-dimension 过滤数据。

scipy.signal.lfilter(b, a, x, axis=- 1, zi=None)

对数据序列x进行滤波。这适用于许多基本数据类型(包括对象类型)。该滤波器是标准差分方程的直接形式II的转置实现。

对于大多数滤波任务,函数sosfilt(和使用output='sos’的滤波器设计)应该优先于lfilter,因为second-order部分的数值问题较少。

描述该滤波器在z变换域中的有理传递函数为:
python常用的信号处理函数之Scipy_第1张图片

输入参数:
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,

你可能感兴趣的:(语音基础知识,信号处理,python,信号处理,scipy)