Matlab的`mdwtdec()`与Python的`wavedec()`

时间:2016-02-01 21:26:34

标签: wavelet wavelet-transform

我正在尝试将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)XLEVWNAME与Matlab类似。方向没有选项,因此默认设置为'r'。我也需要'c'作为选项,我如何在Python中实现它?

1 个答案:

答案 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表达式,用于指定执行的函数以及输入参数的映射