Converted filters with memory to direct form II transposed, this creates
[speexdsp.git] / libspeex / nb_celp.h
1 /* Copyright (C) 2002 Jean-Marc Valin */
2 /**
3     @file nb_celp.h
4     @brief Narrowband CELP encoder/decoder
5 */
6 /*
7    This library is free software; you can redistribute it and/or
8    modify it under the terms of the GNU Lesser General Public
9    License as published by the Free Software Foundation; either
10    version 2.1 of the License, or (at your option) any later version.
11    
12    This library is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    Lesser General Public License for more details.
16    
17    You should have received a copy of the GNU Lesser General Public
18    License along with this library; if not, write to the Free Software
19    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20
21 */
22
23 #ifndef NB_CELP_H
24 #define NB_CELP_H
25
26 #include "modes.h"
27 #include "speex_bits.h"
28 #include "vbr.h"
29
30 /**Structure representing the full state of the narrowband encoder*/
31 typedef struct EncState {
32    SpeexMode *mode;       /**< Mode curresponding to the state */
33    int    first;          /**< Is this the first frame? */
34    int    frameSize;      /**< Size of frames */
35    int    subframeSize;   /**< Size of sub-frames */
36    int    nbSubframes;    /**< Number of sub-frames */
37    int    windowSize;     /**< Analysis (LPC) window length */
38    int    lpcSize;        /**< LPC order */
39    int    bufSize;        /**< Buffer size */
40    int    min_pitch;      /**< Minimum pitch value allowed */
41    int    max_pitch;      /**< Maximum pitch value allowed */
42
43    int    ol_pitch;       /**< Open-loop pitch */
44    int    ol_voiced;      /**< Open-loop voiced/non-voiced decision */
45    int   *pitch;
46    float  gamma1;         /**< Perceptual filter: A(z/gamma1) */
47    float  gamma2;         /**< Perceptual filter: A(z/gamma2) */
48    float  lag_factor;     /**< Lag windowing gaussian width */
49    float  lpc_floor;      /**< Noise floor multiplier for A[0] in LPC analysis*/
50    float  preemph;        /**< Pre-emphasis: P(z) = 1 - a*z^-1*/
51    float  pre_mem;        /**< 1-element memory for pre-emphasis */
52    float  pre_mem2;       /**< 1-element memory for pre-emphasis */
53    float *stack;          /**< Pseudo-stack allocation for temporary memory */
54    float *inBuf;          /**< Input buffer (original signal) */
55    float *frame;          /**< Start of original frame */
56    float *excBuf;         /**< Excitation buffer */
57    float *exc;            /**< Start of excitation frame */
58    float *exc2Buf;        /**< "Pitch enhanced" excitation */
59    float *exc2;           /**< "Pitch enhanced" excitation */
60    float *swBuf;          /**< Weighted signal buffer */
61    float *sw;             /**< Start of weighted signal frame */
62    float *innov;          /**< Innovation for the frame */
63    float *window;         /**< Temporary (Hanning) window */
64    float *buf2;           /**< 2nd temporary buffer */
65    float *autocorr;       /**< auto-correlation */
66    float *lagWindow;      /**< Window applied to auto-correlation */
67    float *lpc;            /**< LPCs for current frame */
68    float *lsp;            /**< LSPs for current frame */
69    float *qlsp;           /**< Quantized LSPs for current frame */
70    float *old_lsp;        /**< LSPs for previous frame */
71    float *old_qlsp;       /**< Quantized LSPs for previous frame */
72    float *interp_lsp;     /**< Interpolated LSPs */
73    float *interp_qlsp;    /**< Interpolated quantized LSPs */
74    float *interp_lpc;     /**< Interpolated LPCs */
75    float *interp_qlpc;    /**< Interpolated quantized LPCs */
76    float *bw_lpc1;        /**< LPCs after bandwidth expansion by gamma1 for perceptual weighting*/
77    float *bw_lpc2;        /**< LPCs after bandwidth expansion by gamma2 for perceptual weighting*/
78    float *rc;             /**< Reflection coefficients */
79    float *mem_sp;         /**< Filter memory for signal synthesis */
80    float *mem_sw;         /**< Filter memory for perceptually-weighted signal */
81    float *mem_exc;        /**< Filter memory for excitation */
82    float *pi_gain;        /**< Gain of LPC filter at theta=pi (fe/2) */
83
84    VBRState *vbr;         /**< State of the VBR data */
85    int    vbr_quality;    /**< Quality setting for VBR encoding */
86    int    vbr_enabled;    /**< 1 for enabling VBR, 0 otherwise */
87    int    complexity;     /**< Complexity setting (0-10 from least complex to most complex) */
88
89    SpeexSubmode **submodes; /**< Sub-mode data */
90    int    submodeID;      /**< Activated sub-mode */
91 } EncState;
92
93 /**Structure representing the full state of the narrowband decoder*/
94 typedef struct DecState {
95    SpeexMode *mode;       /**< Mode curresponding to the state */
96    int    first;          /**< Is this the first frame? */
97    int    count_lost;     /**< Was the last frame lost? */
98    int    frameSize;      /**< Size of frames */
99    int    subframeSize;   /**< Size of sub-frames */
100    int    nbSubframes;    /**< Number of sub-frames */
101    int    windowSize;     /**< Analysis (LPC) window length */
102    int    lpcSize;        /**< LPC order */
103    int    bufSize;        /**< Buffer size */
104    int    min_pitch;      /**< Minimum pitch value allowed */
105    int    max_pitch;      /**< Maximum pitch value allowed */
106
107    float  gamma1;         /**< Perceptual filter: A(z/gamma1) */
108    float  gamma2;         /**< Perceptual filter: A(z/gamma2) */
109    float  preemph;        /**< Pre-emphasis: P(z) = 1 - a*z^-1*/
110    float  pre_mem;        /**< 1-element memory for pre-emphasis */
111    float *stack;          /**< Pseudo-stack allocation for temporary memory */
112    float *inBuf;          /**< Input buffer (original signal) */
113    float *frame;          /**< Start of original frame */
114    float *excBuf;         /**< Excitation buffer */
115    float *exc;            /**< Start of excitation frame */
116    float *innov;          /**< Innovation for the frame */
117    float *qlsp;           /**< Quantized LSPs for current frame */
118    float *old_qlsp;       /**< Quantized LSPs for previous frame */
119    float *interp_qlsp;    /**< Interpolated quantized LSPs */
120    float *interp_qlpc;    /**< Interpolated quantized LPCs */
121    float *mem_sp;         /**< Filter memory for synthesis signal */
122    float *pi_gain;        /**< Gain of LPC filter at theta=pi (fe/2) */
123    int    last_pitch;     /**< Pitch of last correctly decoded frame */
124    float  last_pitch_gain; /**< Pitch gain of last correctly decoded frame */
125
126    SpeexSubmode **submodes; /**< Sub-mode data */
127    int    submodeID;      /**< Activated sub-mode */
128    int    lpc_enh_enabled; /**< 1 when LPC enhancer is on, 0 otherwise */
129 } DecState;
130
131 /** Initializes encoder state*/
132 void *nb_encoder_init(SpeexMode *m);
133
134 /** De-allocates encoder state resources*/
135 void nb_encoder_destroy(void *state);
136
137 /** Encodes one frame*/
138 void nb_encode(void *state, float *in, SpeexBits *bits);
139
140
141 /** Initializes decoder state*/
142 void *nb_decoder_init(SpeexMode *m);
143
144 /** De-allocates decoder state resources*/
145 void nb_decoder_destroy(void *state);
146
147 /** Decodes one frame*/
148 int nb_decode(void *state, SpeexBits *bits, float *out);
149
150 /** ioctl-like function for controlling a narrowband encoder */
151 void nb_encoder_ctl(void *state, int request, void *ptr);
152
153 /** ioctl-like function for controlling a narrowband decoder */
154 void nb_decoder_ctl(void *state, int request, void *ptr);
155
156
157 #endif