⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encode.f

📁 lpc 2400 bps语音编解码程序
💻 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 + -