1.上级笔记
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:示例