📄 onset.f
字号:
*******************************************************************
*
* ONSET Version 49
*
*******************************************************************
*
* Floating point version
*
SUBROUTINE ONSET( PEBUF, OSBUF, OSPTR, OSLEN,
1 SBUFL, SBUFH, LFRAME )
INCLUDE 'config.fh'
INTEGER OSLEN, SBUFL, SBUFH, LFRAME
REAL PEBUF(SBUFL:SBUFH)
INTEGER OSBUF(OSLEN), OSPTR
* Detection of onsets in (or slightly preceding) the futuremost frame
* of speech.
* Arguments
* PEBUF Preemphasized speech
* OSBUF Buffer which holds sorted indexes of onsets (Modified)
* OSPTR Free pointer into OSBUF (Modified)
* Parameters for onset detection algorithm:
* L2 Threshold for filtered slope of FPC (function of L2WID!)
* L2LAG Lag due to both filters which compute filtered slope of FPC
* L2WID Width of the filter which computes the slope of FPC
* OSHYST The number of samples which of slope(FPC) which must be below
* the threshold before a new onset may be declared.
* Variables
* N, D Numerator and denominator of prediction filters
* FPC Current prediction coefs
* L2BUF, L2SUM1, L2SUM2 State of slope filter
INTEGER L2LAG, L2WID, OSHYST, TEMP
REAL L2
PARAMETER (L2=1.7, L2LAG=9, L2WID=16, OSHYST=10)
PARAMETER (TEMP=1+L2WID/2)
REAL N, D, FPC
REAL L2BUF(L2WID), L2SUM1, L2SUM2
INTEGER L2PTR1, L2PTR2, I, LASTI
LOGICAL HYST
DATA L2BUF/L2WID*0./, L2PTR1/1/, L2PTR2/TEMP/
DATA L2SUM1/0./, L2SUM2/0./
DATA HYST/.FALSE./
DATA N/0./, D/1./
SAVE N, D, FPC
SAVE L2BUF, L2PTR1, L2PTR2, L2SUM1, L2SUM2
SAVE HYST, LASTI
IF (HYST) LASTI = LASTI - 180
DO I = SBUFH-LFRAME+1, SBUFH
* Compute FPC; Use old FPC on divide by zero; Clamp FPC to +/- 1.
N=(PEBUF(I)*PEBUF(I-1)+63.*N) / 64.
D=(PEBUF(I-1)**2+63.*D) / 64.
IF (D .NE. 0.) THEN
IF (ABS(N) .GT. D) THEN
FPC = SIGN (1., N)
ELSE
FPC=N/D
END IF
END IF
* Filter FPC
L2SUM2 = L2BUF(L2PTR1)
L2SUM1 = L2SUM1 - L2BUF(L2PTR2) + FPC
L2BUF(L2PTR2) = L2SUM1
L2BUF(L2PTR1) = FPC
L2PTR1 = MOD(L2PTR1,L2WID)+1
L2PTR2 = MOD(L2PTR2,L2WID)+1
IF (ABS(L2SUM1-L2SUM2) .GT. L2) THEN
IF (.NOT. HYST) THEN
* Ignore if buffer full
IF (OSPTR .LE. OSLEN) THEN
OSBUF (OSPTR) = I - L2LAG
OSPTR = OSPTR + 1
END IF
HYST = .TRUE.
END IF
LASTI = I
ELSE IF (HYST .AND. I - LASTI .GE. OSHYST) THEN
HYST = .FALSE.
END IF
END DO
RETURN
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -