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

📄 pitsyn.f

📁 lpc 2400 bps语音编解码程序
💻 F
字号:
******************************************************************
*
*	PITSYN Version 53
*
******************************************************************
*
*   Synthesize a single pitch epoch
*
* Inputs:
*  ORDER  - Synthesis order (number of RC's)
*  VOICE  - Half frame voicing decisions
*  PITCH  - Pitch
*  RMS    - Energy
*  RC     - Reflection coefficients
*  LFRAME - Length of speech buffer
* Outputs:
*  IVUV   - Pitch epoch voicing decisions
*  IPITI  - Pitch epoch length
*  RMSI   - Pitch epoch energy
*  RCI    - Pitch epoch RC's
*  NOUT   - Number of pitch periods in this frame
*  RATIO  - Previous to present energy ratio
*  
	SUBROUTINE PITSYN( ORDER, VOICE, PITCH, RMS, RC, LFRAME,
     1  		   IVUV, IPITI, RMSI, RCI, NOUT, RATIO )
	INCLUDE 'config.fh'
	INTEGER ORDER, VOICE(2), PITCH, LFRAME
	INTEGER IVUV(11), IPITI(11), NOUT
	REAL RMS, RC(ORDER), RMSI(11), RCI(ORDER,11), RATIO
	REAL RCO(MAXORD), YARC(MAXORD)
	INTEGER I, J, LSAMP, IP, IPITO, ISTART, IVOICE, IVOICO
	INTEGER JSAMP, JUSED, NL
	REAL ALRN, ALRO, PROP
	REAL RMSO, SLOPE, UVPIT, VFLAG, XXY
	LOGICAL FIRST
	DATA FIRST/.TRUE./

	IF (RMS.LT.1) RMS = 1
	IF (RMSO.LT.1) RMSO = 1
	UVPIT = 0.0
	RATIO = RMS/(RMSO+8.)
	IF (FIRST) THEN
	   LSAMP = 0
	   IVOICE = VOICE(2)
	   IF (IVOICE.EQ.0) PITCH = LFRAME/4
	   NOUT = LFRAME/PITCH
	   JSAMP = LFRAME - NOUT*PITCH
	   DO I = 1,NOUT
	      DO J = 1,ORDER
	         RCI(J,I) = RC(J)
	      END DO
	      IVUV(I) = IVOICE
	      IPITI(I) = PITCH
	      RMSI(I) = RMS
	   END DO
	   FIRST = .FALSE.
	ELSE
	   VFLAG = 0
	   LSAMP = LFRAME + JSAMP
	   SLOPE = (PITCH-IPITO)/FLOAT(LSAMP)
	   NOUT = 0
	   JUSED = 0
	   ISTART = 1
	   IF ((VOICE(1).EQ.IVOICO).AND.(VOICE(2).EQ.VOICE(1))) THEN
	      IF (VOICE(2).EQ.0) THEN
* SSUV - -   0  ,  0  ,  0
	         PITCH = LFRAME/4
	         IPITO = PITCH
	         IF( RATIO.GT.8 ) RMSO = RMS
	      END IF
* SSVC - -   1  ,  1  ,  1
	      SLOPE = (PITCH-IPITO)/FLOAT(LSAMP)
	      IVOICE = VOICE(2)
	   ELSE
	      IF (IVOICO.NE.1) THEN
	         IF (IVOICO.EQ.VOICE(1)) THEN
* UV2VC2 - -  0  ,  0  ,  1
	            NL = LSAMP - LFRAME/4
	         ELSE
* UV2VC1 - -  0  ,  1  ,  1
	            NL = LSAMP - 3*LFRAME/4
	         ENDIF
	         IPITI(1) = NL/2
	         IPITI(2) = NL - IPITI(1)
	         IVUV(1) = 0
	         IVUV(2) = 0
	         RMSI(1) = RMSO
	         RMSI(2) = RMSO
	         DO I = 1,ORDER
	            RCI(I,1) = RCO(I)
	            RCI(I,2) = RCO(I)
	            RCO(I)   = RC(I)
	         END DO
	         SLOPE = 0
	         NOUT = 2
	         IPITO = PITCH
	         JUSED = NL
	         ISTART = NL + 1
	         IVOICE = 1
	      ELSE
	         IF (IVOICO.NE.VOICE(1)) THEN
* VC2UV1 - -   1  ,  0  ,  0
	            LSAMP = LFRAME/4 + JSAMP
	         ELSE
* VC2UV2 - -   1  ,  1  ,  0
	            LSAMP = 3*LFRAME/4 + JSAMP
	         END IF
	         DO I = 1,ORDER
	            YARC(I) = RC(I)
	            RC(I) = RCO(I)
	         END DO
	         IVOICE = 1
	         SLOPE = 0.
	         VFLAG = 1
	      END IF
	   END IF
	   DO WHILE (.TRUE.)
	      DO I = ISTART,LSAMP
	         IP = IPITO + SLOPE*I + .5
	         IF (UVPIT.NE.0.0) IP = UVPIT
	         IF (IP.LE.I-JUSED) THEN
	            NOUT = NOUT + 1
		    IF (NOUT .GT. 11) STOP 'PITSYN: too many epochs'
	            IPITI(NOUT) = IP
	            PITCH = IP
	            IVUV(NOUT) = IVOICE
	            JUSED = JUSED + IP
	            PROP = (JUSED-IP/2)/FLOAT(LSAMP)
	            DO J = 1,ORDER
	               ALRO = ALOG((1+RCO(J))/(1-RCO(J)))
	               ALRN = ALOG((1+RC(J))/(1-RC(J)))
	               XXY = ALRO + PROP*(ALRN-ALRO)
	               XXY = EXP(XXY)
	               RCI(J,NOUT) = (XXY-1)/(XXY+1)
	            END DO
	            RMSI(NOUT) = ALOG(RMSO) + PROP*(ALOG(RMS)-ALOG(RMSO))
	            RMSI(NOUT) = EXP(RMSI(NOUT))
	         END IF
	      END DO
	      IF (VFLAG.NE.1) GOTO 100
	      VFLAG = 0
	      ISTART = JUSED + 1
	      LSAMP = LFRAME + JSAMP
	      SLOPE = 0
	      IVOICE = 0
	      UVPIT = (LSAMP-ISTART)/2
	      IF(UVPIT.GT.90) UVPIT = UVPIT/2
	      RMSO = RMS
	      DO I = 1,ORDER
	         RC(I) = YARC(I)
	         RCO(I) = YARC(I)
	      END DO
	   END DO
100	   JSAMP = LSAMP - JUSED
	END IF
	IF (NOUT.NE.0) THEN
	   IVOICO = VOICE(2)
	   IPITO = PITCH
	   RMSO = RMS
	   DO I = 1,ORDER
	      RCO(I) = RC(I)
	   END DO
	END IF
	RETURN
	END

⌨️ 快捷键说明

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