Mercurial > hg > smacpy
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 |