Skip to content

Commit

Permalink
Add transposed filters and add missing GLSADF
Browse files Browse the repository at this point in the history
  • Loading branch information
r9y9 committed Oct 28, 2018
1 parent 965227e commit 803b1d2
Show file tree
Hide file tree
Showing 8 changed files with 463 additions and 30 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
pysptk/_sptk.c
pysptk/version.py
docs/generated
docs/.doctrees
docs/plot_directive

# Created by https://www.gitignore.io

Expand Down
2 changes: 2 additions & 0 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ Change log
v0.1.13 <2018-xx-xx>
--------------------

- Add tranposed synthesis filters (``mlsadft``, ``poledft``, ``mglsadft``, ``glsadft``)
- Add missing high level synthesis filter class ``GLSADF``.

v0.1.12 <2018-10-27>
--------------------
Expand Down
14 changes: 14 additions & 0 deletions pysptk/_sptk.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -104,15 +104,29 @@ cdef extern from "SPTK.h":

# Waveform generation filters
double _poledf "poledf"(double x, double *a, int m, double *d)
double _poledft "poledft"(double x, double *a, int m, double *d)
double _lmadf "lmadf"(double x, double *c, const int m, const int pd, double *d)
double _lmadft "lmadft"(double x, double *c, const int m, const int pd, double *d,
int block_num, int *block_size)
double _lspdf_even "lspdf_even"(double x, double *f, const int m, double *d)
double _lspdf_odd "lspdf_odd"(double x, double *f, const int m, double *d)
double _ltcdf "ltcdf"(double x, double *k, int m, double *d)
double _glsadf "glsadf"(double x, double *c, const int m, const int n, double *d)
double _glsadft "glsadft"(double x, double *c, const int m, const int n, double *d)
double _iglsadf "iglsadf"(double x, double *c, const int m, const int n, double *d)
double _iglsadft "iglsadft"(double x, double *c, const int m, const int n, double *d)
double _mlsadf "mlsadf"(double x, double *b, const int m, const double a, const int pd,
double *d)
double _mlsadft "mlsadft"(double x, double *b, const int m, const double a, const int pd,
double *d)
double _mglsadf "mglsadf"(double x, double *b, const int m, const double a, const int n,
double *d)
double _mglsadft "mglsadft"(double x, double *b, const int m, const double a, const int n,
double *d)
double _imglsadf "imglsadf"(double x, double *b, const int m, const double a, const int n,
double *d)
double _imglsadft "imglsadft"(double x, double *b, const int m, const double a, const int n,
double *d)

# Window functions
double _window "window"(Window window_type, double *x, const int size, const int nflg)
Expand Down
40 changes: 40 additions & 0 deletions pysptk/_sptk.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -777,6 +777,14 @@ def poledf(x, np.ndarray[np.float64_t, ndim=1, mode="c"] a not None,

return _poledf(x, &a[0], order, &delay[0])

def poledft(x, np.ndarray[np.float64_t, ndim=1, mode="c"] a not None,
np.ndarray[np.float64_t, ndim=1, mode="c"] delay not None):
cdef int order = len(a) - 1
if len(delay) != poledf_delay_length(order):
raise ValueError("inconsistent delay length")

return _poledft(x, &a[0], order, &delay[0])

def lmadf_delay_length(int order, int pd):
return 2 * pd * (order + 1)

Expand Down Expand Up @@ -830,6 +838,17 @@ def glsadf(x, np.ndarray[np.float64_t, ndim=1, mode="c"] c not None,

return _glsadf(x, &c[0], order, stage, &delay[0])

def glsadft(x, np.ndarray[np.float64_t, ndim=1, mode="c"] c not None,
stage,
np.ndarray[np.float64_t, ndim=1, mode="c"] delay not None):
assert_stage(stage)

cdef int order = len(c) - 1
if len(delay) != glsadf_delay_length(order, stage):
raise ValueError("inconsistent delay length")

return _glsadft(x, &c[0], order, stage, &delay[0])

def mlsadf_delay_length(int order, int pd):
return 3 * (pd + 1) + pd * (order + 2)

Expand All @@ -844,6 +863,17 @@ def mlsadf(x, np.ndarray[np.float64_t, ndim=1, mode="c"] b not None,

return _mlsadf(x, &b[0], order, alpha, pd, &delay[0])

def mlsadft(x, np.ndarray[np.float64_t, ndim=1, mode="c"] b not None,
alpha, pd,
np.ndarray[np.float64_t, ndim=1, mode="c"] delay not None):
assert_pade(pd)

cdef int order = len(b) - 1
if len(delay) != mlsadf_delay_length(order, pd):
raise ValueError("inconsistent delay length")

return _mlsadft(x, &b[0], order, alpha, pd, &delay[0])

def mglsadf_delay_length(int order, int stage):
return (order + 1) * stage

Expand All @@ -858,6 +888,16 @@ def mglsadf(x, np.ndarray[np.float64_t, ndim=1, mode="c"] b not None,

return _mglsadf(x, &b[0], order, alpha, stage, &delay[0])

def mglsadft(x, np.ndarray[np.float64_t, ndim=1, mode="c"] b not None,
alpha, stage,
np.ndarray[np.float64_t, ndim=1, mode="c"] delay not None):
assert_stage(stage)

cdef int order = len(b) - 1
if len(delay) != mglsadf_delay_length(order, stage):
raise ValueError("inconsistent delay length")

return _mglsadft(x, &b[0], order, alpha, stage, &delay[0])

### Excitation ###

Expand Down
154 changes: 154 additions & 0 deletions pysptk/sptk.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,12 +104,16 @@
:toctree: generated/
poledf
poledft
lmadf
lspdf
ltcdf
glsadf
glsadft
mlsadf
mlsadft
mglsadf
mglsadft
Utilities for waveform generation filters
-----------------------------------------
Expand Down Expand Up @@ -2044,6 +2048,39 @@ def poledf(x, a, delay):
return _sptk.poledf(x, a, delay)


def poledft(x, a, delay):
"""Transpose All-pole digital filter
Parameters
----------
x : float
A input sample
a : array
AR coefficients
delay : array
Delay
Returns
-------
y : float
A filtered sample
Raises
------
ValueError
if invalid delay length is supplied
See Also
--------
pysptk.sptk.poledf
"""

return _sptk.poledft(x, a, delay)


def lmadf_delay(order, pd):
"""Delay for lmadf
Expand Down Expand Up @@ -2278,6 +2315,44 @@ def glsadf(x, c,
return _sptk.glsadf(x, c, stage, delay)


def glsadft(x, c,
stage,
delay):
"""Transpose GLSA digital filter
Parameters
----------
x : float
A input sample
c : array
Geneeraized cepstrum
stage : int
-1 / gamma
delay : array
Delay
Returns
-------
y : float
A filtered sample
Raises
------
ValueError
- if invalid number of stage is specified
- if invalid delay length is supplied
See Also
--------
pysptk.sptk.glsadf
"""

return _sptk.glsadft(x, c, stage, delay)


def mlsadf_delay(order, pd):
"""Delay for mlsadf
Expand Down Expand Up @@ -2346,6 +2421,46 @@ def mlsadf(x, b, alpha, pd, delay):
return _sptk.mlsadf(x, b, alpha, pd, delay)


def mlsadft(x, b, alpha, pd, delay):
"""Transpose MLSA digital filter
Parameters
----------
x : float
A input sample
b : array
MLSA filter coefficients
alpha : float
All-pass constant
pd : int
Order of pade approximation
delay : array
Delay
Returns
-------
y : float
A filtered sample
Raises
------
ValueError
- if invalid order of pade approximation is specified
- if invalid delay length is supplied
See Also
--------
pysptk.sptk.mlsadf
"""

return _sptk.mlsadft(x, b, alpha, pd, delay)


def mglsadf_delay(order, stage):
"""Delay for mglsadf
Expand Down Expand Up @@ -2413,8 +2528,47 @@ def mglsadf(x, b, alpha, stage, delay):
return _sptk.mglsadf(x, b, alpha, stage, delay)


def mglsadft(x, b, alpha, stage, delay):
"""Transpose MGLSA digital filter
Parameters
----------
x : float
A input sample
b : array
MGLSA filter coefficients
alpha : float
All-pass constant
stage : int
-1 / gamma
delay : array
Delay
Returns
-------
y : float
A filtered sample
Raises
------
ValueError
- if invalid number of stage is specified
- if invalid delay length is supplied
See Also
--------
pysptk.sptk.mglsadf
"""

return _sptk.mglsadft(x, b, alpha, stage, delay)

### Excitation ###


def excite(pitch, hopsize=100, interp_period=1, gaussian=False, seed=1):
"""Excitation generation
Expand Down

0 comments on commit 803b1d2

Please sign in to comment.