我正在尝试将Matlab代码转换为Python。要进行多信号1-D小波分解,我在Matlab中使用mdwtdec()
。我在python中找到的最接近的函数是pywt
lib,wavedec()
。
虽然matlab函数需要4个参数mdwtdec(DIRDEC,X,LEV,WNAME)
:此处X
是信号,LEV
是级别,WNAME
是小波名称,DIRDEC
是方向指示器:r
(行)或c
(列)。
mdwtdec(DIRDEC,X,LEV,WNAME)
返回矩阵LEV
每行(DIRDEC = r
)或每列(如果DIRDEC = c
)级别X
的小波分解小波WNAME.
在pywavelets中,wavedec(X,LEV,WNAME)
将X
,LEV
和WNAME
与Matlab类似。方向没有选项,因此默认设置为'r'。我也需要'c'作为选项,我如何在Python中实现它?
答案 0 :(得分:1)
pywt
的{{1}}假设信号是一个数组。如果信号不是数组,则结果不太令人信服(对于方形矩阵,结果似乎对应于行方向操作,但对于非方形矩阵则不能说明。)
幸运的是,您可以使用numpy
's apply_along_axis
为每行或每列运行wavedec
。通过一些额外的包装,你可以定义一个Matlab近似(Matlab的版本可能有更好的错误处理)到wavedec
,例如:
mdwtdec
我使用过:
import pywt
import numpy as np
def mdwtdec(dirdec,x,lev,wavelet):
"""
Multisignal 1D Discrete Wavelet decomposition.
Parameters
----------
dirdec : char
Direction indicator: 'r' (row) or 'c' (column)
x : matrix
Input matrix
wavelet : Wavelet object or name string
Wavelet to use
lev : int
Decomposition level (must be >= 0). If level is None then it
will be calculated using the ``dwt_max_level`` function.
"""
return np.apply_along_axis(
lambda y: np.concatenate(pywt.wavedec(y, wavelet, level=lev)),
axis={'c':0, 'r':1}[dirdec], arr=x)
将近似值和细节系数保持为紧密的行/列向量np.concatenate
表达式,用于指定执行的函数以及输入参数的映射