234 lines
7.1 KiB
C
234 lines
7.1 KiB
C
|
/*
|
||
|
|
||
|
$Log$
|
||
|
Revision 1.15 2004/06/26 03:50:14 markster
|
||
|
Merge source cleanups (bug #1911)
|
||
|
|
||
|
Revision 1.14 2003/02/12 13:59:14 matteo
|
||
|
mer feb 12 14:56:57 CET 2003
|
||
|
|
||
|
Revision 1.1.1.1 2003/02/12 13:59:14 matteo
|
||
|
mer feb 12 14:56:57 CET 2003
|
||
|
|
||
|
Revision 1.2 2000/01/05 08:20:39 markster
|
||
|
Some OSS fixes and a few lpc changes to make it actually work
|
||
|
|
||
|
* Revision 1.2 1996/08/20 20:20:24 jaf
|
||
|
* Removed all static local variables that were SAVE'd in the Fortran
|
||
|
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||
|
* argument.
|
||
|
*
|
||
|
* Revision 1.1 1996/08/19 22:40:31 jaf
|
||
|
* Initial revision
|
||
|
*
|
||
|
|
||
|
*/
|
||
|
|
||
|
/* -- translated by f2c (version 19951025).
|
||
|
You must link the resulting object file with the libraries:
|
||
|
-lf2c -lm (in that order)
|
||
|
*/
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
#include "f2c.h"
|
||
|
|
||
|
/* *********************************************************************** */
|
||
|
|
||
|
/* CHANL Version 49 */
|
||
|
|
||
|
/* $Log$
|
||
|
* Revision 1.15 2004/06/26 03:50:14 markster
|
||
|
* Merge source cleanups (bug #1911)
|
||
|
*
|
||
|
* Revision 1.14 2003/02/12 13:59:14 matteo
|
||
|
* mer feb 12 14:56:57 CET 2003
|
||
|
*
|
||
|
* Revision 1.1.1.1 2003/02/12 13:59:14 matteo
|
||
|
* mer feb 12 14:56:57 CET 2003
|
||
|
*
|
||
|
* Revision 1.2 2000/01/05 08:20:39 markster
|
||
|
* Some OSS fixes and a few lpc changes to make it actually work
|
||
|
*
|
||
|
* Revision 1.2 1996/08/20 20:20:24 jaf
|
||
|
* Removed all static local variables that were SAVE'd in the Fortran
|
||
|
* code, and put them in struct lpc10_encoder_state that is passed as an
|
||
|
* argument.
|
||
|
*
|
||
|
* Revision 1.1 1996/08/19 22:40:31 jaf
|
||
|
* Initial revision
|
||
|
* */
|
||
|
/* Revision 1.3 1996/03/21 15:14:57 jaf */
|
||
|
/* Added comments about which indices of argument arrays are read or */
|
||
|
/* written, and about the one bit of local state in CHANWR. CHANRD */
|
||
|
/* has no local state. */
|
||
|
|
||
|
/* Revision 1.2 1996/03/13 18:55:10 jaf */
|
||
|
/* Comments added explaining which of the local variables of this */
|
||
|
/* subroutine need to be saved from one invocation to the next, and which */
|
||
|
/* do not. */
|
||
|
|
||
|
/* Revision 1.1 1996/02/07 14:43:31 jaf */
|
||
|
/* Initial revision */
|
||
|
|
||
|
|
||
|
/* *********************************************************************** */
|
||
|
|
||
|
/* CHANWR: */
|
||
|
/* Place quantized parameters into bitstream */
|
||
|
|
||
|
/* Input: */
|
||
|
/* ORDER - Number of reflection coefficients (not really variable) */
|
||
|
/* IPITV - Quantized pitch/voicing parameter */
|
||
|
/* IRMS - Quantized energy parameter */
|
||
|
/* IRC - Quantized reflection coefficients */
|
||
|
/* Indices 1 through ORDER read. */
|
||
|
/* Output: */
|
||
|
/* IBITS - Serial bitstream */
|
||
|
/* Indices 1 through 54 written. */
|
||
|
/* Bit 54, the SYNC bit, alternates from one call to the next. */
|
||
|
|
||
|
/* Subroutine CHANWR maintains one bit of local state from one call to */
|
||
|
/* the next, in the variable ISYNC. I believe that this one bit is only */
|
||
|
/* intended to allow a receiver to resynchronize its interpretation of */
|
||
|
/* the bit stream, by looking for which of the 54 bits alternates every */
|
||
|
/* frame time. This is just a simple framing mechanism that is not */
|
||
|
/* useful when other, higher overhead framing mechanisms are used to */
|
||
|
/* transmit the coded frames. */
|
||
|
|
||
|
/* I'm not going to make an entry to reinitialize this bit, since it */
|
||
|
/* doesn't help a receiver much to know whether the first sync bit is a 0 */
|
||
|
/* or a 1. It needs to examine several frames in sequence to have */
|
||
|
/* reasonably good assurance that its framing is correct. */
|
||
|
|
||
|
|
||
|
/* CHANRD: */
|
||
|
/* Reconstruct parameters from bitstream */
|
||
|
|
||
|
/* Input: */
|
||
|
/* ORDER - Number of reflection coefficients (not really variable) */
|
||
|
/* IBITS - Serial bitstream */
|
||
|
/* Indices 1 through 53 read (SYNC bit is ignored). */
|
||
|
/* Output: */
|
||
|
/* IPITV - Quantized pitch/voicing parameter */
|
||
|
/* IRMS - Quantized energy parameter */
|
||
|
/* IRC - Quantized reflection coefficients */
|
||
|
/* Indices 1 through ORDER written */
|
||
|
|
||
|
/* Entry CHANRD has no local state. */
|
||
|
|
||
|
|
||
|
|
||
|
/* IBITS is 54 bits of LPC data ordered as follows: */
|
||
|
/* R1-0, R2-0, R3-0, P-0, A-0, */
|
||
|
/* R1-1, R2-1, R3-1, P-1, A-1, */
|
||
|
/* R1-2, R4-0, R3-2, A-2, P-2, R4-1, */
|
||
|
/* R1-3, R2-2, R3-3, R4-2, A-3, */
|
||
|
/* R1-4, R2-3, R3-4, R4-3, A-4, */
|
||
|
/* P-3, R2-4, R7-0, R8-0, P-4, R4-4, */
|
||
|
/* R5-0, R6-0, R7-1,R10-0, R8-1, */
|
||
|
/* R5-1, R6-1, R7-2, R9-0, P-5, */
|
||
|
/* R5-2, R6-2,R10-1, R8-2, P-6, R9-1, */
|
||
|
/* R5-3, R6-3, R7-3, R9-2, R8-3, SYNC */
|
||
|
/* Subroutine */ int chanwr_0_(int n__, integer *order, integer *ipitv,
|
||
|
integer *irms, integer *irc, integer *ibits,
|
||
|
struct lpc10_encoder_state *st)
|
||
|
{
|
||
|
/* Initialized data */
|
||
|
|
||
|
integer *isync;
|
||
|
static integer bit[10] = { 2,4,8,8,8,8,16,16,16,16 };
|
||
|
static integer iblist[53] = { 13,12,11,1,2,13,12,11,1,2,13,10,11,2,1,10,
|
||
|
13,12,11,10,2,13,12,11,10,2,1,12,7,6,1,10,9,8,7,4,6,9,8,7,5,1,9,8,
|
||
|
4,6,1,5,9,8,7,5,6 };
|
||
|
|
||
|
/* System generated locals */
|
||
|
integer i__1;
|
||
|
|
||
|
/* Local variables */
|
||
|
integer itab[13], i__;
|
||
|
|
||
|
/* Arguments */
|
||
|
/* Parameters/constants */
|
||
|
/* These arrays are not Fortran PARAMETER's, but they are defined */
|
||
|
/* by DATA statements below, and their contents are never altered.
|
||
|
*/
|
||
|
/* Local variables that need not be saved */
|
||
|
/* Local state */
|
||
|
/* ISYNC is only used by CHANWR, not by ENTRY CHANRD. */
|
||
|
|
||
|
/* Parameter adjustments */
|
||
|
--irc;
|
||
|
--ibits;
|
||
|
|
||
|
/* Function Body */
|
||
|
switch(n__) {
|
||
|
case 1: goto L_chanrd;
|
||
|
}
|
||
|
|
||
|
isync = &(st->isync);
|
||
|
|
||
|
/* ***********************************************************************
|
||
|
*/
|
||
|
/* Place quantized parameters into bitstream */
|
||
|
/* ***********************************************************************
|
||
|
*/
|
||
|
/* Place parameters into ITAB */
|
||
|
itab[0] = *ipitv;
|
||
|
itab[1] = *irms;
|
||
|
itab[2] = 0;
|
||
|
i__1 = *order;
|
||
|
for (i__ = 1; i__ <= i__1; ++i__) {
|
||
|
itab[i__ + 2] = irc[*order + 1 - i__] & 32767;
|
||
|
}
|
||
|
/* Put 54 bits into IBITS array */
|
||
|
for (i__ = 1; i__ <= 53; ++i__) {
|
||
|
ibits[i__] = itab[iblist[i__ - 1] - 1] & 1;
|
||
|
itab[iblist[i__ - 1] - 1] /= 2;
|
||
|
}
|
||
|
ibits[54] = *isync & 1;
|
||
|
*isync = 1 - *isync;
|
||
|
return 0;
|
||
|
/* ***********************************************************************
|
||
|
*/
|
||
|
/* Reconstruct parameters from bitstream */
|
||
|
/* ***********************************************************************
|
||
|
*/
|
||
|
|
||
|
L_chanrd:
|
||
|
/* Reconstruct ITAB */
|
||
|
for (i__ = 1; i__ <= 13; ++i__) {
|
||
|
itab[i__ - 1] = 0;
|
||
|
}
|
||
|
for (i__ = 1; i__ <= 53; ++i__) {
|
||
|
itab[iblist[54 - i__ - 1] - 1] = (itab[iblist[54 - i__ - 1] - 1] << 1)
|
||
|
+ ibits[54 - i__];
|
||
|
}
|
||
|
/* Sign extend RC's */
|
||
|
i__1 = *order;
|
||
|
for (i__ = 1; i__ <= i__1; ++i__) {
|
||
|
if ((itab[i__ + 2] & bit[i__ - 1]) != 0) {
|
||
|
itab[i__ + 2] -= bit[i__ - 1] << 1;
|
||
|
}
|
||
|
}
|
||
|
/* Restore variables */
|
||
|
*ipitv = itab[0];
|
||
|
*irms = itab[1];
|
||
|
i__1 = *order;
|
||
|
for (i__ = 1; i__ <= i__1; ++i__) {
|
||
|
irc[i__] = itab[*order + 4 - i__ - 1];
|
||
|
}
|
||
|
return 0;
|
||
|
} /* chanwr_ */
|
||
|
|
||
|
/* Subroutine */ int chanwr_(integer *order, integer *ipitv, integer *irms,
|
||
|
integer *irc, integer *ibits, struct lpc10_encoder_state *st)
|
||
|
{
|
||
|
return chanwr_0_(0, order, ipitv, irms, irc, ibits, st);
|
||
|
}
|
||
|
|
||
|
/* Subroutine */ int chanrd_(integer *order, integer *ipitv, integer *irms,
|
||
|
integer *irc, integer *ibits)
|
||
|
{
|
||
|
return chanwr_0_(1, order, ipitv, irms, irc, ibits, NULL);
|
||
|
}
|