Mercurial > hg > audiostuff
diff intercom/gsm/rpeltp.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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/intercom/gsm/rpeltp.c Fri Jun 25 09:57:52 2010 +0200 @@ -0,0 +1,282 @@ +/* v1.0 - 12/Apr/1994 + ============================================================================= + + U U GGG SSSS TTTTT + U U G S T + U U G GG SSSS T + U U G G S T + UUU GG SSS T + + ======================================== + ITU-T - USER'S GROUP ON SOFTWARE TOOLS + ======================================== + +MODULE: RPELTP.C - GSM 06.10 RPE-LTP SPEECH ENCODING ALGORITHM + +ORIGINAL BY: + + The driving routines of this module were written by: + Simao Ferraz de Campos Neto + DDS/Pr11 Tel: +55-192-39-6637 + CPqD/Telebras Fax: +55-192-39-6125 + 13088-061 Campinas SP Brazil E-mail: <simao@cpqd.ansp.br> + + The true implementation was done by + Jutta Deneger (jutta@cs.tu-berlin.de) + Carsten Borman (cabo@cs.tu-berlin.de) + Communications and Operating Systems Research Group (KBS) + Technishe Universitaet Berlin + + The portability changes on the code and rearrangement were done by <simao> + +DATE: 12/Apr/1994: 18H00 -3H00GMT + +RELEASE: 1.00 + +PROTOTYPES: see rpeltp.h for driving-routine prototypes, gsm.h for + general prototypes, and private.h for special definitions. + +OBSERVATION: + Copyright note by the original authors: + " Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + Universitaet Berlin. See the accompanying file "COPYRIGHT" for + details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE." + +FUNCTIONS: (Only UGST user-level functions!) + +rpeltp_init() ......... Initializes the state variable for the encoding or + the decoding algorithm. Each need a separate state + variable!!! + +rpeltp_delete ......... Delete the state variable allocation, etc (an alias). + +rpeltp_encode ......... Entry-level function for the encoding algorithm. + +rpeltp_decode ......... Entry-level function for the decoding algorithm. + +============================================================================ +*/ +#include <stdio.h> /* For NULL */ +#include "private.h" +#include "gsm.h" +#include "rpeltp.h" + +/* *** Alias functions *** */ +/* + ------------------------------------------------------------------------ + void rpeltp_delete(gsm_state *st); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + Frees memory of a state variable previously initialized by a call to + rpeltp_init(). This is an alias to the function gsm_destroy() implemented + by the original authors of the module. + + Variables: + ~~~~~~~~~~ + A pointer to a valid encoder or decoder state variable. + + Return value: + ~~~~~~~~~~~~~ + None. + + Prototype: in gsm.h + ~~~~~~~~~~ + + Original author: + ~~~~~~~~~~~~~~~~ + Simao Ferraz de Campos Neto + DDS/Pr11 Tel: +55-192-39-6637 + CPqD/Telebras Fax: +55-192-39-6125 + 13088-061 Campinas SP Brazil E-mail: <simao@cpqd.ansp.br> + + Log of changes: + ~~~~~~~~~~~~~~~ + 12.Apr.94 v.1.0 created. + + ------------------------------------------------------------------------ +*/ +/* #define rpeltp_delete gsm_destroy / * This is already done in rpeltp.h !!! */ +/* ................... End of rpeltp_delete() ......................... */ + + +/* *** True functions *** */ + +/* + ------------------------------------------------------------------------ + gsm_state *rpeltp_init(void); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Description: + ~~~~~~~~~~~~ + Allocates memory for the state variable of the encoder or the decoder, + and resets flags to proper initial values. This includes processing + strictly according to the Rec. GSM 06.10. + + In a encoder plus decoder calling program there must exist different + state variables for the encoder and for the decoder. + + Variables: + ~~~~~~~~~~ + None. + + Return value: + ~~~~~~~~~~~~~ + Returns a pointer to a valid encoder or decoder state variable. On + failure, returns NULL. + + Prototype: in rpeltp.h + ~~~~~~~~~~ + + Original author: + ~~~~~~~~~~~~~~~~ + Simao Ferraz de Campos Neto + DDS/Pr11 Tel: +55-192-39-6637 + CPqD/Telebras Fax: +55-192-39-6125 + 13088-061 Campinas SP Brazil E-mail: <simao@cpqd.ansp.br> + + Log of changes: + ~~~~~~~~~~~~~~~ + 12.Apr.94 v.1.0 created. + + ------------------------------------------------------------------------ +*/ +gsm rpeltp_init() +{ + gsm rpe_state; + int gsm_compliant = 0; + + /* Initializa state variable */ + if (!(rpe_state = gsm_create())) + return ((gsm) (NULL)); + + /* The gsm_{en,de}code() routines may operate on a compliant mode, or + * in a non-compliant, faster mode - here we use the complyant one */ + (void) gsm_option(rpe_state, GSM_OPT_FAST, &gsm_compliant); + + return (rpe_state); +} + +/* ................... End of rpeltp_init() ......................... */ + + +/* + ------------------------------------------------------------------------ + void gsm_state *rpeltp_encode (gsm_state *rpe_state, short *inp_buf, + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short *rpe_frame); + + + Description: + ~~~~~~~~~~~~ + Process the input buffer inp_buf with left-aligned 16-bit linear-format, + 2-complement samples using 13-bit resolution, i.e., the lower 3 bits of + each input sample are ignored. + + The rpe-ltp frame buffer rpe_frame is word-oriented (16-bit samples), + right-aligned i.e., the lower bits are the most significatives. + They follow the sequence specified by the `parameter number' in + Table 1.1 of the Rec.GSM-06.10. + + The input buffer has always 160 samples, and the generated frame has + always 76 samples. + + Variables: + ~~~~~~~~~~ + rpe_state ... state variable initialized by a previous call to rpeltp_init() + inp_buf ..... pointer to a buffer with 160 16-bit, left aligned samples + rpe_frame ... pointer to a rpe-ltp encoded frame buffer. Has length of 76. + The samples are 16-bit, right-aligned. + + Return value: + ~~~~~~~~~~~~~ + None. + + Prototype: in rpeltp.h + ~~~~~~~~~~ + + Original author: + ~~~~~~~~~~~~~~~~ + Simao Ferraz de Campos Neto + DDS/Pr11 Tel: +55-192-39-6637 + CPqD/Telebras Fax: +55-192-39-6125 + 13088-061 Campinas SP Brazil E-mail: <simao@cpqd.ansp.br> + + Log of changes: + ~~~~~~~~~~~~~~~ + 12.Apr.94 v.1.0 created. + + ------------------------------------------------------------------------ +*/ +void rpeltp_encode(rpe_state, inp_buf, rpe_frame) +gsm rpe_state; +short *inp_buf, *rpe_frame; +{ + gsm_frame rpe_packed_frame; + + /* Run both and save decoded samples */ + gsm_encode(rpe_state, inp_buf, rpe_packed_frame); + gsm_explode(rpe_state, rpe_packed_frame, rpe_frame); +} + +/* ................... End of rpeltp_encode() ......................... */ + + +/* + ------------------------------------------------------------------------ + void gsm_state *rpeltp_decode (gsm_state *rpe_state, short *rpe_frame, + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ short *out_buf); + + + Description: + ~~~~~~~~~~~~ + Decode the input rpe-ltp encoded frame buffer rpe_buf with 76 righ-aligned + 16-bit samples, generating 160 decoded 16-bit, left-aligned linear + 2's-complement samples with 13-bit resolution, i.e., the lower 3 bits of + each input sample are zeroed. These are saved in out_buf. + + The rpe-ltp frame buffer rpe_frame sample has the sequence specified by + the `parameter number' in Table 1.1 of the Rec.GSM-06.10. + + Variables: + ~~~~~~~~~~ + rpe_state ... state variable initialized by a previous call to rpeltp_init() + rpe_frame ... pointer to a rpe-ltp encoded frame buffer. Has length of 76. + The samples are 16-bit, right-aligned. + out_buf ..... pointer to the decode sample's buffer with 160 16-bit, + left aligned samples + + Return value: + ~~~~~~~~~~~~~ + None. + + Prototype: in rpeltp.h + ~~~~~~~~~~ + + Original author: + ~~~~~~~~~~~~~~~~ + Simao Ferraz de Campos Neto + DDS/Pr11 Tel: +55-192-39-6637 + CPqD/Telebras Fax: +55-192-39-6125 + 13088-061 Campinas SP Brazil E-mail: <simao@cpqd.ansp.br> + + Log of changes: + ~~~~~~~~~~~~~~~ + 12.Apr.94 v.1.0 created. + + ------------------------------------------------------------------------ +*/ +void rpeltp_decode(rpe_state, rpe_frame, out_buf) +gsm rpe_state; +short *out_buf, *rpe_frame; +{ + gsm_frame rpe_packed_frame; + + /* Pack frame, run only the decoder and save the decoded samples */ + gsm_implode(rpe_state, rpe_frame, rpe_packed_frame); + gsm_decode(rpe_state, rpe_packed_frame, out_buf); +} + +/* ................... End of rpeltp_decode() ......................... */ + +/* -------------------------- END OF RPELTP.C ------------------------ */