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

📄 bsynz.f,v

📁 这是LPC-10压缩算法的源代码,愿共享之.也希望能赐与MELP方面的算法源码.
💻 F,V
字号:
head	1.5;access;symbols;locks; strict;comment	@* @;1.5date	96.08.20.21.13.00;	author jaf;	state Exp;branches;next	1.4;1.4date	96.03.27.18.11.22;	author jaf;	state Exp;branches;next	1.3;1.3date	96.03.26.19.33.23;	author jaf;	state Exp;branches;next	1.2;1.2date	96.03.20.17.12.54;	author jaf;	state Exp;branches;next	1.1;1.1date	96.02.07.14.43.15;	author jaf;	state Exp;branches;next	;desc@@1.5log@In the previous version, I mistakenly SAVE'd and initialized LPI0 andHPI0 instead of LPI1 and HPI1.  LPI0 and HPI0 do not need to be saved,nor do they need to be initialized.@text@********************************************************************	BSYNZ Version 54** $Log: bsynz.f,v $* Revision 1.4  1996/03/27  18:11:22  jaf* Changed the range of NOISE printed out in the debugging statements,* even though they are commented out.  I didn't discover this until I* tried comparing two different versions of the LPC-10 coder, each with* full tracing enabled.** Revision 1.3  1996/03/26  19:33:23  jaf* Commented out trace statements.** Revision 1.2  1996/03/20  17:12:54  jaf* Added comments about which indices of array arguments are read or* written.** Rearranged local variable declarations to indicate which need to be* saved from one invocation to the next.  Added entry INITBSYNZ to* reinitialize the local state variables, if desired.** Revision 1.1  1996/02/07 14:43:15  jaf* Initial revision**********************************************************************   Synthesize One Pitch Epoch** Input:*  COEF  - Predictor coefficients*          Indices 1 through ORDER read.*  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* Output:*  SOUT  - Synthesized speech*          Indices 1 through IP written.* * This subroutine maintains local state from one call to the next.  If* you want to switch to using a new audio stream for this filter, or* reinitialize its state for any other reason, call the ENTRY* INITBSYNZ.*	SUBROUTINE BSYNZ(COEF, IP, IV, SOUT, RMS, RATIO, G2PASS)	INCLUDE 'config.fh'	INCLUDE 'contrl.fh'*       Arguments	REAL COEF(ORDER)	INTEGER IP, IV	REAL SOUT(IP), RMS, RATIO, G2PASS*       Function return value definitions	INTEGER RANDOM*	Parameters/constants*       KEXC is not a Fortran PARAMETER, but it is an array initialized*       with a DATA statement that is never modified.	INTEGER KEXC(25)	REAL A0, A1, A2, A3, B0, B1, B2, B3	REAL MESCL, PESCL	PARAMETER (A0= .125, A1=.75, A2= .125, A3=0)	PARAMETER (B0=-.125, B1=.25, B2=-.125, B3=0)	PARAMETER (MESCL=1.0, PESCL=1.0)*       Local variables that need not be saved*       NOISE is declared with range (1:MAXPIT+MAXORD), but only indices*       ORDER+1 through ORDER+IP are ever used, and I think that IP*       .LE. MAXPIT.  Why not declare it to be in the range (1:MAXPIT)*       and use that range?	INTEGER I, J, K	INTEGER PX	REAL NOISE(MAXPIT+MAXORD)	REAL LPI0, HPI0	REAL PULSE, SSCALE, XSSQ, SUM, SSQ, GAIN	REAL XY*       Local state*       I believe that only indices 1 through ORDER of EXC need to be*       saved from one invocation to the next, but we may as well save*       the whole array.*       None of these local variables were given initial values in the*       original code.  I'm guessing that 0 is a reasonable initial*       value for all of them.	INTEGER IPO	REAL EXC(MAXPIT+MAXORD), EXC2(MAXPIT+MAXORD)	REAL LPI1, LPI2, LPI3, HPI1, HPI2, HPI3	REAL RMSO	SAVE IPO	SAVE EXC, EXC2	SAVE LPI1, LPI2, LPI3, HPI1, HPI2, HPI3	SAVE RMSO	DATA IPO /0/*                  MAXPIT+MAXORD=166	DATA EXC /166*0./, EXC2 /166*0./	DATA LPI1 /0./, LPI2 /0./, LPI3 /0./	DATA HPI1 /0./, HPI2 /0./, HPI3 /0./	DATA RMSO /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/*  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*       (RANDOM()+32768) is in the range 0 to 2**16-1.  Therefore the*       following expression should be evaluated using integers with at*       least 32 bits (16 isn't enough), and PX should be in the range*       ORDER+1+0 through ORDER+1+(IP-2) .EQ. ORDER+IP-1.	   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*           *           I changed the range of indices to print within NOISE from*           1,IP+ORDER to 1+ORDER,IP+ORDER since indices 1 through ORDER*           of NOISE are never used.  This avoids printing out their*           "garbage" values.*           *	   IF(IV.NE.0)*     1     WRITE(FDEBUG,980) 'NOISE:',(NOISE(I),I=1+ORDER,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	ENTRY INITBSYNZ ()	IPO = 0	DO I = 1,(MAXPIT+MAXORD)	   EXC(I) = 0.	   EXC2(I) = 0.	END DO	LPI1 = 0.	LPI2 = 0.	LPI3 = 0.	HPI1 = 0.	HPI2 = 0.	HPI3 = 0.	RMSO = 0.	RETURN	END@1.4log@Changed the range of NOISE printed out in the debugging statements,even though they are commented out.  I didn't discover this until Itried comparing two different versions of the LPC-10 coder, each withfull tracing enabled.@text@d6 6d111 2a112 2	DATA LPI0 /0./, LPI2 /0./, LPI3 /0./	DATA HPI0 /0./, HPI2 /0./, HPI3 /0./d245 1a245 1	LPI0 = 0.d248 1a248 1	HPI0 = 0.@1.3log@Commented out trace statements.@text@d6 3d215 6d222 1a222 1*     1     WRITE(FDEBUG,980) 'NOISE:',(NOISE(I),I=1,IP+ORDER)@1.2log@Added comments about which indices of array arguments are read orwritten.Rearranged local variable declarations to indicate which need to besaved from one invocation to the next.  Added entry INITBSYNZ toreinitialize the local state variables, if desired.@text@d6 8d211 8a218 8	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@1.1log@Initial revision@text@d5 4a8 1* $Log$d14 1a14 1* Inputs:d16 1d22 1a22 1* Outputs:d24 6d35 1a35 1* Argumentsd37 1d39 1a39 1	REAL COEF(ORDER), SOUT(IP), G2PASS, RMS, RATIOd41 1a41 1* Localsd44 20a63 1	INTEGER KEXC(25), IPT, IPO, PXd65 3a67 3	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, B3d69 28a96 2	REAL MESCL, PESCL, XY, RMSO	PARAMETER (MESCL=1.0, PESCL=1.0)a100 3	DATA IPT /0/	DATA A0/ .125/, A1/.75/, A2/ .125/, A3/0/	DATA B0/-.125/, B1/.25/, B2/-.125/, B3/0/d121 5d213 19@

⌨️ 快捷键说明

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