📄 encode.f
字号:
******************************************************************
*
* ENCODE Version 54
*
******************************************************************
*
* Quantize LPC parameters for transmission
*
* INPUTS:
* VOICE - Half frame voicing decisions
* PITCH - Pitch
* RMS - Energy
* RC - Reflection coefficients
* CORRP - Error Correction: TRUE = yes, FALSE = none
* OUTPUTS:
* IPITCH - Coded pitch and voicing
* IRMS - Quantized energy
* IRC - Quantized reflection coefficients
*
SUBROUTINE ENCODE(VOICE, PITCH, RMS, RC,
1 IPITCH, IRMS, IRC )
INCLUDE 'config.fh'
INCLUDE 'contrl.fh'
INTEGER VOICE(2), PITCH
REAL RMS, RC(ORDER)
INTEGER IPITCH, IRMS, IRC(ORDER)
INTEGER I, J, I2, I3, MRK, NBIT, IDEL
INTEGER ENCTAB(16), ENTAB6(64), RMST(64)
INTEGER ENTAU(60), ENBITS(8), ENADD(8)
REAL ENSCL(8)
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -