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

📄 onset.m

📁 语音编码
💻 M
字号:
% MATLAB SIMULATION OF FS-1015 LPC-10e
% COPYRIGHT (C) 1996-99 ANDREAS SPANIAS and TED PAINTER
%
% This Copyright applies only to this particular MATLAB implementation
% of the LPC-10e coder.  The MATLAB software is intended only for educational
% purposes.  No other use is intended or authorized.  This is not a public
% domain program and unauthorized distribution to individuals or networks 
% is prohibited. Be aware that use of the standard in any form is goverened
% by rules of the US DoD.  
% This program is free software. It is distributed in the hope that it will
% be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  There is no commitment 
% or even implied commitment on behalf of Andreas Spanias or Ted Painter
% for maintenance or support of this code.
%
% MATLAB is trademark of The Mathworks Inc
%
% ALL DERIVATIVE WORKS MUST INCLUDE THIS COPYRIGHT NOTICE.
%
% ******************************************************************
% ONSET
%
% PORTED TO MATLAB FROM LPC-55 C RELEASE
% 2-23-94
%
% ******************************************************************
%
% DESCRIPTION
%
% Onset Detection. Detects onsets (rapid changes in speech character)
% in the futuremost frame of input speech.  Onset locations are used
% to position windows for voicing, spectral, and energy computations.
%
% DESIGN NOTES
%
% Onsets are detected by passing a modified signal through two filters,
% then applying hysteresis to prevent excessive onsets. The process is:
%
% 1) Forward prediction coefficients are computed from preemphasized
%    input speech:
%
%                s(i)s(i-1)
%     fpc(i) =  ------------
%               s(i-1)s(i-1)
%
% 2) Above numerator and denominator are passed through an IIR filter:
%
%                    b
%       H(Z) =  -------------  where b = 1/64 and a = -63/64
%                1 + a(Z^-1)
%
%    Expression (1) is evaluated and resulting fpc(i)s are clamped to +/-1.
%    In case of a zero denominator, fpc(i-1) is used for f(i).
%
% 3) Using an FIR filter, fpc(i)s are differentiated. Because fpc(i) is an
%    indicator of spectral tilt, its derivative is expected to become large
%    in magnitude at an onset.  Differentiator is:
%
%       H(Z) =   1 + Z^-1 + Z^-2 + ... + Z^-7 - Z^-8 - Z^-9 - ... - Z^-15
%
% 4) Finally, thresholding is applied to d(i) terms. d(i)s of sufficient
%    magnitude indicate onset existence. Hysteresis is incorporated to
%    prevent excessive onsets.
%
% VARIABLES
%
%      in      -   input frame (-1.0 to 1.0)
%      b, a    -   filter taps
%
% ******************************************************************

function [ osbuf, osptr, onsetState ] = onset( pe, osbuf, osptr, statics )

% RESTORE FUNCTION STATE (static variables)
hyst = statics( 1, 1 );
lasti = statics( 1, 2 );
zn = statics( 1:2, 3 );
zd = statics( 1:2, 4 );
flast = statics( 1, 5 );
zdiff = statics( 1:15, 6 );

% DECLARE ALL GLOBAL CONSTANTS
global LFRAME OSLEN;

% INITIALIZE USEFUL CONSTANTS
lo = LFRAME;
mid = 2 * LFRAME;
hi = 3 * LFRAME;

% INITIALIZE LOCAL VARIABLES
fpc = zeros( LFRAME, 1 );
n = zeros( LFRAME, 1 );
d = zeros( LFRAME, 1 );
diff = zeros( LFRAME, 1 );
OnsetThreshold = 1.7;
DiffLag = 9;
OsHyst = 10;

% INITIALIZE TAPS, FILTERS 2 AND 3 (SEE ABOVE)
bexp = [ 1.0/64.0, 0.0, 0.0 ];
aexp = [ 1.0, -63.0/64.0, 0.0 ];
bdiff = [ 1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0, ...
         -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0 ];
adiff = [ 1.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0, ...
          0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0 ];

% MAINTAIN HYSTERESIS TRACKING
if hyst == 1
    lasti = lasti - 180;
end

% COMPUTE AND FILTER FPC TERMS
n = pe( mid + 1 : hi ) .* pe( mid : hi - 1 );
d = pe( mid : hi - 1 ) .* pe( mid : hi - 1 );
[ n, zn ] = filter( bexp, aexp, n, zn );
[ d, zd ] = filter( bexp, aexp, d, zd );

% CLAMP TO +/-1, TRAP DIVIDE BY ZERO
for i = 1 : LFRAME
    if d( i ) == 0.00
        fpc( i ) = flast;
    else
        if abs( n( i ) ) > d( i )
            fpc( i ) = sign( n( i ) );
        else
            fpc( i ) = n( i ) / d( i );
        end
        flast = fpc( i );
    end
end

% DIFFERENTIATE FPCs TO FIND ONSETS
[ diff, zdiff ] = filter( bdiff, adiff, fpc, zdiff );

% INCORPORATE THRESHOLDING AND HYSTERESIS, STORE RESULTS
diff = abs( diff );
for i = 1 : LFRAME
    if diff( i ) > OnsetThreshold
        if hyst == 0
	    if osptr <= OSLEN
                osbuf( osptr ) = i - DiffLag + 540;
                osptr = osptr + 1;
            end
            hyst = 1;
	end
        lasti = i;
    else
        if ( hyst == 1 ) & ( ( i - lasti ) >= OsHyst )
            hyst = 0;
        end        
    end
end

% SAVE FUNCTION STATE (STATIC VARIABLES)
p1 = zeros( 14, 1 );
p2 = zeros( 13, 1 );
onsetState = [ [hyst;p1], [lasti;p1], [zn;p2], [zd;p2], [flast;p1], zdiff ];


⌨️ 快捷键说明

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