annotate Example VamPy plugins/PySpectralCentroid.py @ 23:535d559300dc

* fix incorrect default values for parameters (must match declared defaults)
author cannam
date Thu, 16 Jul 2009 13:19:20 +0000 (2009-07-16)
parents 3983172c1db2
children 7d28bed0864e
rev   line source
fazekasgy@9 1 '''PySpectralCentroid.py - Example plugin demonstrates'''
fazekasgy@9 2 '''how to write a C style plugin using VamPy.'''
fazekasgy@9 3
fazekasgy@9 4 from numpy import *
fazekasgy@9 5
fazekasgy@9 6 class PySpectralCentroid:
fazekasgy@9 7
fazekasgy@9 8 def __init__(self):
fazekasgy@9 9 self.m_imputSampleRate = 0.0
fazekasgy@9 10 self.m_stepSize = 0
fazekasgy@9 11 self.m_blockSize = 0
fazekasgy@9 12 self.m_channels = 0
fazekasgy@9 13 self.previousSample = 0.0
cannam@23 14 self.threshold = 0.05
fazekasgy@9 15
fazekasgy@9 16 def initialise(self,channels,stepSize,blockSize,inputSampleRate):
fazekasgy@9 17 self.m_channels = channels
fazekasgy@9 18 self.m_stepSize = stepSize
fazekasgy@9 19 self.m_blockSize = blockSize
fazekasgy@9 20 self.m_inputSampleRate = inputSampleRate
fazekasgy@9 21 return True
fazekasgy@9 22
fazekasgy@9 23 def getMaker(self):
fazekasgy@9 24 return 'VamPy Example Plugins'
fazekasgy@9 25
fazekasgy@9 26 def getName(self):
fazekasgy@9 27 return 'Spectral Centroid (VamPy Legacy Interface)'
fazekasgy@9 28
fazekasgy@9 29 def getIdentifier(self):
fazekasgy@9 30 return 'python-sf1'
fazekasgy@9 31
fazekasgy@9 32 def getMaxChannelCount(self):
fazekasgy@9 33 return 1
fazekasgy@9 34
fazekasgy@9 35 def getInputDomain(self):
fazekasgy@9 36 return 'FrequencyDomain'
fazekasgy@9 37
fazekasgy@9 38 def getOutputDescriptors(self):
fazekasgy@9 39
fazekasgy@9 40 #descriptors are python dictionaries
fazekasgy@9 41 output0={
fazekasgy@9 42 'identifier':'vampy-sf1',
fazekasgy@9 43 'name':'Spectral Centroid',
fazekasgy@9 44 'description':'Spectral Centroid (Brightness)',
fazekasgy@9 45 'unit':' ',
fazekasgy@9 46 'hasFixedBinCount':True,
fazekasgy@9 47 'binCount':1,
fazekasgy@9 48 #'binNames':['1 Hz',1.5,'2 Hz',3,'4 Hz'],
fazekasgy@9 49 'hasKnownExtents':False,
fazekasgy@9 50 #'minValue':0.0,
fazekasgy@9 51 #'maxValue':0.0,
fazekasgy@9 52 'isQuantized':True,
fazekasgy@9 53 'quantizeStep':1.0,
fazekasgy@9 54 'sampleType':'OneSamplePerStep'
fazekasgy@9 55 #'sampleRate':48000.0
fazekasgy@9 56 }
fazekasgy@9 57
fazekasgy@9 58 #return a list of dictionaries
fazekasgy@9 59 return [output0]
fazekasgy@9 60
fazekasgy@9 61 def getParameterDescriptors(self):
fazekasgy@9 62 paramlist1={
fazekasgy@9 63 'identifier':'threshold',
fazekasgy@9 64 'name':'Noise threshold: ',
fazekasgy@9 65 'description':'Return null or delete this function if not needed.',
fazekasgy@9 66 'unit':'v',
fazekasgy@9 67 'minValue':0.0,
fazekasgy@9 68 'maxValue':0.5,
fazekasgy@9 69 'defaultValue':0.05,
fazekasgy@9 70 'isQuantized':False
fazekasgy@9 71 }
fazekasgy@9 72 return [paramlist1]
fazekasgy@9 73
fazekasgy@9 74 def setParameter(self,paramid,newval):
fazekasgy@9 75 if paramid == 'threshold' :
fazekasgy@9 76 self.threshold = newval
fazekasgy@9 77 return
fazekasgy@9 78
fazekasgy@9 79 def getParameter(self,paramid):
fazekasgy@9 80 if paramid == 'threshold' :
fazekasgy@9 81 return self.threshold
fazekasgy@9 82 else:
fazekasgy@9 83 return 0.0
fazekasgy@9 84
fazekasgy@13 85 def process(self,inbuf,timestamp):
fazekasgy@9 86 inArray = array(inbuf[0])
fazekasgy@9 87 crossing = False
fazekasgy@9 88 prev = self.previousSample
fazekasgy@9 89 count = 0.0
fazekasgy@9 90 numLin = 0.0
fazekasgy@9 91 denom = 0.0
fazekasgy@9 92 centroid = 0.0
fazekasgy@9 93
fazekasgy@9 94
fazekasgy@9 95 re = array(inbuf[2:len(inArray):2])
fazekasgy@9 96 im = array(inbuf[3:len(inArray):2])
fazekasgy@9 97 #we have two outputs defined thus we have to declare
fazekasgy@9 98 #them as empty dictionaries in our output list
fazekasgy@9 99 #in order to be able to return variable rate outputs
fazekasgy@9 100 output0=[]
fazekasgy@9 101 output1=[]
fazekasgy@9 102
fazekasgy@9 103 if sum(abs(inArray)) > self.threshold :
fazekasgy@9 104 for i in range(1,(len(inArray)/2)) :
fazekasgy@9 105
fazekasgy@9 106 re = inArray[i*2]
fazekasgy@9 107 im = inArray[i*2+1]
fazekasgy@9 108 freq = i * self.m_inputSampleRate / self.m_blockSize
fazekasgy@9 109 power = sqrt (re*re + im*im) / (self.m_blockSize/2)
fazekasgy@9 110 denom = denom + power
fazekasgy@9 111 numLin = numLin + freq * power
fazekasgy@9 112
fazekasgy@9 113 if denom != 0 :
fazekasgy@9 114 centroid = numLin / denom
fazekasgy@9 115
fazekasgy@9 116 else :
fazekasgy@9 117 centroid = 0.0
fazekasgy@9 118
fazekasgy@9 119 feature0={
fazekasgy@9 120 'hasTimestamp':False,
fazekasgy@9 121 'values':[centroid], #strictly must be a list
fazekasgy@9 122 'label':str(centroid)
fazekasgy@9 123 }
fazekasgy@9 124 output0.append(feature0)
fazekasgy@9 125
fazekasgy@9 126 #return a LIST of list of dictionaries
fazekasgy@9 127 return [output0]