File: assert_sigreshape_pre.py

package info (click to toggle)
python-ltfatpy 1.1.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 41,412 kB
  • sloc: ansic: 8,546; python: 6,470; makefile: 15
file content (148 lines) | stat: -rw-r--r-- 4,614 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# -*- coding: utf-8 -*-
# ######### COPYRIGHT #########
# Credits
# #######
#
# Copyright(c) 2015-2025
# ----------------------
#
# * `LabEx Archimède <http://labex-archimede.univ-amu.fr/>`_
# * `Laboratoire d'Informatique Fondamentale <http://www.lif.univ-mrs.fr/>`_
#   (now `Laboratoire d'Informatique et Systèmes <http://www.lis-lab.fr/>`_)
# * `Institut de Mathématiques de Marseille <http://www.i2m.univ-amu.fr/>`_
# * `Université d'Aix-Marseille <http://www.univ-amu.fr/>`_
#
# This software is a port from LTFAT 2.1.0 :
# Copyright (C) 2005-2025 Peter L. Soendergaard <peter@sonderport.dk>.
#
# Contributors
# ------------
#
# * Denis Arrivault <contact.dev_AT_lis-lab.fr>
# * Florent Jaillet <contact.dev_AT_lis-lab.fr>
#
# Description
# -----------
#
# ltfatpy is a partial Python port of the
# `Large Time/Frequency Analysis Toolbox <http://ltfat.sourceforge.net/>`_,
# a MATLAB®/Octave toolbox for working with time-frequency analysis and
# synthesis.
#
# Version
# -------
#
# * ltfatpy version = 1.1.2
# * LTFAT version = 2.1.0
#
# Licence
# -------
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# ######### COPYRIGHT #########


""" Module of dimension input proprocessing and handling

Ported from ltfat_2.1.0/comp/assert_sigreshape_pre.m

.. moduleauthor:: Denis Arrivault
                  Florent Jaillet
"""

import numpy as np
import sys


def assert_sigreshape_pre(f, L=None, dim=None):
    """Preprocess and handle dimension input

    - Input parameters:

    :param numpy.ndarray f: Signal
    :param int L: L parameter
    :param int dim: dim parameter

    - Output parameters:

    :returns: ``(f, L, Ls, W, dim, permutedshape, order)``
    :rtype: tuple

    :var numpy.ndarray f: Input signal as matrix.
    :var int L: Verified L.
    :var int Ls: Length of signal along dimension to be processed.
    :var W: Number of transforms to do.
    :vartype W: int
    :var int dim: Verified dim.
    :var tuple permutedshape: Pass to
        :func:`~ltfatpy.comp.assert_sigreshape_post.assert_sigreshape_post`
    :var tuple order: Pass to
        :func:`~ltfatpy.comp.assert_sigreshape_post.assert_sigreshape_post`

    .. warning::
        This function returns a view of **f**. Any value changed in this
        view will also be changed in **f**.
    """

# ---- Format f as a numpy array
    if type(f).__module__ != np.__name__:
        f = np.asarray(f)

# ----Check that f type is numeric
    if (not np.issubdtype(f.dtype, np.floating) and
       not np.issubdtype(f.dtype, np.complexfloating) and
       not np.issubdtype(f.dtype, np.integer)):
        raise TypeError("f data type should be numeric.")
    D = f.ndim
    order = (1,)
    if dim is None:
        dim = 0
        if (sum(item > 1 for item in f.shape) == 1):
            # ---- We have a vector, find the dimension where it lives.
            dim = [i for i, v in enumerate(f.shape) if v > 1][0]
    else:
        if (not isinstance(dim, int) and
           not isinstance(dim, np.int_)):
            raise TypeError("dim should be an integer.")
        if dim < 0 or dim > D:
            raise TypeError("dim must be in the range from 0 to "
                            "{0:d}.".format(D-1))

    if L is not None:
        if not isinstance(L, int):
            raise TypeError("L should be an integer.")

    if dim > 0:
        # NOTE: the use of list below is needed for Python3 compatibility
        order = tuple([dim]+list(range(0, dim))+list(range(dim+1, D)))
        # ---- Put the desired dimension first.
        f = np.transpose(f, order)

    Ls = f.shape[0]
    # ---- If L is None it is set to be the length of the transform.
    if L is None:
        L = Ls

    # ---- Remember the exact shape for later and modify it for the new length
    permutedshape = f.shape
    permutedshape = (L,) + permutedshape[1:]

    # ---- Reshape f to a matrix.
    if f.size != 0:
        f = np.reshape(f, (f.shape[0], f.size // f.shape[0]))

    W = f.shape[1]

    return (f, L, Ls, W, dim, permutedshape, order)