FreeCalypso > hg > gsmhr-codec-ref
diff host.c @ 0:9008dbc8ca74
import original C code from GSM 06.06
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 14 Jun 2024 23:27:16 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/host.c Fri Jun 14 23:27:16 2024 +0000 @@ -0,0 +1,347 @@ +/*************************************************************************** + * + * File Name: host.c + * + * Purpose: Contains functions for file I/O and formatting, no signal + * processing. + * + * The functions in this file are listed below. All are level 2 + * fuctions, where level 0 is main(), except for fillBitAlloc() which + * is level 3. The two "Interface" routines perform truncation of the + * three least significant bits of the 16 bit linear input. The others + * are simply file I/O functions and data reformatters. + * + * fillBitAlloc() + * hostEncoderInterface() + * readDecfile() + * speechDecoderHostInterface() + * writeEncfile() + * + **************************************************************************/ + +/*_________________________________________________________________________ + | | + | Include Files | + |_________________________________________________________________________| +*/ + +#include <stdio.h> +#include "typedefs.h" + +/*************************************************************************** + * + * FUNCTION NAME: fillBitAlloc + * + * PURPOSE: + * + * Arrange speech parameters for encoder output + * + * INPUTS: + * + * The speechcoders codewords: + * iR0 - Frame energy + * piVqIndeces[0:2] - LPC vector quantizer codewords + * iSoftInterp - Soft interpolation bit 1 or 0 + * iVoicing - voicing mode 0,1,2,3 + * piLags[0:3] - Frame and delta lag codewords + * piCodeWrdsA[0:3] - VSELP codevector 1 + * piCodeWrdsB[0:3] - VSELP codevector 2 (n/a for voiced modes) + * piGsp0s[0:3] - GSP0 codewords + * swVadFlag - voice activity detection flag + * swSP - Speech flag + * + * OUTPUTS: + * + * pswBAlloc[0:20] - an array into which the coded data is moved + * + * RETURN VALUE: + * + * none + * + * REFERENCES: Sub-clause 2.1 and 4.1.12 of GSM Recomendation 06.20 + * + **************************************************************************/ + +void fillBitAlloc(int iVoicing, int iR0, int *piVqIndeces, + int iSoftInterp, int *piLags, + int *piCodeWrdsA, int *piCodeWrdsB, + int *piGsp0s, Shortword swVadFlag, + Shortword swSP, Shortword *pswBAlloc) +{ + +/*_________________________________________________________________________ + | | + | Automatic Variables | + |_________________________________________________________________________| +*/ + + int i; + Shortword *pswNxt; + +/*_________________________________________________________________________ + | | + | Executable Code | + |_________________________________________________________________________| +*/ + + pswNxt = pswBAlloc; + *pswNxt++ = iR0; + for (i = 0; i < 3; i++) + *pswNxt++ = *piVqIndeces++; + *pswNxt++ = iSoftInterp; + *pswNxt++ = iVoicing; + + /* check voicing mode */ + if (iVoicing) + { + /* voiced mode */ + for (i = 0; i < N_SUB; i++) + { + *pswNxt++ = *piLags++; + *pswNxt++ = *piCodeWrdsA++; + *pswNxt++ = *piGsp0s++; + } + } + else + { /* unvoiced frame */ + for (i = 0; i < N_SUB; i++) + { + *pswNxt++ = *piCodeWrdsA++; + *pswNxt++ = *piCodeWrdsB++; + *pswNxt++ = *piGsp0s++; + } + } + *pswNxt++ = swVadFlag; + *pswNxt++ = swSP; +} + +/*************************************************************************** + * + * FUNCTION NAME: hostEncoderInterface + * + * PURPOSE: + * + * Read in speech data from a file. Zero the least significant 3 bits. + * + * + * INPUTS: + * + * pfileInSpeech + * FILE pointer to the binary input file + * + * iNumToRead + * Number of samples to read from the file, typically + * 160 (20 ms of speech). + * + * + * OUTPUTS: + * + * pswSamplesRead[] + * The speech samples read in from the file. + * + * + * RETURN VALUE: + * + * iNumRead + * The number of samples actually read. + * + * IMPLEMENTATION: + * + * The input speech file should be in "native" format. This means that + * the file is to be read (by this program) and written (by another + * program) as short ints (not chars). + * + * If not enough samples are available in the file, the number actually + * read is returned. If the read fails to fill the requested iNumToRead + * samples, then the rest are zeroed. + * + * In all cases the least significant 3 bits of all speech samples are + * zeroed. + * + * REFERENCES: Sub-clause 4.1 of GSM Recomendation 06.20 + * + * KEYWORDS: read, read speech, get speech data + * + **************************************************************************/ + +int hostEncoderInterface(FILE *pfileInSpeech, int iNumToRead, + Shortword pswSamplesRead[]) +{ + +/*_________________________________________________________________________ + | | + | Automatic Variables | + |_________________________________________________________________________| +*/ + int iNumRead, + i; + +/*_________________________________________________________________________ + | | + | Executable Code | + |_________________________________________________________________________| +*/ + + iNumRead = fread((char *) pswSamplesRead, sizeof (Shortword), + iNumToRead, pfileInSpeech); + + /* Delete the 3 LSB's - 13 bit speech input */ + /*------------------------------------------*/ + + for (i = 0; i < iNumRead; i++) + { + pswSamplesRead[i] &= 0xfff8; + } + + + /* Fill out the iNumToRead buffer with zeroes */ + /*--------------------------------------------*/ + + if (iNumRead != iNumToRead) + { + for (i = iNumRead; i < iNumToRead; i++) + { + pswSamplesRead[i] = 0; + } + } + return (iNumRead); +} + +/*************************************************************************** + * + * FUNCTION NAME: readDecfile + * + * PURPOSE: + * Reads decoder parameter input file + * + * INPUT: + * infile decoder parameter input file. + * + * OUTPUT: + * pswSpeechPara array of received 16-bit values + * + * RETURN: + * 0 successfully read a complete frame of data + * + * REFERENCES: Sub-clause 4.2 of GSM Recomendation 06.20 + * + * KEYWORDS: pswSpeechPara + * + **************************************************************************/ + +int readDecfile(FILE *infile, Shortword pswSpeechPara[]) +{ + if (fread((char *) pswSpeechPara, sizeof (Shortword), 22, infile) == 0) + return (1); + else + return (0); +} + +/*************************************************************************** + * + * FUNCTION NAME: speechDecoderHostInterface + * + * PURPOSE: + * The purpose of this function is to truncate the linear pcm and write + * it into the output file + * + * INPUTS: + * + * F_LEN + * + * 160 = linear pcm output frame size + * + * pswDecodedSpeechFrame[0:F_LEN-1] + * + * 16 bit linear pcm + * + * OUTPUTS: + * + * fpfileSpeechOut + * + * 13 bit linear pcm stored to file given by this pointer + * + * RETURN VALUE: + * + * none + * + * IMPLEMENTATION: + * + * REFERENCES: Sub-clause 4.2 of GSM Recomendation 06.20 + * + * KEYWORDS: synthesis, speechdecoder, decoding, truncation + * + **************************************************************************/ + +void speechDecoderHostInterface(Shortword pswDecodedSpeechFrame[], + FILE *fpfileSpeechOut) +{ + +/*_________________________________________________________________________ + | | + | Local Constants | + |_________________________________________________________________________| +*/ + +#define PCM_MASK 0xfff8 /* 16 to 13 bit linear PCM mask */ + +/*_________________________________________________________________________ + | | + | Automatic Variables | + |_________________________________________________________________________| +*/ + + short int i; + +/*_________________________________________________________________________ + | | + | Executable Code | + |_________________________________________________________________________| +*/ + + /* truncate the 16 bit linear pcm to 13 bits */ + /* ----------------------------------------- */ + + for (i = 0; i < F_LEN; i++) + { + pswDecodedSpeechFrame[i] = pswDecodedSpeechFrame[i] & PCM_MASK; + } + + /* F_LEN samples of linear pcm to output file */ + /* ------------------------------------------ */ + + fwrite((char *) pswDecodedSpeechFrame, sizeof (Shortword), + F_LEN, fpfileSpeechOut); +} + +/*************************************************************************** + * + * FUNCTION NAME: writeEncfile + * + * PURPOSE: + * Writes encoded parameters to ouput file + * + * INPUT: + * pswSpeechPara array of encoded parameter words. + * + * OUTPUT: + * fpfileEnc 16-bit encoded values. + * + * RETURN: + * i number of bytes written + * + * REFERENCES: Sub-clause 4.1 of GSM Recomendation 06.20 + * + * KEYWORDS: pswSpeechPara, fpfileEnc + * + ************************************************************************** +*/ + +int writeEncfile(Shortword pswSpeechPara[], FILE *fpfileEnc) +{ + int i; + + i = fwrite((char *) pswSpeechPara, sizeof (Shortword), 20, fpfileEnc); + + return (i); +}