comparison MFCC.py @ 8:6cafb481a1e5

Python3 readiness (thanks to 2to3) Currently tested only on 2.7 though.
author Dan Stowell <danstowell@users.sourceforge.net>
date Thu, 29 Nov 2012 11:17:45 +0000
parents 7a20cff05bd6
children c7fa1f02f5f8
comparison
equal deleted inserted replaced
7:8a27868916fe 8:6cafb481a1e5
38 # make sure this will run only once 38 # make sure this will run only once
39 # if called from a vamp process 39 # if called from a vamp process
40 if self.updated: return self.valid 40 if self.updated: return self.valid
41 self.updated = True 41 self.updated = True
42 self.valid = False 42 self.valid = False
43 print 'Updating parameters and recalculating filters: ' 43 print('Updating parameters and recalculating filters: ')
44 print 'Nyquist: ',self.NqHz 44 print('Nyquist: ',self.NqHz)
45 45
46 if self.maxHz > self.NqHz : 46 if self.maxHz > self.NqHz :
47 raise Exception('Maximum frequency must be smaller than the Nyquist frequency') 47 raise Exception('Maximum frequency must be smaller than the Nyquist frequency')
48 48
49 self.maxMel = 1000*log(1+self.maxHz/700.0)/log(1+1000.0/700.0) 49 self.maxMel = 1000*log(1+self.maxHz/700.0)/log(1+1000.0/700.0)
50 self.minMel = 1000*log(1+self.minHz/700.0)/log(1+1000.0/700.0) 50 self.minMel = 1000*log(1+self.minHz/700.0)/log(1+1000.0/700.0)
51 print 'minHz:%s\nmaxHz:%s\nminMel:%s\nmaxMel:%s\n' \ 51 print('minHz:%s\nmaxHz:%s\nminMel:%s\nmaxMel:%s\n' \
52 %(self.minHz,self.maxHz,self.minMel,self.maxMel) 52 %(self.minHz,self.maxHz,self.minMel,self.maxMel))
53 self.filterMatrix = self.getFilterMatrix(self.inputSize,self.numBands) 53 self.filterMatrix = self.getFilterMatrix(self.inputSize,self.numBands)
54 self.DCTMatrix = self.getDCTMatrix(self.numBands) 54 self.DCTMatrix = self.getDCTMatrix(self.numBands)
55 self.filterIter = self.filterMatrix.__iter__() 55 self.filterIter = self.filterMatrix.__iter__()
56 self.valid = True 56 self.valid = True
57 return self.valid 57 return self.valid
59 def getFilterCentres(self,inputSize,numBands): 59 def getFilterCentres(self,inputSize,numBands):
60 '''Calculate Mel filter centres around FFT bins. 60 '''Calculate Mel filter centres around FFT bins.
61 This function calculates two extra bands at the edges for 61 This function calculates two extra bands at the edges for
62 finding the starting and end point of the first and last 62 finding the starting and end point of the first and last
63 actual filters.''' 63 actual filters.'''
64 centresMel = numpy.array(xrange(numBands+2)) * (self.maxMel-self.minMel)/(numBands+1) + self.minMel 64 centresMel = numpy.array(range(numBands+2)) * (self.maxMel-self.minMel)/(numBands+1) + self.minMel
65 centresBin = numpy.floor(0.5 + 700.0*inputSize*(exp(centresMel*log(1+1000.0/700.0)/1000.0)-1)/self.NqHz) 65 centresBin = numpy.floor(0.5 + 700.0*inputSize*(exp(centresMel*log(1+1000.0/700.0)/1000.0)-1)/self.NqHz)
66 return numpy.array(centresBin,int) 66 return numpy.array(centresBin,int)
67 67
68 def getFilterMatrix(self,inputSize,numBands): 68 def getFilterMatrix(self,inputSize,numBands):
69 '''Compose the Mel scaling matrix.''' 69 '''Compose the Mel scaling matrix.'''
70 filterMatrix = numpy.zeros((numBands,inputSize)) 70 filterMatrix = numpy.zeros((numBands,inputSize))
71 self.filterCentres = self.getFilterCentres(inputSize,numBands) 71 self.filterCentres = self.getFilterCentres(inputSize,numBands)
72 for i in xrange(numBands) : 72 for i in range(numBands) :
73 start,centre,end = self.filterCentres[i:i+3] 73 start,centre,end = self.filterCentres[i:i+3]
74 self.setFilter(filterMatrix[i],start,centre,end) 74 self.setFilter(filterMatrix[i],start,centre,end)
75 return filterMatrix.transpose() 75 return filterMatrix.transpose()
76 76
77 def setFilter(self,filt,filterStart,filterCentre,filterEnd): 77 def setFilter(self,filt,filterStart,filterCentre,filterEnd):
78 '''Calculate a single Mel filter.''' 78 '''Calculate a single Mel filter.'''
79 k1 = numpy.float32(filterCentre-filterStart) 79 k1 = numpy.float32(filterCentre-filterStart)
80 k2 = numpy.float32(filterEnd-filterCentre) 80 k2 = numpy.float32(filterEnd-filterCentre)
81 up = (numpy.array(xrange(filterStart,filterCentre))-filterStart)/k1 81 up = (numpy.array(range(filterStart,filterCentre))-filterStart)/k1
82 dn = (filterEnd-numpy.array(xrange(filterCentre,filterEnd)))/k2 82 dn = (filterEnd-numpy.array(range(filterCentre,filterEnd)))/k2
83 filt[filterStart:filterCentre] = up 83 filt[filterStart:filterCentre] = up
84 filt[filterCentre:filterEnd] = dn 84 filt[filterCentre:filterEnd] = dn
85 85
86 def warpSpectrum(self,magnitudeSpectrum): 86 def warpSpectrum(self,magnitudeSpectrum):
87 '''Compute the Mel scaled spectrum.''' 87 '''Compute the Mel scaled spectrum.'''
88 return numpy.dot(magnitudeSpectrum,self.filterMatrix) 88 return numpy.dot(magnitudeSpectrum,self.filterMatrix)
89 89
90 def getDCTMatrix(self,size): 90 def getDCTMatrix(self,size):
91 '''Calculate the square DCT transform matrix. Results are 91 '''Calculate the square DCT transform matrix. Results are
92 equivalent to Matlab dctmtx(n) with 64 bit precision.''' 92 equivalent to Matlab dctmtx(n) with 64 bit precision.'''
93 DCTmx = numpy.array(xrange(size),numpy.float64).repeat(size).reshape(size,size) 93 DCTmx = numpy.array(range(size),numpy.float64).repeat(size).reshape(size,size)
94 DCTmxT = numpy.pi * (DCTmx.transpose()+0.5) / size 94 DCTmxT = numpy.pi * (DCTmx.transpose()+0.5) / size
95 DCTmxT = (1.0/sqrt( size / 2.0)) * cos(DCTmx * DCTmxT) 95 DCTmxT = (1.0/sqrt( size / 2.0)) * cos(DCTmx * DCTmxT)
96 DCTmxT[0] = DCTmxT[0] * (sqrt(2.0)/2.0) 96 DCTmxT[0] = DCTmxT[0] * (sqrt(2.0)/2.0)
97 return DCTmxT 97 return DCTmxT
98 98