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

📄 analys.f

📁 是个是LPC源代码
💻 F
字号:
*********************************************************************	ANALYS Version 55********************************************************************	SUBROUTINE ANALYS(SPEECH, VOICE, PITCH, RMS, RC)	INCLUDE 'config.fh'	INCLUDE 'contrl.fh'	INTEGER VOICE(2), PITCH	REAL RMS, RC(ORDER), SPEECH(LFRAME)*  Constants*    NF =     Number of frames*    AF =     Frame in which analysis is done*    OSLEN =  Length of the onset buffer*    LTAU =   Number of pitch lags*    SBUFL, SBUFH =   Start and end index of speech buffers*    LBUFL, LBUFH =   Start and end index of LPF speech buffer*    MINWIN, MAXWIN = Min and Max length of voicing (and analysis) windows*    PWLEN, PWINH, PWINL = Length, upper and lower limits of pitch window*    DVWINL, DVWINH = Default lower and upper limits of voicing window	INTEGER NF, AF, OSLEN, LTAU, SBUFL, SBUFH, LBUFL, LBUFH	INTEGER MINWIN, MAXWIN, PWLEN, PWINL, PWINH, DVWINL, DVWINH	PARAMETER (NF=4, AF=3, OSLEN=10, LTAU=60)	PARAMETER (SBUFL=(AF-2)*MAXFRM+1, SBUFH=NF*MAXFRM)	PARAMETER (LBUFL=(AF-2)*MAXFRM-MAXPIT+1, LBUFH=NF*MAXFRM)	PARAMETER (MINWIN=90, MAXWIN=156)	PARAMETER (PWLEN=MAXPIT+MAXWIN)	PARAMETER (PWINH=AF*MAXFRM, PWINL=PWINH-PWLEN+1)	PARAMETER (DVWINL=PWINH-PWLEN/2-MAXWIN/2+1)	PARAMETER (DVWINH=DVWINL+MAXWIN-1)*  Data Buffers*    INBUF	Raw speech (with DC bias removed each frame)*    PEBUF	Preemphasized speech*    LPBUF	Low pass speech buffer*    IVBUF	Inverse filtered speech*    OSBUF	Indexes of onsets in speech buffers*    VWIN	Voicing window indices*    AWIN	Analysis window indices*    EWIN	Energy window indices*    VOIBUF	Voicing decisions on windows in VWIN*    RMSBUF	RMS energy*    RCBUF	Reflection Coefficients**  Pitch is handled separately from the above parameters.*  The following variables deal with pitch:*    MIDX	Encoded initial pitch estimate for analysis frame*    IPITCH	Initial pitch computed for frame AF (decoded from MIDX)*    PITCH 	The encoded pitch value (index into TAU) for the present*		frame (delayed and smoothed by Dyptrack)	REAL INBUF(SBUFL:SBUFH), PEBUF(SBUFL:SBUFH)	REAL LPBUF(LBUFL:LBUFH), IVBUF(PWINL:PWINH)	REAL AMDF(LTAU), ABUF(MAXWIN), BIAS, TEMP	INTEGER OSBUF(OSLEN), OSPTR, OBOUND(AF)	INTEGER VWIN(2,AF), AWIN(2,AF), EWIN(2,AF), VOIBUF(2,0:AF)	REAL RMSBUF(AF), RCBUF(MAXORD, AF)	REAL PRECOEF, ZPRE	INTEGER I, J, LANAL, HALF, TAU(LTAU)	INTEGER IPITCH, PTAU, MINPTR, MAXPTR, MINTAU, MIDX	REAL IVRC(2), PHI(MAXORD,MAXORD), PSI(MAXORD)	INTEGER BUFLIM(4)	DATA BUFLIM / SBUFL, SBUFH, LBUFL, LBUFH /	DATA PRECOEF/.9375/, ZPRE/0./	DATA BIAS/0/	DATA OSPTR/1/	DATA VWIN(1,AF) /DVWINL/	DATA VWIN(2,AF) /DVWINH/	DATA AWIN(1,AF) /DVWINL/	DATA AWIN(2,AF) /DVWINH/	DATA TAU/20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,     1    35,36,37,38,39,40,42,44,46,48,50,52,54,56,58,60,62,64,66,     1    68,70,72,74,76,78,80,84,88,92,96,100,104,108,112,116,120,     1    124,128,132,136,140,144,148,152,156/	IF(LISTL.GE.3) THEN	   WRITE(FDEBUG,900) NFRAME900	   FORMAT(1X,//,65(2H- ),//,' ANALYSIS DATA -- FRAME',I6/)	END IF*   Calculations are done on future frame due to requirements*   of the pitch tracker.  Delay RMS and RC's 2 frames to give*   current frame parameters on return.*   Update all buffers	DO I = SBUFL, SBUFH-LFRAME	   INBUF(I) = INBUF(LFRAME+I)	   PEBUF(I) = PEBUF(LFRAME+I)	END DO	DO I = PWINL,PWINH-LFRAME	   IVBUF(I) = IVBUF(LFRAME+I)	END DO	DO I = LBUFL,LBUFH-LFRAME	   LPBUF(I) = LPBUF(LFRAME+I)	END DO	J=1	DO I = 1, OSPTR-1	   IF (OSBUF(I) .GT. LFRAME) THEN	      OSBUF(J)=OSBUF(I)-LFRAME	      J=J+1	   END IF	END DO	OSPTR=J	VOIBUF(1,0) = VOIBUF(1,1)	VOIBUF(2,0) = VOIBUF(2,1)	DO I = 1, AF-1	   VWIN(1,I) = VWIN(1,I+1) - LFRAME	   VWIN(2,I) = VWIN(2,I+1) - LFRAME	   AWIN(1,I) = AWIN(1,I+1) - LFRAME	   AWIN(2,I) = AWIN(2,I+1) - LFRAME	   EWIN(1,I) = EWIN(1,I+1) - LFRAME	   EWIN(2,I) = EWIN(2,I+1) - LFRAME	   OBOUND(I) = OBOUND(I+1)	   VOIBUF(1,I) = VOIBUF(1,I+1)	   VOIBUF(2,I) = VOIBUF(2,I+1)	   RMSBUF(I) = RMSBUF(I+1)	   DO J = 1, ORDER	      RCBUF(J,I) = RCBUF(J,I+1)	   END DO	END DO*   Copy input speech, scale to sign+12 bit integers*   Remove long term DC bias.	TEMP = 0	DO I = 1,LFRAME	   INBUF(SBUFH-LFRAME+I) = SPEECH(I)*4096. - BIAS	   TEMP = TEMP + INBUF(SBUFH-LFRAME+I)	END DO	IF( TEMP.GT. LFRAME ) BIAS = BIAS + 1	IF( TEMP.LT.-LFRAME ) BIAS = BIAS - 1*   Place Voicing Window	I = SBUFH + 1 - LFRAME	CALL PREEMP(INBUF(I), PEBUF(I), LFRAME, PRECOEF, ZPRE)	CALL ONSET( PEBUF, OSBUF, OSPTR, OSLEN,     1    SBUFL, SBUFH, LFRAME )	MAXOSP = MAX( MAXOSP, OSPTR )	CALL PLACEV( OSBUF, OSPTR, OSLEN, OBOUND(AF), VWIN, AF,     1    LFRAME, MINWIN, MAXWIN, DVWINL, DVWINH )*        The Pitch Extraction algorithm estimates the pitch for a frame*   of speech by locating the minimum of the average magnitude difference*   function (AMDF).  The AMDF operates on low-pass, inverse filtered*   speech.  (The low-pass filter is an 800 Hz, 19 tap, equiripple, FIR*   filter and the inverse filter is a 2nd-order LPC filter.)  The pitch*   estimate is later refined by dynamic programming (DYPTRK).  However,*   since some of DYPTRK's parameters are a function of the voicing*   decisions, a voicing decision must precede the final pitch estimation.*   See subroutines LPFILT, IVFILT, and TBDM. 	CALL LPFILT( INBUF(LBUFH+1-PWLEN), LPBUF(LBUFH+1-PWLEN),     1    PWLEN, LFRAME )	CALL IVFILT( LPBUF(PWINL), IVBUF(PWINL), PWLEN, LFRAME, IVRC )	CALL TBDM( IVBUF(PWINL), MAXWIN, TAU, LTAU, AMDF,     1    MINPTR, MAXPTR, MINTAU )*        Voicing decisions are made for each half frame of input speech.*   An initial voicing classification is made for each half of the*   analysis frame, and the voicing decisions for the present frame*   are finalized.  See subroutine VOICIN.*        The voicing detector (VOICIN) classifies the input signal as*   unvoiced (including silence) or voiced using the AMDF windowed*   maximum-to-minimum ratio, the zero crossing rate, energy measures,*   reflection coefficients, and prediction gains. *        The pitch and voicing rules apply smoothing and isolated*   corrections to the pitch and voicing estimates and, in the process,*   introduce two frames of delay into the corrected pitch estimates and *   voicing decisions.	DO HALF = 1,2	   CALL VOICIN( VWIN(1,AF), INBUF, LPBUF, BUFLIM, HALF,     1    AMDF(MINPTR), AMDF(MAXPTR), MINTAU, IVRC, OBOUND, VOIBUF, AF )	END DO*   Find the minimum cost pitch decision over several frames*   given the current voicing decision and the AMDF array	CALL DYPTRK( AMDF, LTAU, MINPTR, VOIBUF(2,AF), PITCH, MIDX )	IPITCH = TAU(MIDX)*   Place spectrum analysis and energy windows	CALL PLACEA( IPITCH, VOIBUF, OBOUND(AF), AF,     1    VWIN, AWIN, EWIN, LFRAME, MAXWIN )*   Remove short term DC bias over the analysis window, Put result in ABUF	LANAL = AWIN(2,AF) + 1 - AWIN(1,AF)	CALL DCBIAS( LANAL, PEBUF(AWIN(1,AF)), ABUF )*   Compute RMS over integer number of pitch periods within the*   analysis window.*   Note that in a hardware implementation this computation may be*   simplified by using diagonal elements of PHI computed by MLOAD.	CALL ENERGY( EWIN(2,AF)-EWIN(1,AF)+1,     1              ABUF(EWIN(1,AF)-AWIN(1,AF)+1), RMSBUF(AF) )*   Matrix load and invert, check RC's for stability	CALL MLOAD( ORDER, 1, LANAL, ABUF, PHI, PSI )	CALL INVERT( ORDER, PHI, PSI, RCBUF(1,AF) )	CALL RCCHK( ORDER, RCBUF(1,AF-1), RCBUF(1,AF) )*   Set return parameters	VOICE(1) = VOIBUF(1,AF-2)	VOICE(2) = VOIBUF(2,AF-2)	RMS = RMSBUF(AF-2)	DO I = 1,ORDER	   RC(I) = RCBUF(I,AF-2)	END DO*   Print out test data	IF(LISTL.GE.3) THEN	   IF(LISTL.GE.4) THEN	      IF(LISTL.GE.6) THEN	         WRITE(FDEBUG,980) 'INBUF:',INBUF	         WRITE(FDEBUG,980) 'LPBUF:',LPBUF	         WRITE(FDEBUG,980) 'IVBUF:',IVBUF	         WRITE(FDEBUG,980) 'PEBUF:',PEBUF	      END IF	      WRITE(FDEBUG,980) 'AMDF:',AMDF	   END IF	   IF(OSPTR.GT.1) WRITE(FDEBUG,970)     1    'OSBUF Onset Locations:', (OSBUF(I),I=1,OSPTR-1)	   IF(LISTL.GE.4) THEN	      WRITE(FDEBUG,980) 'PHI Matrix Values:',     1       ((PHI(I,J),J=1,ORDER),I=1,ORDER)	      WRITE(FDEBUG,980) 'PSI Vector Values:',PSI970	      FORMAT(1X,A,100(/1X,20I6))980	      FORMAT(1X,A,100(/1X,10F12.1))	   END IF	   WRITE(FDEBUG,990)990	   FORMAT('  FRAME   AWIN     EWIN   BIAS',T34,     1    'V/UV  Pitch RMS',T54,     1    'RC1     RC2     RC3     RC4     RC5     ',     1    'RC6     RC7     RC8     RC9    RC10')	   WRITE(FDEBUG,992) NFRAME, AWIN(1,AF), AWIN(2,AF),     1    EWIN(1,AF), EWIN(2,AF), BIAS,     1    VOIBUF(2,AF), IPITCH, RMSBUF(AF), (RCBUF(I,AF),I=1,ORDER)992	   FORMAT(1X,I6,2I4,1X,2I4,F6.1,T34,I2,I8,F6.0,T50,10F8.3)	END IF	RETURN*********************************************************************   Decode pitch index (PITCH) to pitch period (PTAU)********************************************************************	ENTRY PITDEC( PITCH, PTAU )	IF (PITCH .GE. 1 .AND. PITCH .LE. LTAU) THEN	   PTAU = TAU(PITCH)	ELSE	   PTAU = 0	END IF	RETURN	END

⌨️ 快捷键说明

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