Mercurial > hg > audiostuff
comparison intercom/gsm/code.c @ 2:13be24d74cd2
import intercom-0.4.1
| author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
|---|---|
| date | Fri, 25 Jun 2010 09:57:52 +0200 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 1:9cadc470e3da | 2:13be24d74cd2 |
|---|---|
| 1 /* | |
| 2 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische | |
| 3 * Universitaet Berlin. See the accompanying file "COPYRIGHT" for | |
| 4 * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. | |
| 5 */ | |
| 6 | |
| 7 /* $Header: /home/kbs/jutta/src/gsm/gsm-1.0/src/RCS/code.c,v 1.1 1992/10/28 00:15:50 jutta Exp $ */ | |
| 8 | |
| 9 #include "config.h" | |
| 10 | |
| 11 | |
| 12 #ifdef HAS_STDLIB_H | |
| 13 #include <stdlib.h> | |
| 14 #include <string.h> | |
| 15 #else | |
| 16 # include "proto.h" | |
| 17 extern char *memcpy P((char *, char *, int)); | |
| 18 #endif | |
| 19 | |
| 20 #include "private.h" | |
| 21 #include "gsm.h" | |
| 22 #include "proto.h" | |
| 23 | |
| 24 /* | |
| 25 * 4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER | |
| 26 */ | |
| 27 | |
| 28 void Gsm_Coder P8((S, s, LARc, Nc, bc, Mc, xmaxc, xMc), struct gsm_state *S, word * s, /* [0..159] samples IN */ | |
| 29 /* | |
| 30 * The RPE-LTD coder works on a frame by frame basis. The length of | |
| 31 * the frame is equal to 160 samples. Some computations are done | |
| 32 * once per frame to produce at the output of the coder the | |
| 33 * LARc[1..8] parameters which are the coded LAR coefficients and | |
| 34 * also to realize the inverse filtering operation for the entire | |
| 35 * frame (160 samples of signal d[0..159]). These parts produce at | |
| 36 * the output of the coder: | |
| 37 */ | |
| 38 word * LARc, /* [0..7] LAR coefficients OUT */ | |
| 39 /* | |
| 40 * Procedure 4.2.11 to 4.2.18 are to be executed four times per | |
| 41 * frame. That means once for each sub-segment RPE-LTP analysis of | |
| 42 * 40 samples. These parts produce at the output of the coder: | |
| 43 */ | |
| 44 word * Nc, /* [0..3] LTP lag OUT */ | |
| 45 word * bc, /* [0..3] coded LTP gain OUT */ | |
| 46 word * Mc, /* [0..3] RPE grid selection OUT */ | |
| 47 word * xmaxc, /* [0..3] Coded maximum amplitude OUT */ | |
| 48 word * xMc /* [13*4] normalized RPE samples OUT */ | |
| 49 ) | |
| 50 { | |
| 51 int k; | |
| 52 word *dp = S->dp0 + 120; /* [ -120...-1 ] */ | |
| 53 word *dpp = dp; /* [ 0...39 ] */ | |
| 54 | |
| 55 static word e[50] = { 0 }; | |
| 56 | |
| 57 word so[160]; | |
| 58 | |
| 59 Gsm_Preprocess(S, s, so); | |
| 60 Gsm_LPC_Analysis(S, so, LARc); | |
| 61 Gsm_Short_Term_Analysis_Filter(S, LARc, so); | |
| 62 | |
| 63 for (k = 0; k <= 3; k++, xMc += 13) { | |
| 64 | |
| 65 Gsm_Long_Term_Predictor(S, so + k * 40, /* d [0..39] IN */ | |
| 66 dp, /* dp [-120..-1] IN */ | |
| 67 e + 5, /* e [0..39] OUT */ | |
| 68 dpp, /* dpp [0..39] OUT */ | |
| 69 Nc++, bc++); | |
| 70 | |
| 71 Gsm_RPE_Encoding(S, e + 5, /* e ][0..39][ IN/OUT */ | |
| 72 xmaxc++, Mc++, xMc); | |
| 73 /* | |
| 74 * Gsm_Update_of_reconstructed_short_time_residual_signal | |
| 75 * ( dpp, e + 5, dp ); | |
| 76 */ | |
| 77 | |
| 78 { | |
| 79 register int i; | |
| 80 register longword ltmp; | |
| 81 for (i = 0; i <= 39; i++) | |
| 82 dp[i] = GSM_ADD(e[5 + i], dpp[i]); | |
| 83 } | |
| 84 dp += 40; | |
| 85 dpp += 40; | |
| 86 | |
| 87 } | |
| 88 (void) memcpy((char *) S->dp0, (char *) (S->dp0 + 160), | |
| 89 120 * sizeof(*S->dp0)); | |
| 90 } |
