www.pudn.com > CryptoPhone-src-031122.zip > con_adap.c
/* Copyright 2001,2002,2003 NAH6
* All Rights Reserved
*
* Parts Copyright DoD, Parts Copyright Starium
*
*/
/*LINTLIBRARY*/
/*PROTOLIB1*/
#include
#include
#include "main.h"
#include "delay.h"
#include "con_adap.h"
#define STRING_MATCH 0
/*************************************************************************
*
* ROUTINE
* ConstructAdaptCW
*
* FUNCTION
* Adaptive VQ (n-taps, where n = 0, ..., 3)
* "self-excited" or "vq" or "adaptive code book"
*
* SYNOPSIS
* ConstructAdaptCW(residual, ResLen, AdaptCB, AdaptCBLen,
* AdaptGain, AdaptDelay, Type)
* formal
*
* data I/O
* name type type function
* -------------------------------------------------------------------
* residual float i/o Data segement/Filtered data segment
* ResLen int i Dimension of residual
* AdaptCB float i Adaptive Codebook
* AdaptCBLen int i Dimension of Adaptive codebook
* AdaptDelay float i Adaptive codebook delay
* AdaptGain float i Adaptive codebook gain
* Type char i Type 'long' calls ldelay.f, the
* delay routine using long
* interpolation windows. Type 'short'
* calls delay.f, the short delay
* routine.
*==========================================================================
*
* USAGE
*
* Adaptive code book (pitch) synthesis routine:
*
* 1) For lags < frame size: gain-shape adaptive code book VQ
*
* 2) For lags => frame size this is equivalent to a pitch synthesis "filter"
*
* -[b(1)-1] -b(1) -[b(1)+1]
* H(z) = 1 / 1 + b(2) z + b(3) z + b(4) z
*
*==========================================================================
*
* REFERENCES
*
* Singhal & Atal, Improving Performance of Multi-Pulse LPC Coders at
* Low Bit Rates, ICASSP, 1984.
*
* Rose & Barnwell. The Self Excited Vocoder-An Alternate Approach
* to Toll Quality at 4800 bps, ICASSP, 1986, pp. 453-456.
*
* Kleijn, Krasinski and Ketchum, Improved Speech Quality and
* Efficient Vector Quantization in SELP, ICASSP, 1988.
*
***************************************************************************/
void ConstructAdaptCW(
float residual[RES_LEN],
int ResLen,
float AdaptCB[MAX_ABUF_LEN],
int AdaptCBLen,
float AdaptGain,
float AdaptDelay,
char *Type)
{
int k, start, m;
float frac;
int i;
float buf[MAX_A_LEN];
/* Initialize variables */
k = AdaptCBLen - ResLen;
start = k + 1;
m = (int)(AdaptDelay);
frac = AdaptDelay - m;
/* Update codebook */
for(i=0; i .0001) {
if (strcmp(Type, "long") == STRING_MATCH) { /* if they match */
delay(AdaptCB, AdaptCBLen, start, ResLen, frac, m, -20, 19, 5, buf);
}
else {
delay(AdaptCB, AdaptCBLen, start, ResLen, frac, m, -4, 3, 5, buf);
}
for(i=0; i