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]
|