📄 bsynz.f
字号:
******************************************************************
*
* BSYNZ Version 54
*
******************************************************************
*
* Synthesize One Pitch Epoch
*
* Inputs:
* COEF - Predictor coefficients
* IP - Pitch period (number of samples to synthesize)
* IV - Voicing for the current epoch
* RMS - Energy for the current epoch
* RATIO - Energy slope for plosives
* G2PASS- Sharpening factor for 2 pass synthesis
* Outputs:
* SOUT - Synthesized speech
*
SUBROUTINE BSYNZ(COEF, IP, IV, SOUT, RMS, RATIO, G2PASS)
INCLUDE 'config.fh'
INCLUDE 'contrl.fh'
* Arguments
INTEGER IP, IV
REAL COEF(ORDER), SOUT(IP), G2PASS, RMS, RATIO
* Locals
INTEGER RANDOM
INTEGER KEXC(25), IPT, IPO, PX
INTEGER I, J, K
REAL EXC(MAXPIT+MAXORD), EXC2(MAXPIT+MAXORD), NOISE(MAXPIT+MAXORD)
REAL LPI0, LPI1, LPI2, LPI3, HPI0, HPI1, HPI2, HPI3
REAL A0, A1, A2, A3, B0, B1, B2, B3
REAL PULSE, SSCALE, XSSQ, SUM, SSQ, GAIN
REAL MESCL, PESCL, XY, RMSO
PARAMETER (MESCL=1.0, PESCL=1.0)
DATA KEXC /8,-16,26,-48,86,-162,294,-502,718,-728,
1 184,672,-610,-672,184,728,718,502,294,162,
1 86,48,26,16,8/
DATA IPT /0/
DATA A0/ .125/, A1/.75/, A2/ .125/, A3/0/
DATA B0/-.125/, B1/.25/, B2/-.125/, B3/0/
* Calculate history scale factor XY and scale filter state
XY = MIN( RMSO/(RMS+1E-6), 8. )
RMSO = RMS
DO I = 1,ORDER
EXC2(I) = EXC2(IPO+I)*XY
END DO
IPO = IP
IF(IV.EQ.0) THEN
* Generate white noise for unvoiced
DO I = 1,IP
EXC(ORDER+I) = RANDOM() / 2**6
END DO
* Impulse doublet excitation for plosives
PX = ((RANDOM()+32768)*(IP-1)/2**16) + ORDER + 1
PULSE = PESCL*(RATIO/4)*342
IF(PULSE.GT.2000) PULSE = 2000
EXC(PX) = EXC(PX) + PULSE
EXC(PX+1) = EXC(PX+1) - PULSE
* Load voiced excitation
ELSE
SSCALE = SQRT(FLOAT(IP))/6.928
DO I = 1,IP
EXC(ORDER+I) = 0.
IF(I.LE.25) EXC(ORDER+I) = SSCALE*KEXC(I)
LPI0 = EXC(ORDER+I)
EXC(ORDER+I) = A0*EXC(ORDER+I) + A1*LPI1 + A2*LPI2 + A3*LPI3
LPI3 = LPI2
LPI2 = LPI1
LPI1 = LPI0
END DO
DO I = 1,IP
NOISE(ORDER+I) = MESCL * RANDOM() / 2**6
HPI0 = NOISE(ORDER+I)
NOISE(ORDER+I) = B0*NOISE(ORDER+I)
1 + B1*HPI1 + B2*HPI2 + B3*HPI3
HPI3 = HPI2
HPI2 = HPI1
HPI1 = HPI0
END DO
DO I = 1,IP
EXC(ORDER+I) = EXC(ORDER+I) + NOISE(ORDER+I)
END DO
END IF
* Synthesis filters:
* Modify the excitation with all-zero filter 1 + G*SUM
XSSQ = 0
DO I = 1,IP
K = ORDER + I
SUM = 0.
DO J = 1,ORDER
SUM = SUM + COEF(J)*EXC(K-J)
END DO
SUM = SUM*G2PASS
EXC2(K) = SUM + EXC(K)
END DO
* Synthesize using the all pole filter 1 / (1 - SUM)
DO I = 1,IP
K = ORDER + I
SUM = 0.
DO J = 1,ORDER
SUM = SUM + COEF(J)*EXC2(K-J)
END DO
EXC2(K) = SUM + EXC2(K)
XSSQ = XSSQ + EXC2(K)*EXC2(K)
END DO
* Save filter history for next epoch
DO I = 1,ORDER
EXC(I) = EXC(IP+I)
EXC2(I) = EXC2(IP+I)
END DO
* Apply gain to match RMS
SSQ = RMS*RMS*IP
GAIN = SQRT(SSQ/XSSQ)
DO I = 1,IP
SOUT(I) = GAIN*EXC2(ORDER+I)
END DO
* Print test data
IF(LISTL.GE.5) THEN
IF(IV.NE.0)
1 WRITE(FDEBUG,980) 'NOISE:',(NOISE(I),I=1,IP+ORDER)
WRITE(FDEBUG,980) 'EXC:', (EXC(I), I=1,IP+ORDER)
WRITE(FDEBUG,980) 'EXC2:', (EXC2(I), I=1,IP+ORDER)
WRITE(FDEBUG,980) 'SOUT:', (SOUT(I), I=1,IP)
980 FORMAT(1X,A,100(/1X,10F10.1))
END IF
RETURN
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -