File: gabwin.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 (189 lines) | stat: -rw-r--r-- 6,557 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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# -*- 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 Gabor window calculation

Ported from ltfat_2.1.0/gabor/gabwin.m


.. moduleauthor:: Denis Arrivault
"""

from __future__ import print_function, division

from ltfatpy.comp.comp_window import comp_window


def gabwin(g, a, M, L=None):
    """Computes a Gabor window

    - Usage:

        | ``(g, info) = gabwin(g, a, M, L)``

    - Input parameters:

    :param g: the gabor window
    :param int a: the length of time shift
    :param int M: the number of channels
    :param int L: the length of window (optional)
    :type g: numpy.ndarray or str or dict

    - Output parameters:

    :returns: ``(g, info)``
    :rtype: tuple
    :var numpy.ndarray g: the computed gabor window
    :var dict info: the information dictionary (see before)

    With the transform length parameter **L** specified, it computes a window
    that fits well with the specified number of channels **M**, time shift
    **a** and transform length **L**. The window itself is specified by a
    text description or a dictionary containing additional parameters.

    The window can be specified directly as a vector of numerical
    values. In this case, ``gabwin`` only checks assumptions about transform
    sizes etc.

    Without the transform length parameter **L**, it does the same, but the
    window must be a FIR window.

    The window can be specified as one of the following text strings:

        ===========  =======================================
        'gauss'      Gaussian window fitted to the lattice,
                     i.e. :math:`tfr = a * M / L`.

        'dualgauss'  Canonical dual of Gaussian window.

        'tight'      Tight window generated from a Gaussian.
        ===========  =======================================

    In these cases, a long window is generated with a length of **L**.

    It is also possible to specify one of the window names from
    :func:`~ltfatpy.sigproc.firwin.firwin`. In such a case,
    :func:`~ltfatpy.gabor.gabwin.gabwin` will generate the specified FIR
    window with a length of **M**.

    The window can also be specified as a dictionary. The possibilities are:

        - {'name': 'gauss', 'tfr': 1.0, 'fs': 0.0, 'width': 0.0,
           'bw': 0.0, 'c_f': 0.0, 'centering': 'hp', 'delay': 0.0, 'norm': 2}:
           Additional parameters are passed to
           :func:`~ltfatpy.fourier.pgauss.pgauss`.
        - {'name': ('dual',...), ...}:
            Canonical dual window of whatever follows. See the examples below.
        - {'name': ('tight',...), ...}:
            Canonical tight window of whatever follows.

    It is also possible to specify one of the window names from
    :func:`~ltfatpy.sigproc.firwin.firwin` as a string. In this case, the
    remaining entries of the cell array are passed directly to
    :func:`~ltfatpy.sigproc.firwin.firwin`.

    - Some examples:

        To compute a Gaussian window of length **L** fitted for a system with
        time-shift **a** and **M** channels use::

            g = gabwin('gauss', a, M, L)[0]

        To compute Gaussian window with equal time and frequency support
        irrespective of **a** and **M**::

            g = gabwin({'name': 'gauss', 'tfr': 1}, a, M, L)[0]

        To compute the canonical dual of a Gaussian window fitted for a
        system with time-shift **a** and **M** channels::

            gd = gabwin('gaussdual', a, M, L)[0]

        To compute the canonical tight window of the Gaussian window fitted
        for the system::

            gd = gabwin({'name': ('tight','gauss')}, a, M, L)[0]

        To compute the dual of a Hann window of length 20::

            g = gabwin({'name': ('dual', 'hann'), 'M': 20}, a, M, L)[0]

    The returned **info** dictionary provides some information about the
    computed window:

    =========   ===========================================================
    keys        Values
    =========   ===========================================================
    'gauss'     True if the window is a Gaussian.
    'tfr'       Time/frequency support ratio of the window.
                Set whenever it makes sense.
    'wasrow'    True if input was a row window
    'isfir'     True if input is an FIR window
    'isdual'    True if output is the dual window of the auxiliary window.
    'istight'   True if output is known to be a tight window.
    'auxinfo'   Info about auxiliary window.
    'gl'        Length of window.
    =========   ===========================================================

    .. seealso:: :func:`~ltfatpy.fourier.pgauss.pgauss`,
        :func:`~ltfatpy.sigproc.firwin.firwin`, :func:`wilwin`
    """
    # Assert correct input.
    (g, info) = comp_window(g, a, M, L)
#     if info['isfir']:
#         if info['istight']:
#             # g = g / math.sqrt(2)
    return (g, info)