decode.f

来自「是个是LPC源代码」· F 代码 · 共 286 行

F
286
字号
********************************************************************	DECODE Version 54*********************************************************************   This subroutine provides error correction and decoding*   for all LPC parameters** INPUTS:*  IPITV  - Index value of pitch*  IRMS   - Coded Energy*  IRC    - Coded Reflection Coefficients*  CORRP  - Error correction:*    If FALSE, parameters are decoded directly with no delay.  If TRUE,*    most important parameter bits are protected by Hamming code and*    median smoothed.  This requires an additional frame of delay.* OUTPUTS:*  VOICE  - Half frame voicing decisions*  PITCH  - Decoded pitch*  RMS    - Energy*  RC     - Reflection coefficients**  NOTE: Zero RC's should be done more directly, but this would affect*   coded parameter printout.*	SUBROUTINE DECODE(IPITV, IRMS, IRC,     1               VOICE, PITCH, RMS, RC )	INCLUDE 'config.fh'	INCLUDE 'contrl.fh'	INTEGER IPITV, IRMS, IRC(MAXORD)	INTEGER VOICE(2), PITCH	REAL RMS, RC(ORDER)	LOGICAL FIRST	INTEGER IVP2H, IVOIC, IOVOIC	INTEGER I, J, I1, I2, I4, IAVGP, ICORF,INDEX, IOUT	INTEGER IPIT, IPTOLD, ISHIFT, IXCOR, LSB, MEDIAN	INTEGER ERRCNT, IVTAB(32), DETAU(128), BIT(5), NBIT(10)	INTEGER ERATE, ETHRS, ETHRS1, ETHRS2, ETHRS3	INTEGER QB(8), DEADD(8), DETAB7(32), RMST(64)	REAL DESCL(8), CORTH(4,8)	INTEGER FUT, PRES, PAST	PARAMETER( FUT=1, PRES=2, PAST=3 )	INTEGER DRC(3,MAXORD), ZRC(MAXORD), DPIT(3), DRMS(3)	DATA IVTAB/ 4*O'60600', 2*O'61610', O'61613', O'61610',     1    O'40400', 3*O'3030', O'40400', O'3430', O'3033',     1    O'3030', 2*O'60600', O'60433', O'60430', O'62621',     1    O'62431', O'62473', O'62471', 2*O'3030', O'17170',     1    O'7070', 2*O'3031', O'7073', O'7071' /	DATA CORTH/32767.,10.,5.,0., 32767.,8.,4.,0.,     1   32.,6.4,3.2,0., 32.,6.4,3.2,0., 32.,11.2,6.4,0.,     1   32.,11.2,6.4,0., 16.,5.6,3.2,0., 16.,5.6,3.2,0. /	DATA DETAU/ 0,0,0,3,0,3,3,31, 0,3,3,21,3,3,29,30,     1         0,3,3,20,3,25,27,26, 3,23,58,22,3,24,28,3,     1  	0,3,3,3,3,39,33,32, 3,37,35,36,3,38,34,3,     1         3,42,46,44,50,40,48,3, 54,3,56,3,52,3,3,1,     1  	0,3,3,108,3,78,100,104, 3,84,92,88,156,80,96,3,     1  	3,74,70,72,66,76,68,3, 62,3,60,3,64,3,3,1,     1  	3,116,132,112,148,152,3,3, 140,3,136,3,144,3,3,1,     1         124,120,128,3,3,3,3,1, 3,3,3,1,3,1,1,1/	DATA RMST/1024,936,856,784,718,656,600,550,     1  	502,460,420,384,352,328,294,270,     1  	246,226,206,188,172,158,144,132,     1  	120,110,102,92,84,78,70,64,     1  	60,54,50,46,42,38,34,32,     1  	30,26,24,22,20,18,17,16,     1  	15,14,13,12,11,10,9,8,     1  	7,6,5,4,3,2,1,0/	DATA DETAB7/4,11,18,25,32,39,46,53,60,66,72,77,82,87,92,96,101,     1  	104,108,111,114,115,117,119,121,122,123,124,125,126,     1  	127,127/	DATA DESCL /.6953,.6250,.5781,.5469,.5312,.5391,.4688,.3828/	DATA DEADD /1152,-2816,-1536,-3584,-1280,-2432,768,-1920/	DATA QB /511,511,1023,1023,1023,1023,2047,4095/	DATA NBIT /8,8,5,5,4,4,4,4,3,2/	DATA ETHRS,ETHRS1,ETHRS2,ETHRS3/O'4000',O'200',O'2000',O'4000'/	DATA ZRC /4*0,0,3,0,2,0,0/	DATA BIT /2,4,8,16,32/	DATA IAVGP/60/, IPTOLD/60/, FIRST/.TRUE./	IF(LISTL.GE.3) WRITE(FDEBUG,800) IPITV,IRMS,(IRC(J),J=1,ORDER)800	FORMAT(1X,' <<ERRCOR IN>>',T32,6X,I6,I5,T50,10I8)*  If no error correction, do pitch and voicing then jump to decode	I4 = DETAU(IPITV+1)	IF(.NOT.CORRP) THEN	   VOICE(1) = 1	   VOICE(2) = 1	   IF(IPITV.LE.1) VOICE(1) = 0	   IF((IPITV.EQ.0).OR.(IPITV.EQ.2)) VOICE(2) = 0	   PITCH = I4	   IF(PITCH.LE.4) PITCH = IPTOLD	   IF((VOICE(1).EQ.1).AND.(VOICE(2).EQ.1)) IPTOLD = PITCH	   IF(VOICE(1).NE.VOICE(2)) PITCH = IPTOLD	   GOTO 900	END IF*  Do error correction pitch and voicing	IF(I4.GT.4) THEN	   DPIT(FUT) = I4	   IVOIC = 2	   IAVGP = (15*IAVGP+I4+8)/16	ELSE	   IVOIC = I4	   DPIT(FUT) = IAVGP	END IF	DRMS(FUT) = IRMS	DO I = 1,ORDER	   DRC(FUT,I) = IRC(I)	END DO*  Determine index to IVTAB from V/UV decision*  If error rate is high then use alternate table	INDEX = 16*IVP2H + 4*IOVOIC + IVOIC + 1	I1 = IVTAB(INDEX)	IPIT = AND(I1,3)	ICORF = I1/8	IF(ERATE.LT.ETHRS) ICORF = ICORF/64*  Determine error rate:  4=high    1=low	IXCOR = 4	IF(ERATE.LT.ETHRS3) IXCOR = 3	IF(ERATE.LT.ETHRS2) IXCOR = 2	IF(ERATE.LT.ETHRS1) IXCOR = 1*  Voice/unvoice decision determined from bits 0 and 1 of IVTAB	VOICE(1) = AND(ICORF/2,1)	VOICE(2) = AND(ICORF,1)*  Skip decoding on first frame because present data not yet available	IF(FIRST) THEN	   FIRST = .FALSE.	   GO TO 500	END IF*  If bit 4 of ICORF is set then correct RMS and RC(1) - RC(4).*    Determine error rate and correct errors using a Hamming 8,4 code*    during transition or unvoiced frame.  If IOUT is negative,*    more than 1 error occurred, use previous frame's parameters.	IF(AND(ICORF,BIT(4)).NE.0) THEN	   ERRCNT = 0	   LSB = AND(DRMS(PRES),1)	   INDEX = DRC(PRES,8)*16 + DRMS(PRES)/2	   CALL HAM84(INDEX,IOUT,ERRCNT)	   DRMS(PRES) = DRMS(PAST)	   IF(IOUT.GE.0) DRMS(PRES) = IOUT*2 + LSB	   DO I = 1,4	      IF(I.EQ.1) THEN	         I1  = ( AND(DRC(PRES,9),7)*2 + AND(DRC(PRES,10),1) )	      ELSE	         I1  = AND(DRC(PRES,9-I),15)	      END IF	      I2 = AND(DRC(PRES,5-I),31)	      LSB = AND(I2,1)	      INDEX = 16*I1 + I2/2	      CALL HAM84(INDEX,IOUT,ERRCNT)	      IF(IOUT.GE.0) THEN	         IOUT = IOUT*2+LSB	         IF(AND(IOUT,16).EQ.16) IOUT = IOUT-32	      ELSE	         IOUT = DRC(PAST,5-I)	      END IF	      DRC(PRES,5-I) = IOUT	   END DO*  Determine error rate	   ERATE = ERATE*.96875 + ERRCNT*102	   IF(ERATE.NE.0 .AND. LISTL.GE.3) WRITE(FDEBUG,987) ERATE,ERRCNT987	   FORMAT(' ERATE=',I6,'   ERRCNT=',I6)	END IF*  Get unsmoothed RMS, RC's, and PITCH	IRMS = DRMS(PRES)	DO I = 1,ORDER	   IRC(I) = DRC(PRES,I)	END DO	IF(IPIT.EQ.1) DPIT(PRES) = DPIT(PAST)	IF(IPIT.EQ.3) DPIT(PRES) = DPIT(FUT)	PITCH = DPIT(PRES)*  If bit 2 of ICORF is set then smooth RMS and RC's,	IF(AND(ICORF,BIT(2)).NE.0) THEN	   IF(  IABS(DRMS(PRES)-DRMS(FUT)) .GE. CORTH(IXCOR,2)     1    .AND.IABS(DRMS(PRES)-DRMS(PAST)).GE. CORTH(IXCOR,2))     1    IRMS = MEDIAN( DRMS(PAST), DRMS(PRES), DRMS(FUT) )	   DO I = 1,6	      IF(  IABS(DRC(PRES,I)-DRC(FUT,I)) .GE. CORTH(IXCOR,I+2)     1       .AND.IABS(DRC(PRES,I)-DRC(PAST,I)).GE. CORTH(IXCOR,I+2))     1       IRC(I) = MEDIAN( DRC(PAST,I), DRC(PRES,I), DRC(FUT,I) )	   END DO	END IF*  If bit 3 of ICORF is set then smooth pitch	IF(AND(ICORF,BIT(3)).NE.0) THEN	   IF(  IABS(DPIT(PRES)-DPIT(FUT)) .GE. CORTH(IXCOR,1)     1    .AND.IABS(DPIT(PRES)-DPIT(PAST)).GE. CORTH(IXCOR,1))     1    PITCH = MEDIAN( DPIT(PAST), DPIT(PRES), DPIT(FUT) )	END IF*  If bit 5 of ICORF is set then RC(5) - RC(10) are loaded with*  values so that after quantization bias is removed in decode*  the values will be zero.500	IF(AND(ICORF,BIT(5)).NE.0) THEN	   DO I = 5,ORDER	      IRC(I) = ZRC(I)	   END DO	END IF*  House keeping  - one frame delay	IOVOIC = IVOIC	IVP2H = VOICE(2)	DPIT(PAST) = DPIT(PRES)	DPIT(PRES) = DPIT(FUT)	DRMS(PAST) = DRMS(PRES)	DRMS(PRES) = DRMS(FUT)	DO I = 1,ORDER	   DRC(PAST,I) = DRC(PRES,I)	   DRC(PRES,I) = DRC(FUT,I)	END DO900	IF(LISTL.GE.3)WRITE(FDEBUG,801)VOICE,PITCH,IRMS,(IRC(J),J=1,ORDER)801	FORMAT(1X,'<<ERRCOR OUT>>',T32,2I3,I6,I5,T50,10I8)*   Decode RMS	IRMS = RMST((31-IRMS)*2+1)*  Decode RC(1) and RC(2) from log-area-ratios*  Protect from illegal coded value (-16) caused by bit errors	DO I = 1,2	   I2 = IRC(I)	   I1 = 0	   IF(I2.LT.0) THEN	      I1 = 1	      I2 = -I2	      IF(I2.GT.15) I2 = 0	   END IF	   I2 = DETAB7(2*I2+1)	   IF(I1.EQ.1) I2 = -I2	   ISHIFT = 15 - NBIT(I)	   IRC(I) = I2*2**ISHIFT	END DO*  Decode RC(3)-RC(10) to sign plus 14 bits	DO I = 3,ORDER	   I2 = IRC(I)	   ISHIFT = 15 - NBIT(I)	   I2 = I2*2**ISHIFT	   I2 = I2 + QB(I-2)	   IRC(I) = I2*DESCL(I-2) + DEADD(I-2)	END DO	IF(LISTL.GE.3) WRITE(FDEBUG,811) IRMS, (IRC(I),I=1,ORDER)811	FORMAT(1X,'<<DECODE OUT>>',T45,I4,1X,10I8)*  Scale RMS and RC's to reals	RMS = IRMS	DO I = 1,ORDER	   RC(I) = IRC(I) / 2.**14	END DO	RETURN	END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?