📄 encode.f,v
字号:
head 1.5;access;symbols;locks; strict;comment @* @;1.5date 96.03.26.19.35.50; author jaf; state Exp;branches;next 1.4;1.4date 96.03.21.00.26.29; author jaf; state Exp;branches;next 1.3;1.3date 96.03.21.00.22.39; author jaf; state Exp;branches;next 1.2;1.2date 96.03.13.18.48.33; author jaf; state Exp;branches;next 1.1;1.1date 96.02.07.14.45.29; author jaf; state Exp;branches;next ;desc@@1.5log@Commented out trace statements.@text@******************************************************************** ENCODE Version 54** $Log: encode.f,v $* Revision 1.4 1996/03/21 00:26:29 jaf* Added the comment that this subroutine has no local state.** In the last check-in, I forgot to mention that I had added comments* explaining which indices of array arguments are read or written.** Revision 1.3 1996/03/21 00:22:39 jaf* Added comments explaining that all local arrays are effectively* constants.** Revision 1.2 1996/03/13 18:48:33 jaf* Comments added explaining that none of the local variables of this* subroutine need to be saved from one invocation to the next.** Revision 1.1 1996/02/07 14:45:29 jaf* Initial revision********************************************************************** Quantize LPC parameters for transmission** INPUTS:* VOICE - Half frame voicing decisions* Indices 1 through 2 read.* PITCH - Pitch* RMS - Energy* RC - Reflection coefficients* Indices 1 through ORDER read.* CORRP - Error Correction: TRUE = yes, FALSE = none* (this is defined in file control.fh)* OUTPUTS:* IPITCH - Coded pitch and voicing* IRMS - Quantized energy* IRC - Quantized reflection coefficients* Indices 1 through MAX(ORDER,2) written.* If CORRP is .TRUE., then indices 1 through 10 written* for unvoiced frames.** This subroutine has no local state.* SUBROUTINE ENCODE(VOICE, PITCH, RMS, RC, 1 IPITCH, IRMS, IRC ) INCLUDE 'config.fh' INCLUDE 'contrl.fh'* Arguments INTEGER VOICE(2), PITCH REAL RMS, RC(ORDER) INTEGER IPITCH, IRMS, IRC(ORDER)* Parameters/constants* These arrays are not Fortran PARAMETER's, but they are defined* by DATA statements below, and their contents are never altered. INTEGER ENCTAB(16), ENTAB6(64), RMST(64) INTEGER ENTAU(60), ENBITS(8), ENADD(8) REAL ENSCL(8)* Local variables that need not be saved INTEGER I, J, I2, I3, MRK, NBIT, IDEL DATA ENCTAB/0,7,11,12,13,10,6,1,14,9,5,2,3,4,8,15/ DATA ENTAU/19,11,27,25,29,21,23,22,30,14,15,7,39, 1 38,46,42,43,41,45,37,53,49,51,50,54,52, 1 60,56,58,26,90,88,92,84,86,82,83,81,85, 1 69,77,73,75,74,78,70,71,67,99,97,113,112, 1 114,98,106,104,108,100,101,76/ DATA ENADD/1920,-768,2432,1280,3584,1536,2816,-1152/ DATA ENSCL/.0204,.0167,.0145,.0147,.0143,.0135,.0125,.0112/ DATA ENBITS/6,5,4,4,4,4,3,3/ DATA ENTAB6/6*0,7*1,7*2,7*3,7*4,5*5,5*6,5*7,4*8, 1 3*9,2*10,2*11,12,13,14,15/ 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/* Scale RMS and RC's to integers IRMS = RMS DO I = 1,ORDER IRC(I) = RC(I) * 2.**15 END DO * IF(LISTL.GE.3)WRITE(FDEBUG,800)VOICE,PITCH,IRMS,(IRC(I),I=1,ORDER)*800 FORMAT(1X,/,' <<ENCODE IN>>',T32,2I3,I6,I5,T50,10I8)* Encode pitch and voicing IF(VOICE(1).NE.0.AND.VOICE(2).NE.0) THEN IPITCH = ENTAU(PITCH) ELSE IF(CORRP) THEN IPITCH = 0 IF(VOICE(1).NE.VOICE(2)) IPITCH = 127 ELSE IPITCH = 2*VOICE(1) + VOICE(2) END IF END IF* Encode RMS by binary table search J = 32 IDEL = 16 IRMS = MIN(IRMS,1023) DO WHILE(IDEL.GT.0) IF (IRMS.GT.RMST(J)) J = J - IDEL IF (IRMS.LT.RMST(J)) J = J + IDEL IDEL = IDEL/2 END DO IF (IRMS.GT.RMST(J)) J = J - 1 IRMS = 31 - J/2* Encode RC(1) and (2) as log-area-ratios DO I = 1,2 I2 = IRC(I) MRK = 0 IF(I2.LT.0) THEN I2 = -I2 MRK = 1 END IF I2 = I2/(2**9) I2 = MIN(I2,63) I2 = ENTAB6(I2+1) IF(MRK.NE.0) I2 = -I2 IRC(I) = I2 END DO* Encode RC(3) - (10) linearly, remove bias then scale DO I = 3,ORDER I2 = IRC(I)/2 I2 = (I2+ENADD(ORDER+1-I))*ENSCL(ORDER+1-I) I2 = MIN(MAX(I2,-127),127) NBIT = ENBITS(ORDER+1-I) I3 = 0 IF(I2.LT.0) I3 = -1 I2 = I2/(2**NBIT) IF(I3.EQ.-1) I2 = I2-1 IRC(I) = I2 END DO* Protect the most significant bits of the most* important parameters during non-voiced frames.* RC(1) - RC(4) are protected using 20 parity bits* replacing RC(5) - RC(10). IF(CORRP) THEN IF(IPITCH.EQ.0.OR.IPITCH.EQ.127) THEN IRC(5) = ENCTAB(AND(IRC(1),30)/2+1) IRC(6) = ENCTAB(AND(IRC(2),30)/2+1) IRC(7) = ENCTAB(AND(IRC(3),30)/2+1) IRC(8) = ENCTAB(AND(IRMS,30)/2+1) IRC(9) = (ENCTAB(AND(IRC(4),30)/2+1))/2 IRC(10)= AND(ENCTAB(AND(IRC(4),30)/2+1),1) END IF END IF* IF(LISTL.GE.3)WRITE(FDEBUG,801)VOICE,IPITCH,IRMS,(IRC(J),J=1,ORDER)*801 FORMAT(1X,'<<ENCODE OUT>>',T32,2I3,I6,I5,T50,10I8) RETURN END@1.4log@Added the comment that this subroutine has no local state.In the last check-in, I forgot to mention that I had added commentsexplaining which indices of array arguments are read or written.@text@d6 6d98 2a99 2 IF(LISTL.GE.3)WRITE(FDEBUG,800)VOICE,PITCH,IRMS,(IRC(I),I=1,ORDER)800 FORMAT(1X,/,' <<ENCODE IN>>',T32,2I3,I6,I5,T50,10I8)d173 2a174 2 IF(LISTL.GE.3)WRITE(FDEBUG,801)VOICE,IPITCH,IRMS,(IRC(J),J=1,ORDER)801 FORMAT(1X,'<<ENCODE OUT>>',T32,2I3,I6,I5,T50,10I8)@1.3log@Added comments explaining that all local arrays are effectivelyconstants.@text@d6 4d38 2@1.2log@Comments added explaining that none of the local variables of thissubroutine need to be saved from one invocation to the next.@text@d6 4d20 1d24 1d31 3d40 1a40 1* Parametersd46 4a49 7* Local variables* * None of these need to have their values saved from one* invocation to the next.* * In fact, all of the arrays are defined by DATA statements below,* and their contents are never altered.a50 1 INTEGER I, J, I2, I3, MRK, NBIT, IDELd54 5@1.1log@Initial revision@text@d5 4a8 1* $Log$d20 1d30 3d36 9@
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -