Fundamentos de Computac¸˜ao Gr´afica - Trabalho 2
Jo˜ao Carlos Virgolino Soares
15 de Maio de 20181 Leitura do sinal
No trabalho foi usado o sinal ’english.wav’. A leitura do sinal foi feita com a func¸˜ao read audio fornecida.
2 Pre-Emphasis
O primeiro passo do algoritmo ´e aplicar um filtro pr´e-ˆenfase no sinal. A figura 1 mostra o sinal antes do filtro. A figura 2 mostra o sinal ap´os a aplicac¸˜ao do filtro, com α = 0.95.
Figura 1: Sinal no dom´ınio do tempo
Figura 2: Sinal no dom´ınio do tempo ap´os a pr´e-ˆenfase
3 Short-frames
A func¸˜ao mostrada a seguir divide o sinal em short frames. O tamanho escolhido de cada frame foi de 25 ms, com um frame step de 10 ms.
def s h o r t f r a m e s ( signal , srate , f r a m e _ s i z e 0 , s t e p 0 ): s f r a m e _ l e n g t h = int ( f r a m e _ s i z e 0 * s r a t e ) p r i n t " f r a m e _ l e n g t h :" , s f r a m e _ l e n g t h f r a m e _ s t e p = s t e p 0 * s r a t e 5 s i g n a l _ l e n g t h = len ( s i g n a l ) p r i n t " s i g n a l _ l e n g t h :" , s i g n a l _ l e n g t h
n _ s f r a m e s = int ( np .c e i l(( len ( d a t a ) - s f r a m e _ l e n g t h ) / 10 f l o a t ( f r a m e _ s t e p ))) z _ s i g n a l _ l e n g t h = n _ s f r a m e s * f r a m e _ s t e p + s f r a m e _ l e n g t h z = np .z e r o s( int ( z _ s i g n a l _ l e n g t h - s i g n a l _ l e n g t h )) s i g n a l _ z = np . a p p e n d ( signal , z ) ind = np .z e r o s(( n _ s f r a m e s , s f r a m e _ l e n g t h )) 15 for i in r a n g e (0 , n _ s f r a m e s ): ind [ i ] = np . a r a n g e ( i * f r a m e _ s t e p , i * f r a m e _ s t e p + s f r a m e _ l e n g t h ) 20 ind = ind . a s t y p e ( np . i n t 3 2 ) s f r a m e s = s i g n a l _ z [ ind ] r e t u r n sframes , n _ s f r a m e s , s f r a m e _ l e n g t h 4 Window
No pr´oximo passo foi aplicada a func¸˜ao window Hamming para cada frame, mostrada no c´odigo a seguir.
for i in r a n g e (0 , n _ f r a m e s ):
for n in r a n g e (0 , f r a m e _ l e n g t h ): f r a m e s [ i , n ] = f r a m e s [ i , n ]*
( 0 . 5 4 - 0 . 4 6 * np .cos( ( 2 * np .pi* n )/( f r a m e _ l e n g t h - 1 ) ) ) 5 Mel Filter bank
Em seguida foi calculado o power spectrum para cada quadro, usando 512 pontos na FFT, e aplicado o mel filterbank aos power spectra. A func¸˜ao mel filterbank, mostrada a seguir, cal-cula o mel filter bank, dadas as frequˆencias m´axima e m´ınima e o n´umero de filtros. Foram usados 40 filtros triangulares. As func¸˜oes auxiliares hz to mel e mel to hz fazem a convers˜ao entre frequˆencia e escala Mel.
def h z _ t o _ m e l ( hz ): m = 2 5 9 5 . 0 * np .l o g 1 0( 1 + ( hz / 7 0 0 . 0 ) ) r e t u r n m 5 def m e l _ t o _ h z ( m ): hz = 7 0 0 * ( 1 0 * * ( m / 2 5 9 5 . 0 ) - 1 ) r e t u r n hz 10 def m e l _ f i l t e r b a n k ( l o w e r _ f r e q , u p p e r _ f r e q , n f i l t e r s ): m _ l o w e r _ f r e q = h z _ t o _ m e l ( l o w e r _ f r e q )
m _ u p p e r _ f r e q = h z _ t o _ m e l ( u p p e r _ f r e q ) 15 mel = np .l i n s p a c e( m _ l o w e r _ f r e q , m _ u p p e r _ f r e q , n f i l t e r s + 2) h = m e l _ t o _ h z ( mel ) f = ( np .f l o o r(( N f f t + 1) * h / r a t e )) f b a n k s = np .z e r o s(( n f i l t e r s , int ( np .f l o o r(( N f f t / 2) + 1 ) ) ) ) 20 for m in r a n g e (1 , n f i l t e r s + 1):
for k in r a n g e ( int ( f [ m - 1]) , int ( f [ m ] ) ) :
f b a n k s [ m - 1 , k ] = ( k - f [ m - 1]) / ( f [ m ] - f [ m - 1])
for k in r a n g e ( int ( f [ m ]) , int ( f [ m + 1 ] ) ) :
25 f b a n k s [ m - 1 , k ] = ( f [ m + 1] - k ) / ( f [ m + 1] - f [ m ]) r e t u r n f b a n k s n _ f i l t e r s = 40 l o w _ f r e q = 0 30 u p _ f r e q = 4 0 0 0 f b a n k = m e l _ f i l t e r b a n k ( l o w _ f r e q , up_freq , n _ f i l t e r s ) p l o t _ f b a n k ( fbank , rate , l o w _ f r e q ) 35 f i l t e r _ b a n k s = np .dot( p_spec , f b a n k . T ) f i l t e r _ b a n k s = np .l o g 1 0( f i l t e r _ b a n k s ) p l o t _ s p e c t r o g r a m ( f i l t e r _ b a n k s )
A figura 3 mostra os filtros na escala mel se sobrepondo. Cada filtro tem resposta 1 na frequˆencia central, que decai linearmente at´e 0. A figura 4 mostra o espectrograma do sinal ap´os aplicar o mel filter bank aos power spectra e o logaritmo.
Figura 4: Espectrograma do Sinal
6 DCT do log das Filter banks
Em seguida foi calculada o DCT do log das filterbank energies, conforme mostrado abaixo, para obter os MFCCs. n u m _ c e p s = 12 m f c c = dct ( f i l t e r _ b a n k s )[: , 1 : ( n u m _ c e p s + 1)] ( nf , nc ) = m f c c . s h a p e 5 i = np . a r a n g e ( nc ) D = 23 l i f t e r = 1+( D / 2 ) + np .sin( np .pi* i / D ) m f c c *= l i f t e r 10 p l o t _ m f c c ( n u m _ c e p s , m f c c )
O sinusoidal liftering foi aplicado aos MFCCs, de acordo com a equac¸˜ao 1.
ωi= 1 +
D
2sin(iπ/2) (1)