梳理研究-python信号处理-小波分析PyWavelets


1.上级笔记

梳理研究-python信号处理.md

2.基础

网络资源

来源:小波变换简介 - 简书 (jianshu.com)
本地:小波变换简介 信号分解 python

连续小波变换

下面将要详细讨论的连续小波变换也是信号在时间-频率域内局部化联合分析的一种方法。小波$ψ(t)$是一个时间函数,它正负波动的同时速降至零,其傅立叶变换$\hatψ(w)$呈现为带通滤波器的频率特性,也就是说,小波在时域和频域都是局部化的。将$ψ(t)$伸缩和平移而得到的一族函数$ψ{a,b}(t)$称为分析小波,它在时域和频域也是局部化的。以$ψ{a,b}(t)$为核函数的积分变换,正是积分小波变换或称连续小波变换。与窗口傅立叶变换不同的是,小波变换的时间-频率窗不是固定不变的,而是可以自适应调整的。这是小波变换和窗口傅立叶变换的根本区别。也正是由于这个特点决定了小波分析在实际应用中的独特地位。

还应当注意,傅立叶变换用到的核函数为正弦函数,具有惟一性;小波分析用到的核函数为小波函数则有很多种,具有不惟一性,同一工程问题用不同的小波函数进行分析有时结果相差甚远。小波函数的选用是小波分析实际应用中的一个难点,也是小波分析研究的一一个热点,目前往往是根据经验或通过不断的试验,对结果进行对比分析来选择合适的小波。

离散小波变换

3.各类小波基函数及用途

小波基函数及选择

来源:有关小波的几个术语及常见的小波基介绍_不负韶华T的博客-CSDN博客
本地:有关小波的几个术语及常见的小波基介绍

pywt小波基函数及选择

1. 小波基的选择问题

    API给出了很多小波族,每个小波族又有很多系数可供选择,在处理图片时怎么选择并没有标准答案,在实验过程中主要用到最后的结果——“相同类的统计特征相近,不同类的统计特征相差很大”来挑选小波基函数。(来源:https://www.cnblogs.com/keye/p/7809207.html

2. 多尺度(多次)小波变化中层数的选择

    多尺度小波变换一般是3~4层,但注意是,图片太小,或纹理不丰富,用单层的小波变换就足够了。如果用多层的小波变换,Pywalvets仍会返回一层变换的结果,因为信息量过小导致不能采样来进一步进行变换。(来源:https://www.cnblogs.com/keye/p/7809207.html

4.库:pywt(PyWavelets)

地址:
PyWavelets - Wavelet Transforms in Python — PyWavelets Documentation
手册:api
API Reference — PyWavelets Documentation

安装

1. 切换到python虚拟环境,此处使用python383虚拟环境
    activate python383
2. 安装
方式一:使用pip
最简单的方法就是进行pip安装,可以满足所有的依赖关系;
可以提前下载好安装文件,切换到文件存放位置进行安装;也可以直接使用指令在线安装。
    pip install PyWavelets
方式二:使用conda
前提是安装了Anaconda。
    conda install pywavelets
3. 查看安装结果
    pip list

 遇到问题多翻看手册
 基于v1.1.1

5.库的基本使用

import pywt
cA, cD = pywt.dwt([1, 2, 3, 4], 'db1') #[1, 2, 3, 4]是待分析数据,db1是小波基函数。

6.库的小波基函数

内置小波基函数

函数族

查看函数族,输入:

pywt.families() # 默认缩写,

返回:

['haar',
 'db',
 'sym',
 'coif',
 'bior',
 'rbio',
 'dmey',
 'gaus',
 'mexh',
 'morl',
 'cgau',
 'shan',
 'fbsp',
 'cmor']

查看详细函数族:

pywt.families(short=False)

输出:

['Haar',
 'Daubechies',
 'Symlets',
 'Coiflets',
 'Biorthogonal',
 'Reverse biorthogonal',
 'Discrete Meyer (FIR Approximation)',
 'Gaussian',
 'Mexican hat wavelet',
 'Morlet wavelet',
 'Complex Gaussian wavelets',
 'Shannon wavelets',
 'Frequency B-Spline wavelets',
 'Complex Morlet wavelets']

函数列表

查看函数列表:

pywt.wavelist( family=None, kind='all' )

输出:

['bior1.1',
 'bior1.3',
 'bior1.5',
 'bior2.2',
 'bior2.4',
 'bior2.6',
 'bior2.8',
 'bior3.1',
 'bior3.3',
 'bior3.5',
 'bior3.7',
 'bior3.9',
 'bior4.4',
 'bior5.5',
 'bior6.8',
 'cgau1',
 'cgau2',
 'cgau3',
 'cgau4',
 'cgau5',
 'cgau6',
 'cgau7',
 'cgau8',
 'cmor',
 'coif1',
 'coif2',
 'coif3',
 'coif4',
 'coif5',
 'coif6',
 'coif7',
 'coif8',
 'coif9',
 'coif10',
 'coif11',
 'coif12',
 'coif13',
 'coif14',
 'coif15',
 'coif16',
 'coif17',
 'db1',
 'db2',
 'db3',
 'db4',
 'db5',
 'db6',
 'db7',
 'db8',
 'db9',
 'db10',
 'db11',
 'db12',
 'db13',
 'db14',
 'db15',
 'db16',
 'db17',
 'db18',
 'db19',
 'db20',
 'db21',
 'db22',
 'db23',
 'db24',
 'db25',
 'db26',
 'db27',
 'db28',
 'db29',
 'db30',
 'db31',
 'db32',
 'db33',
 'db34',
 'db35',
 'db36',
 'db37',
 'db38',
 'dmey',
 'fbsp',
 'gaus1',
 'gaus2',
 'gaus3',
 'gaus4',
 'gaus5',
 'gaus6',
 'gaus7',
 'gaus8',
 'haar',
 'mexh',
 'morl',
 'rbio1.1',
 'rbio1.3',
 'rbio1.5',
 'rbio2.2',
 'rbio2.4',
 'rbio2.6',
 'rbio2.8',
 'rbio3.1',
 'rbio3.3',
 'rbio3.5',
 'rbio3.7',
 'rbio3.9',
 'rbio4.4',
 'rbio5.5',
 'rbio6.8',
 'shan',
 'sym2',
 'sym3',
 'sym4',
 'sym5',
 'sym6',
 'sym7',
 'sym8',
 'sym9',
 'sym10',
 'sym11',
 'sym12',
 'sym13',
 'sym14',
 'sym15',
 'sym16',
 'sym17',
 'sym18',
 'sym19',
 'sym20']

查看某一项函数的列表,例如$coif$基函数:

pywt.wavelist('coif')
pywt.wavelist(family='coif') #两种方式都可以

输出:

['coif1',
 'coif2',
 'coif3',
 'coif4',
 'coif5',
 'coif6',
 'coif7',
 'coif8',
 'coif9',
 'coif10',
 'coif11',
 'coif12',
 'coif13',
 'coif14',
 'coif15',
 'coif16',
 'coif17']

小波函数对象

class pywt.Wavelet( name [ , filter_bank=None ] )
使用:

wavelet1 = pywt.Wavelet('db1')
print(wavelet1) #查看继承的属性

输出:

Wavelet db1
  Family name:    Daubechies
  Short name:     db
  Filters length: 2
  Orthogonal:     True
  Biorthogonal:   True
  Symmetry:       asymmetric
  DWT:            True
  CWT:            False

小波逼近和标度

Wavelet. wavefun( level )
wavefun()可以用来计算给定level的phi和psi参数。

 The wavefun() method can be used to calculate approximations of scaling function(phi) and wavelet function (psi) at the given level of refinement.
- 针对正交小波orthogonal wavelets
[phi, psi, x] = wavelet.wavefun(level)
示例:

wavelet = pywt.Wavelet('db2')
phi, psi, x = wavelet.wavefun(level=5)

- 针对双正交小波 (biorthogonal but not orthogonal) wavelets
[phi_d, psi_d, phi_r, psi_r, x] = wavelet.wavefun(level)
示例:

wavelet = pywt.Wavelet('bior3.5')
phi_d, psi_d, phi_r, psi_r, x = wavelet.wavefun(level=5)

自定义小波基函数、改造内置小波基函数

去看手册吧:Wavelets — PyWavelets Documentation

7.信号扩展模式

分类

PyWavelets provides several methods of signal extrapolation that can be used to minimize this negative effect:

zero - zero-padding - signal is extended by adding zero samples:
... 0 0 | x1 x2 ... xn | 0 0 ...
constant - constant-padding - border values are replicated:
... x1 x1 | x1 x2 ... xn | xn xn ...
symmetric - symmetric- padding - signal is extended by mirroring samples. This mode is also known as half-sample symmetric.:
... x2 x1 | x1 x2 ... xn | xn xn-1 ...
reflect - reflect-padding - signal is extended by reflecting samples. This mode is also known as whole-sample symmetric.:
… x3 x2 | x1 x2 … xn | xn-1 xn-2 …
periodic - periodic-padding - signal is treated as a periodic one:
... xn-1 xn | x1 x2 ... xn | x1 x2 ...
smooth - smooth- padding - signal is extended according to the first derivatives calculated on the edges (straight line)
antisymmetric - anti- symmetric padding - signal is extended by mirroring and negating samples. This mode is also known as half-sample anti-symmetric:
... -x2 -x1 | x1 x2 ... xn | -xn -xn-1 ...
antireflect - anti-symmetric-reflect padding - signal is extended by reflecting anti-symmetrically about the edge samples. This mode is also known as whole-sample anti-symmetric:
... (2*x1 - x3) (2*x1 - x2) | x1 x2 ... xn | (2*xn - xn-1) (2*xn - xn-2) ...

使用

1. 查看扩展模式
    

    print(pywt.Modes.modes)

    输出
    
    ['zero', 'constant', 'symmetric', 'periodic', 'smooth', 'periodization', 'reflect', 'antisymmetric', 'antireflect']

2. dwt(Discrete Wavelet Transform 离散小波变换)使用扩展模式
    
    (a, d) = pywt.dwt([1,2,3,4,5,6], 'db2', 'smooth')
    (a, d) = pywt.dwt([1,2,3,4,5,6], pywt.Wavelet('db2'), pywt.Modes.smooth) #二者效果一样

3. 使用扩展模式
    pywt.pad(_x_, _pad_widths_, _mode_)
    示例:
    
    x1=[0,1,2,3]
    pywt. pad( x1, 2, 'zero' )

    输出:
    
    array([0, 0, 0, 1, 2, 3, 0, 0])

# 8.离散小波变换(Discrete Wavelet Transform DWT)

单层变换(dwt)

方法介绍

pywt.dwt(data, wavelet, mode='symmetric', axis=-1)

Parameters:
    data : array_like
        Input signal
    wavelet : Wavelet object or name
        Wavelet to use
    mode : str, optional
        Signal extension mode, see Modes.
    axis: int, optional
        Axis over which to compute the DWT. If not given, the last axis is used.

Returns:
    (cA, cD) : tuple
        Approximation and detail coefficients

示例

输入

(cA, cD) = pywt.dwt([1, 2, 3, 4, 5, 6], 'db1')
cA

输出:

array([ 2.12132034,  4.94974747,  7.77817459])

输入

cD

输出

array([-0.70710678, -0.70710678, -0.70710678])

1维数据、多层分解(wavedec)

方法介绍

pywt.wavedec(data, wavelet, mode='symmetric', level=None, axis=-1)

Parameters:    
    data: array_like
        Input data

    wavelet : Wavelet object or name string
        Wavelet to use

    mode : str, optional
        Signal extension mode, see Modes.

    level : int, optional
        Decomposition level (must be >= 0). If level is None (default) then it will be calculated using the dwt_max_level function.

    axis: int, optional
        Axis over which to compute the DWT. If not given, the last axis is used.

Returns:
    [cA_n, cD_n, cD_n-1,, cD2, cD1] : list
        Ordered list of coefficients arrays where n denotes the level of decomposition. The first element (cA_n) of the result is approximation coefficients array and the following elements (cD_n - cD_1) are details coefficients arrays.

示例

>>> from pywt import wavedec
>>> coeffs = wavedec([1,2,3,4,5,6,7,8], 'db1', level=2)
>>> cA2, cD2, cD1 = coeffs
>>> cD1
array([-0.70710678, -0.70710678, -0.70710678, -0.70710678])
>>> cD2
array([-2., -2.])
>>> cA2
array([  5.,  13.])

其他分解方法

由于暂时没使用到,先做个索引,用的时候去看手册Discrete Wavelet Transform (DWT) — PyWavelets Documentation
1. Partial Discrete Wavelet Transform data decomposition downcoef
    pywt.downcoef(part, data, wavelet, mode='symmetric', level=1)
1. Maximum decomposition level - dwt_max_level, dwtn_max_level
    pywt.dwt_max_level(data_len, filter_len)
1. Result coefficients length - dwt_coeff_len
    pywt.dwt_coeff_len(data_len, filter_len, mode='symmetric')

9.其他变换

暂时没用到,附手册API Reference — PyWavelets Documentation

10.应用示例

GitHub:示例


文章作者: 小酌笔墨
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小酌笔墨 !
  目录