1.Scipy 简介

SciPy 是一个开源的 Python 算法库和数学工具包。

Scipy 是基于 Numpy 的科学计算库,用于数学、科学、工程学等领域,很多有一些高阶抽象和物理模型需要使用 Scipy。

SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。

2. signal 模块
1. signal.butter()

巴特沃斯(Butterworth)数字和模拟滤波器设计。

设计一个 N 阶数字或模拟巴特沃斯(Butterworth)滤波器并返回滤波器系数。

语法:
scipy.signal.butter(N, Wn, btype=’low’, analog=False, output=’ba’, fs=None)

参数:

  • N:int
    滤波器的阶数。对于 “带通(bandpass)”和 “带阻(bandstop)”滤波器,最终二阶截面(‘sos’)矩阵的阶数为 2*N,N 为所需系统的二阶截面数。
  • Wn:array_like
    临界频率。对于低通和高通滤波器,Wn 是一个标量;对于带通和带阻滤波器,Wn 是一个长度为 2 的序列。
    对于巴特沃斯滤波器,这是增益下降到通带的 1/sqrt(2) 的点(“-3 dB 点”)。
    对于数字滤波器,如果未指定 fs,则 Wn 单位将从 0 归一为 1,其中 1 为奈奎斯特频率(因此 Wn 单位为半周期/采样,定义为 2* 临界频率/fs)。如果指定了 fs,则 Wn 的单位与 fs 相同。
    对于模拟滤波器,Wn 是角频率(如 rad/s)。
  • btype:{‘lowpass’, ‘highpass’, ‘bandpass’, ‘bandstop’}, optional
    滤波器类型。默认是 ‘lowpass’.
  • analog:bool, optional
    当为True时,返回模拟滤波器,否则返回数字滤波器。
  • output:{‘ba’, ‘zpk’, ‘sos’}, optional
    输出类型:分子/分母(‘ba’)、极点-零点(‘zpk’)或二阶截面(‘sos’)。默认为 “ba “是为了向后兼容,但 “sos “应用于通用滤波。
  • fs:float, optional
    数字系统的采样频率。

返回值:

  • b, a:ndarray, ndarray
    IIR 滤波器的分子(b)和分母(a)多项式。仅在 output=’ba’ 时返回。
  • z, p, k:ndarray, ndarray, float
    IIR 滤波器传递函数的零点、极点和系统增益。仅在 output=’zpk’ 时返回。
  • sos:ndarray
    IIR 滤波器的二阶截面表示法。仅在 output=’sos’ 时返回。

2. signal.filtfilt()

对信号正向和反向应用数字滤波器。

此函数将线性数字滤波器应用两次,一次向前,一次向后。合并后的滤波器相位为零,滤波器阶数是原滤波器的两倍。

该函数提供了处理信号边缘的选项。

在大多数滤波任务中,应优先使用 sosfiltfilt 函数(以及使用 output=’sos’ 的滤波器设计),而不是 filtfilt,因为二阶部分的数值问题较少。

语法:
scipy.signal.filtfilt(b, a, x, axis=-1, padtype=’odd’, padlen=None, method=’pad’, irlen=None)

参数:

  • b:(N,) array_like
    滤波器的分子系数向量。
  • a:(N,) array_like
    滤波器的分母系数向量。如果 a[0] 不等于 1,则 a 和 b 都被 a[0] 归一化。
  • x:array_like
    要滤波的数据数组。
  • axis:int, optional
    应用滤波器的 x 轴。默认值为-1。
  • padtyp:estr or None, optional
    必须为 “奇数”、“偶数”、”常数 “或 “无”。这决定了应用滤波器的填充信号所使用的扩展类型。如果 padtype 为 None,则不使用任何填充。默认为 “奇数”。
  • padlen:int or None, optional
    在应用滤波器之前,在轴线两端扩展 x 的元素个数。该值必须小于 x.shape[axis] - 1。padlen=0 表示无填充。默认值为 3 * max(len(a),len(b))。
  • method:str, optional
    决定处理信号边缘的方法,是 “pad “还是 “gust”。当方法为 “pad “时,信号将被填充;填充类型由 padtype 和 padlen 决定,irlen 将被忽略。方法为 “gust “时,使用 Gustafsson 方法,忽略 padtype 和 padlen。
  • irlen:int or None, optional
    方法为 “阵风 “时,irlen 指定滤波器脉冲响应的长度。如果 irlen 为空,则不会忽略脉冲响应的任何部分。对于长信号,指定 irlen 可以显著提高滤波器的性能。

返回值:

  • y:ndarray
    与 x 形状相同的滤波输出。

3. signal.find_peaks()

根据峰值属性查找信号内部的峰值。

该函数使用一个 1-D 数组,通过简单的相邻值比较找出所有局部最大值。此外,还可以通过指定峰值属性的条件来选择这些峰值的子集。

语法:
scipy.signal.find_peaks(x, height=None, threshold=None, distance=None, prominence=None, width=None, wlen=None, rel_height=0.5, plateau_size=None)

参数:

  • b:(N,) array_like
  • x:sequence
    有峰值的信号。
  • height:number or ndarray or sequence, optional
    要求的峰高。可以是数字、无、匹配 x 的数组或前者的 2 元素序列。第一个元素始终被解释为最小高度,第二个元素(如果提供)被解释为最大高度。
  • threshold:number or ndarray or sequence, optional
    所需的峰值阈值,与其相邻样本的垂直距离。可以是数字、无、与 x 匹配的数组或前者的 2 元素序列。第一个元素始终被解释为最小阈值,第二个元素(如果提供)被解释为最大阈值。
  • distance:number, optional
    相邻峰之间所需的最小水平距离(>= 1)。先移除较小的峰,直到所有剩余峰都满足条件为止。
  • prominence:number or ndarray or sequence, optional
    所需的峰值突出度。可以是数字、无、与 x 匹配的数组或前者的 2 元素序列。第一个元素始终被解释为最小突出度,第二个元素(如果提供)被解释为最大突出度。
  • width:number or ndarray or sequence, optional
    要求的样本峰宽度。可以是数字、无、匹配 x 的数组或前者的 2 元素序列。第一个元素始终被解释为最小宽度,第二个元素(如果提供)被解释为最大宽度。
  • wlen:int, optional
    用于计算峰的突出度,因此只有在提供了突出度或宽度参数时才会使用。有关其作用的详细说明,请参见 peak_prominences 中的参数 wlen。
  • rel_height:float, optional
    用于计算峰值宽度,因此只有在给出 width 时才会使用。关于参数 rel_height 的作用,请参阅 peak_widths 中的参数 rel_height。
  • plateau_size:number or ndarray or sequence, optional
    所需的样本峰平顶尺寸。可以是数字、无、与 x 匹配的数组或前者的 2 元素序列。第一个元素始终被解释为最小值,第二个元素(如果提供)被解释为所需的最大平顶尺寸。

返回值:

  • peaks:ndarray
    x 中满足所有给定条件的峰的指标。
  • properties:dict
    包含返回峰属性的字典,这些属性是在评估指定条件时作为中间结果计算出来的

Ref.

  1. Scipy 教程 - 菜鸟教程
  2. Signal processing (scipy.signal)
  3. scipy.signal.butter
  4. scipy.signal.filtfilt
  5. scipy.signal.find_peaks