You are on page 1of 5

% MATLAB SIMULATION OF FS-1015 LPC-10e % COPYRIGHT (C) 1996-99 ANDREAS SPANIAS and TED PAINTER % % % % % % % % % % % This Copyright applies

only to this particular MATLAB implementation of the LPC-10e coder. The MATLAB software is intended only for educational purposes. No other use is intended or authorized. This is not a public domain program and unauthorized distribution to individuals or networks is prohibited. Be aware that use of the standard in any form is goverened by rules of the US DoD. This program is free software. It is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. There is no commitment or even implied commitment on behalf of Andreas Spanias or Ted Painter for maintenance or support of this code.

% MATLAB is trademark of The Mathworks Inc % ALL DERIVATIVE WORKS MUST INCLUDE THIS COPYRIGHT NOTICE. % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ****************************************************************** DECODE PORTED TO MATLAB FROM LPC-55 C RELEASE 3-30-94 ****************************************************************** DESCRIPTION Apply decoding and error correction to all received LPC parameters. Generate real-valued parameters to drive LPC synthesizer. DESIGN NOTES Pitch and voicing parameters are decoded first. If error correction is not active, the two half-frame voicing decisions are set to 1 to indicate a sustained voicing condition. Details of the pitch and voicing decode algorithms are described in the Version 52 release notes. Following pitch and voicing decoding, reflection coefficients 1-10 are smoothed and decoded. Pitch is also smoothed in some cases. Finally, RMS and RCs are converted back to real (floating point) values for use in the LPC synthesizer. See Also: Version 52 release notes VARIABLES INPUTS ipitv irms irc pitch OUTPUTS voice pitch Received pitch value, quantized and encoded Received RMS energy, quantized and encoded Received reflection coefficients, quantized and encoded Place holder for decoded output pitch Decoded voicing Decoded pitch table index

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %

rms rc GLOBALS drc dpit drms ivp2h erate iovoic first

Decoded RMS energy Decoded reflection coefficients Matrix of past, present, and future frame RCs Vector of past, present, and future frame pitch values Vector of past, present, and future frame RMS values Voicing condition of previous second half frame Measured bit error rate 2-bit voicing condition code for present frame Flag set only for first frame of data LPC predictor order Index of future frame (drc, etc.) Index of present frame (drc, etc.) Index of past frame (drc, etc.) 2-bit voicing condition code for future frame Average pitch value Flag bits, used to direct flow of subroutine Index variable for table lookup purposes Hamming 8,4 decoder output bits Pitch indicator Row address of smoothing threshold table CORTH Variable holding least significant bit Number of errors detected in error-protected frame Very high error rate threshold (approx 5%) Low error rate threshold (approx 0.1%) Medium error rate threshold (approx 1%) High error rate threshold (approx 2%) Integer temporary variables

CONSTANTS ORDER INTERNAL fut pres past ivoic iavgp icorf index iout ipit ixcor lsb errcnt ethrs ethrs1 ethrs2 ethrs3 i,i1,i2, i4 TABLES ivtab corth detau detab7 descl deadd qb nbit zrc abit rmst -

All logical flow information for this routine (ICORF) Smoothing threshold table, one row per error rate class Pitch decoding table Table for inverse LAR decoding of RC1 and RC2 Table of scale factors for each of the last eight RCs Table of biases of the probability density functions for each of the last eight RCs Quantization bias table of last eight RCs Number of bits in each of the RCs Zero-forcing table for RC5 through RC10 Bit position pointers Energy decoding table

******************************************************************

function [ voice, pitch, rms, rc ] = decode( ipitv, irms, irc, pitch ) % DECLARE GLOBAL TABLES global ivtab corth detau detab7 descl deadd qb nbit zrc abit rmst; % DECLARE GLOBAL VARIABLES global drc dpit drms ivp2h erate iovoic first; % DECLARE GLOBAL CONSTANTS

global ORDER; % INIT LOCAL VARIABLES fut = 1; pres = 2; past = 3; iavgp = 60; ethrs = 2048; ethrs1 = 128; ethrs2 = 1024; ethrs3 = 2048; voice = zeros(2,1); % IF NO ERROR CORRECTION, DO PITCH AND VOICING THEN JUMP TO DECODE i4 = detau(ipitv+1); % DO ERROR CORRECTION PITCH AND VOICING if i4 > 4 dpit(fut) = i4; ivoic = 2; iavgp = fix( ((15*iavgp)+i4+8) * 0.0625 ); else ivoic = i4; dpit(fut) = iavgp; end drms(fut) = irms; drc(fut,1:ORDER) = irc(1:ORDER)'; % DETERMINE INDEX TO IVTAB FROM U/UV DECISION. IF ERROR RATE IS HIGH % USE ALTERNATE TABLE index = (16*ivp2h) + (4*iovoic) + ivoic + 1; i1 = ivtab(index); ipit = rem(i1,4); icorf = fix(i1*0.125); if erate < ethrs icorf = fix(icorf*0.015625); end % DETERMINE ERROR RATE: 4 = HIGH, 1 = LOW ixcor = 4; if erate < ethrs3 ixcor = 3; end if erate < ethrs2 ixcor = 2; end if erate < ethrs1 ixcor = 1; end % VOICE/UNVOICE DECISION DETERMINED FROM BITS 0 AND 1 OF IVTAB voice(1) = rem(fix(icorf*0.5),2); voice(2) = rem(icorf,2); if first == 1 % SKIP DECODING ON FIRST FRAME BECAUSE PRESENT DATA NOT YET AVAILABLE first = 0; else

% IF BIT 4 OF ICORF IS SET THEN CORRECT RMS AND RC1 - RC4. % DETERMINE ERROR RATE AND CORRECT ERRORS USING A HAMMING % 8,4 CODE DURING TRANSITION OR UNVOICED FRAMES. IF IOUT % IS NEGATIVE, MORE THAN 1 ERROR OCCURRED, USE PREVIOUS % FRAME'S PARAMETERS. if rem(icorf,32)-rem(icorf,16) ~= 0 errcnt = 0; lsb = rem(drms(pres),2); index = fix( (drc(pres,8)*16)+(drms(pres)*0.5) ); [ iout, errcnt ] = ham84( index, errcnt ); drms(pres) = drms(past); if iout >= 0 drms(pres) = (iout*2) + lsb; end for i = 1:4 if i == 1 i1 = ( 2 * bitand(drc(pres,9),7) ) + bitand(drc(pres,10),1); else i1 = bitand(drc(pres,9-i),15); end i2 = bitand(drc(pres,5-i),31); lsb = bitand(i2,1); index = fix((16*i1)+(i2*0.5)); [ iout, errcnt ] = ham84( index, errcnt ); if iout >= 0 iout = (iout*2) + lsb; if bitand(iout,16) == 16 iout = iout - 32; end else iout = drc(past,5-i); end drc(pres,5-i) = iout; end % DETERMINE ERROR RATE erate = (erate*0.96875) + (errcnt*102); end % GET UNSMOOTHED RMS, RC'S AND PITCH irms = drms(pres); irc(1:ORDER) = drc(pres,1:ORDER)'; if ipit == 1 dpit(pres) = dpit(past); end if ipit == 3 dpit(pres) = dpit(fut); end pitch = dpit(pres); % IF BIT 2 OF ICORF IS SET THEN SMOOTH RMS AND RC'S if rem(icorf,8)-rem(icorf,4) ~= 0 if (abs(drms(pres)-drms(fut)) >= corth(ixcor,2)) & ... (abs(drms(pres)-drms(past)) >= corth(ixcor,2)) irms = median([drms(past),drms(pres),drms(fut)]); end for i=1:6 if (abs(drc(pres,i)-drc(fut,i)) >= corth(ixcor,i+2)) & ... (abs(drc(pres,i)-drc(past,i)) >= corth(ixcor,i+2)) irc(i) = median([drc(past,i),drc(pres,i),drc(fut,i)]);

end end end % IF BIT 3 OF ICORF IS SET THEN SMOOTH PITCH if rem(icorf,16)-rem(icorf,8) ~= 0 if (abs(dpit(pres)-dpit(fut)) >= corth(ixcor,1)) & ... (abs(dpit(pres)-dpit(past)) >= corth(ixcor,1)) pitch = median([dpit(past),dpit(pres),dpit(fut)]); end end end % IF BIT 5 OF ICORF IS SET THEN RC5 - RC10 ARE LOADED WITH % VALUES SO THAT AFTER QUANTIZATION BIAS IS REMOVED IN DECODE % THE VALUES WILL BE ZERO if rem(icorf,64)-rem(icorf,32) ~= 0 irc(5:ORDER) = zrc(5:ORDER); end % ONE FRAME DELAY iovoic = ivoic; ivp2h = voice(2); dpit(past) = dpit(pres); dpit(pres) = dpit(fut); drms(past) = drms(pres); drms(pres) = drms(fut); drc(past,1:ORDER) = drc(pres,1:ORDER); drc(pres,1:ORDER) = drc(fut,1:ORDER); % DECODE RMS irms = rmst( ((31-irms)*2) + 1 ); % DECODE RC1 AND RC2 FROM LOG-AREA-RATIOS, PROTECT FROM ILLEGAL % CODED VALUE (-16) CAUSED BY BIT ERRORS i2 = irc(1:2); i1 = sign((2.*sign(i2))+1); i2 = abs(i2); fi = find(i2>15); i2(fi) = zeros(length(fi),1); i2 = detab7( (2 .* i2) + 1 ); i2 = i2 .* i1; irc(1:2) = i2 .* ( 2 .^ (15-nbit(1:2)) ); % DECODE RC3 - RC10 TO SIGN PLUS 14-BITS i2 = irc(3:ORDER); i2 = i2 .* ( 2 .^ (15-nbit(3:ORDER)) ); i2 = i2 + qb(1:ORDER-2); irc(3:ORDER) = fix( ( i2 .* descl(1:ORDER-2) ) + deadd(1:ORDER-2) ); % SCALE RMS AND RC'S TO REALS rms = irms; rc = irc .* (6.103515625e-5);

You might also like