1 /* HR (GSM 06.20) codec wrapper */
4 * This file is part of gapk (GSM Audio Pocket Knife).
6 * gapk is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * gapk is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with gapk. If not, see <http://www.gnu.org/licenses/>.
25 #include <gsmhr/gsmhr.h>
27 #include "refsrc/typedefs.h"
28 #include "refsrc/homing.h"
29 #include "refsrc/sp_dec.h"
30 #include "refsrc/sp_enc.h"
33 #define EXPORT __attribute__((visibility("default")))
35 #define EHF_MASK 0x0008 /* Encoder Homing Frame pattern */
36 #define LMAX 142 /* largest lag (integer sense) */
37 #define CG_INT_MACS 6 /* Number of multiply-accumulates in
38 * one interpolation */
39 #define NUM_CLOSED 3 /* maximum number of lags searched */
40 #define LPCSTARTINDEX 25 /* where the LPC analysis window
42 #define INBUFFSZ LPCSTARTINDEX + A_LEN /* input buffer size */
43 #define LTP_LEN 147 /* maximum ltp lag */
44 #define LSMAX (LMAX + CG_INT_MACS/2)
45 #define HNW_BUFF_LEN LSMAX
47 extern Shortword swOldR0;
48 extern Shortword swOldR0Index;
50 extern struct NormSw psnsWSfrmEngSpace[];
52 extern Shortword pswHPFXState[];
53 extern Shortword pswHPFYState[];
54 extern Shortword pswOldFrmKs[];
55 extern Shortword pswOldFrmAs[];
56 extern Shortword pswOldFrmSNWCoefs[];
57 extern Shortword pswWgtSpeechSpace[];
59 extern Shortword pswSpeech[]; /* input speech */
61 extern Shortword swPtch;
63 extern Shortword pswAnalysisState[NP];
65 extern Shortword pswWStateNum[NP],
69 extern Shortword pswLtpStateBase[LTP_LEN + S_LEN];
70 extern Shortword pswHState[NP];
71 extern Shortword pswHNWState[HNW_BUFF_LEN];
72 extern Shortword gswPostFiltAgcGain,
73 gpswPostFiltStateNum[NP],
74 gpswPostFiltStateDenom[NP],
76 pswSynthFiltState[NP],
82 pswLtpStateBaseDec[LTP_LEN + S_LEN],
83 pswPPreState[LTP_LEN + S_LEN];
85 extern Shortword swMuteFlagOld; /* error concealment */
87 extern Longword plSubfrEnergyMem[4]; /* error concealment */
88 extern Shortword swLevelMem[4],
89 lastR0, /* error concealment */
90 pswLastGood[18], /* error concealment */
92 swLastFlag; /* error concealment */
99 Shortword swOldR0Index;
100 struct NormSw psnsWSfrmEngSpace[2 * N_SUB];
101 Shortword pswHPFXState[4];
102 Shortword pswHPFYState[4];
103 Shortword pswOldFrmKs[NP];
104 Shortword pswOldFrmAs[NP];
105 Shortword pswOldFrmSNWCoefs[NP];
106 Shortword pswWgtSpeechSpace[F_LEN + LMAX + CG_INT_MACS / 2];
107 Shortword pswSpeech[INBUFFSZ]; /* input speech */
109 Shortword pswAnalysisState[NP];
110 Shortword pswWStateNum[NP],
112 Shortword pswLtpStateBase[LTP_LEN + S_LEN];
113 Shortword pswHState[NP];
114 Shortword pswHNWState[HNW_BUFF_LEN];
117 Shortword gswPostFiltAgcGain,
118 gpswPostFiltStateNum[NP],
119 gpswPostFiltStateDenom[NP],
121 pswSynthFiltState[NP],
125 pswOldFrmPFDenom[NP],
127 pswLtpStateBaseDec[LTP_LEN + S_LEN],
128 pswPPreState[LTP_LEN + S_LEN];
129 Shortword swMuteFlagOld;
130 Longword plSubfrEnergyMem[4];
131 Shortword swLevelMem[4],
139 EXPORT struct gsmhr *
144 state = calloc(1, sizeof(struct gsmhr));
148 state->dec_reset_flg = 1;
154 gsmhr_exit(struct gsmhr *state)
160 gsmhr_encode(struct gsmhr *state, int16_t *hr_params, const int16_t *pcm)
163 Shortword pcm_b[F_LEN];
167 swOldR0Index = swOldR0Index;
168 memcpy(psnsWSfrmEngSpace, state->encoder.psnsWSfrmEngSpace, sizeof(struct NormSw) * 2 * N_SUB);
169 memcpy(pswHPFXState, state->encoder.pswHPFXState, sizeof(Shortword) * 4);
170 memcpy(pswHPFYState, state->encoder.pswHPFYState, sizeof(Shortword) * 4);
171 memcpy(pswOldFrmKs, state->encoder.pswOldFrmKs, sizeof(Shortword) * NP);
172 memcpy(pswOldFrmAs, state->encoder.pswOldFrmAs, sizeof(Shortword) * NP);
173 memcpy(pswOldFrmSNWCoefs, state->encoder.pswOldFrmSNWCoefs, sizeof(Shortword) * NP);
174 memcpy(pswWgtSpeechSpace, state->encoder.pswWgtSpeechSpace, sizeof(Shortword) * F_LEN + LMAX + CG_INT_MACS / 2);
175 memcpy(pswSpeech, state->encoder.pswSpeech, sizeof(Shortword) * INBUFFSZ);
176 swPtch = state->encoder.swPtch;
177 memcpy(pswAnalysisState, state->encoder.pswAnalysisState, sizeof(Shortword) * NP);
178 memcpy(pswWStateNum, state->encoder.pswWStateNum, sizeof(Shortword) * NP);
179 memcpy(pswWStateDenom, state->encoder.pswWStateDenom, sizeof(Shortword) * NP);
180 memcpy(pswLtpStateBase, state->encoder.pswLtpStateBase, sizeof(Shortword) * LTP_LEN + S_LEN);
181 memcpy(pswHState, state->encoder.pswHState, sizeof(Shortword) * NP);
182 memcpy(pswHNWState, state->encoder.pswHNWState, sizeof(Shortword) * HNW_BUFF_LEN);
184 memcpy(pcm_b, pcm, F_LEN*sizeof(int16_t));
186 enc_reset_flg = encoderHomingFrameTest(pcm_b);
188 speechEncoder(pcm_b, hr_params);
194 state->encoder.swOldR0 = swOldR0;
195 state->encoder.swOldR0Index = swOldR0Index;
196 memcpy(state->encoder.psnsWSfrmEngSpace, psnsWSfrmEngSpace, sizeof(struct NormSw) * 2 * N_SUB);
197 memcpy(state->encoder.pswHPFXState, pswHPFXState, sizeof(Shortword) * 4);
198 memcpy(state->encoder.pswHPFYState, pswHPFYState, sizeof(Shortword) * 4);
199 memcpy(state->encoder.pswOldFrmKs, pswOldFrmKs, sizeof(Shortword) * NP);
200 memcpy(state->encoder.pswOldFrmAs, pswOldFrmAs, sizeof(Shortword) * NP);
201 memcpy(state->encoder.pswOldFrmSNWCoefs, pswOldFrmSNWCoefs, sizeof(Shortword) * NP);
202 memcpy(state->encoder.pswWgtSpeechSpace, pswWgtSpeechSpace, sizeof(Shortword) * F_LEN + LMAX + CG_INT_MACS / 2);
203 memcpy(state->encoder.pswSpeech, pswSpeech, sizeof(Shortword) * INBUFFSZ);
204 state->encoder.swPtch = swPtch;
205 memcpy(state->encoder.pswAnalysisState, pswAnalysisState, sizeof(Shortword) * NP);
206 memcpy(state->encoder.pswWStateNum, pswWStateNum, sizeof(Shortword) * NP);
207 memcpy(state->encoder.pswWStateDenom, pswWStateDenom, sizeof(Shortword) * NP);
208 memcpy(state->encoder.pswLtpStateBase, pswLtpStateBase, sizeof(Shortword) * LTP_LEN + S_LEN);
209 memcpy(state->encoder.pswHState, pswHState, sizeof(Shortword) * NP);
210 memcpy(state->encoder.pswHNWState, pswHNWState, sizeof(Shortword) * HNW_BUFF_LEN);
216 gsmhr_decode(struct gsmhr *state, int16_t *pcm, const int16_t *hr_params)
218 #define WHOLE_FRAME 18
219 #define TO_FIRST_SUBFRAME 9
222 Shortword hr_params_b[22];
225 gswPostFiltAgcGain = state->decoder.gswPostFiltAgcGain;
226 memcpy(gpswPostFiltStateNum, state->decoder.gpswPostFiltStateNum, sizeof(Shortword) * NP);
227 memcpy(gpswPostFiltStateDenom, state->decoder.gpswPostFiltStateDenom, sizeof(Shortword) * NP);
228 swPostEmphasisState = state->decoder.swPostEmphasisState;
229 memcpy(pswSynthFiltState, state->decoder.pswSynthFiltState, sizeof(Shortword) * NP);
230 memcpy(pswOldFrmKsDec, state->decoder.pswOldFrmKsDec, sizeof(Shortword) * NP);
231 memcpy(pswOldFrmAsDec, state->decoder.pswOldFrmAsDec, sizeof(Shortword) * NP);
232 memcpy(pswOldFrmPFNum, state->decoder.pswOldFrmPFNum, sizeof(Shortword) * NP);
233 memcpy(pswOldFrmPFDenom, state->decoder.pswOldFrmPFDenom, sizeof(Shortword) * NP);
234 swOldR0Dec = state->decoder.swOldR0Dec;
235 memcpy(pswLtpStateBaseDec, state->decoder.pswLtpStateBaseDec, sizeof(Shortword) * LTP_LEN + S_LEN);
236 memcpy(pswPPreState, state->decoder.pswPPreState, sizeof(Shortword) * LTP_LEN + S_LEN);
237 swMuteFlagOld = state->decoder.swMuteFlagOld;
238 memcpy(plSubfrEnergyMem, state->decoder.plSubfrEnergyMem, sizeof(Longword) * 4);
239 memcpy(swLevelMem, state->decoder.swLevelMem, sizeof(Shortword) * 4);
240 lastR0 = state->decoder.lastR0;
241 memcpy(pswLastGood, state->decoder.pswLastGood, sizeof(Shortword) * 18);
242 swState = state->decoder.swState;
243 swLastFlag = state->decoder.swLastFlag;
245 memcpy(hr_params_b, hr_params, 22*sizeof(int16_t));
247 if (state->dec_reset_flg)
248 dec_reset_flg = decoderHomingFrameTest(hr_params_b, TO_FIRST_SUBFRAME);
252 if (dec_reset_flg && state->dec_reset_flg) {
254 for (i=0; i<F_LEN; i++)
257 speechDecoder(hr_params_b, pcm);
260 if (!state->dec_reset_flg)
261 dec_reset_flg = decoderHomingFrameTest(hr_params_b, WHOLE_FRAME);
266 state->dec_reset_flg = dec_reset_flg;
269 state->decoder.gswPostFiltAgcGain = gswPostFiltAgcGain;
270 memcpy(state->decoder.gpswPostFiltStateNum, gpswPostFiltStateNum, sizeof(Shortword) * NP);
271 memcpy(state->decoder.gpswPostFiltStateDenom, gpswPostFiltStateDenom, sizeof(Shortword) * NP);
272 state->decoder.swPostEmphasisState = swPostEmphasisState;
273 memcpy(state->decoder.pswSynthFiltState, pswSynthFiltState, sizeof(Shortword) * NP);
274 memcpy(state->decoder.pswOldFrmKsDec, pswOldFrmKsDec, sizeof(Shortword) * NP);
275 memcpy(state->decoder.pswOldFrmAsDec, pswOldFrmAsDec, sizeof(Shortword) * NP);
276 memcpy(state->decoder.pswOldFrmPFNum, pswOldFrmPFNum, sizeof(Shortword) * NP);
277 memcpy(state->decoder.pswOldFrmPFDenom, pswOldFrmPFDenom, sizeof(Shortword) * NP);
278 state->decoder.swOldR0Dec = swOldR0Dec;
279 memcpy(state->decoder.pswLtpStateBaseDec, pswLtpStateBaseDec, sizeof(Shortword) * LTP_LEN + S_LEN);
280 memcpy(state->decoder.pswPPreState, pswPPreState, sizeof(Shortword) * LTP_LEN + S_LEN);
281 state->decoder.swMuteFlagOld = swMuteFlagOld;
282 memcpy(state->decoder.plSubfrEnergyMem, plSubfrEnergyMem, sizeof(Longword) * 4);
283 memcpy(state->decoder.swLevelMem, swLevelMem, sizeof(Shortword) * 4);
284 state->decoder.lastR0 = lastR0;
285 memcpy(state->decoder.pswLastGood, pswLastGood, sizeof(Shortword) * 18);
286 state->decoder.swState = swState;
287 state->decoder.swLastFlag = swLastFlag;