r""" dwt_max_level(data_len, filter_len) Compute the maximum useful level of decomposition. Parameters ---------- data_len : int Input data length. filter_len : int, str or Wavelet The wavelet filter length. Alternatively, the name of a discrete wav
(data_len, filter_len)
| 16 | |
| 17 | |
| 18 | def dwt_max_level(data_len, filter_len): |
| 19 | r""" |
| 20 | dwt_max_level(data_len, filter_len) |
| 21 | |
| 22 | Compute the maximum useful level of decomposition. |
| 23 | |
| 24 | Parameters |
| 25 | ---------- |
| 26 | data_len : int |
| 27 | Input data length. |
| 28 | filter_len : int, str or Wavelet |
| 29 | The wavelet filter length. Alternatively, the name of a discrete |
| 30 | wavelet or a Wavelet object can be specified. |
| 31 | |
| 32 | Returns |
| 33 | ------- |
| 34 | max_level : int |
| 35 | Maximum level. |
| 36 | |
| 37 | Notes |
| 38 | ----- |
| 39 | The rational for the choice of levels is the maximum level where at least |
| 40 | one coefficient in the output is uncorrupted by edge effects caused by |
| 41 | signal extension. Put another way, decomposition stops when the signal |
| 42 | becomes shorter than the FIR filter length for a given wavelet. This |
| 43 | corresponds to: |
| 44 | |
| 45 | .. max_level = floor(log2(data_len/(filter_len - 1))) |
| 46 | |
| 47 | .. math:: |
| 48 | \mathtt{max\_level} = \left\lfloor\log_2\left(\mathtt{ |
| 49 | \frac{data\_len}{filter\_len - 1}}\right)\right\rfloor |
| 50 | |
| 51 | Examples |
| 52 | -------- |
| 53 | >>> import pywt |
| 54 | >>> w = pywt.Wavelet('sym5') |
| 55 | >>> pywt.dwt_max_level(data_len=1000, filter_len=w.dec_len) |
| 56 | 6 |
| 57 | >>> pywt.dwt_max_level(1000, w) |
| 58 | 6 |
| 59 | >>> pywt.dwt_max_level(1000, 'sym5') |
| 60 | 6 |
| 61 | """ |
| 62 | if isinstance(filter_len, Wavelet): |
| 63 | filter_len = filter_len.dec_len |
| 64 | elif isinstance(filter_len, str): |
| 65 | if filter_len in wavelist(kind='discrete'): |
| 66 | filter_len = Wavelet(filter_len).dec_len |
| 67 | else: |
| 68 | raise ValueError( |
| 69 | f"'{filter_len}', is not a recognized discrete wavelet. A list of " |
| 70 | "supported wavelet names can be obtained via " |
| 71 | "pywt.wavelist(kind='discrete')") |
| 72 | elif not (isinstance(filter_len, Number) and filter_len % 1 == 0): |
| 73 | raise ValueError( |
| 74 | "filter_len must be an integer, discrete Wavelet object, or the " |
| 75 | "name of a discrete wavelet.") |
no outgoing calls
no test coverage detected