Mercurial > hg > vampy
view Example VamPy plugins/obsolete/PySpectralCentroid.py @ 46:af9c4cee95a8
VC++ fixes.
Much of this is changing "and" to "&&". I had never realised
until today that "and" is in fact a keyword in C++, albeit not
one that has been there since the start, so this should compile
(I eventually looked this up having been puzzled by how this
code could ever build with any other compiler). However,
despite its keywordness, "and" still doesn't seem to be acceptable
to VC++. Possibly there's an option to change this, or one could
use a macro -- but why not just stick with the token that compilers
are known to like?
author | cannam |
---|---|
date | Mon, 05 Oct 2009 16:14:25 +0000 |
parents | 27bab3a16c9a |
children |
line wrap: on
line source
'''PySpectralCentroid.py - Example plugin demonstrates how to write a C style plugin using VamPy. Obsolete warning: this plugin will no longer be supported since the legacy interface should pass a list of complex numbers for frequency domain plugins and a list of floats for time domin plugins. ''' from numpy import * class PySpectralCentroid: def __init__(self,inputSampleRate): self.m_imputSampleRate = 0.0 self.m_stepSize = 0 self.m_blockSize = 0 self.m_channels = 0 self.previousSample = 0.0 self.m_inputSampleRate = inputSampleRate self.threshold = 0.00 def initialise(self,channels,stepSize,blockSize): self.m_channels = channels self.m_stepSize = stepSize self.m_blockSize = blockSize return True def getMaker(self): return 'Vampy Example Plugins' def getName(self): return 'Spectral Centroid (legacy process interface)' def getIdentifier(self): return 'vampy-sc2' def getMaxChannelCount(self): return 1 def getInputDomain(self): return 'FrequencyDomain' def getOutputDescriptors(self): output0={ 'identifier':'vampy-sf1', 'name':'Spectral Centroid', 'description':'Spectral Centroid (Brightness)', 'unit':' ', 'hasFixedBinCount':True, 'binCount':1, 'hasKnownExtents':False, 'isQuantized':True, 'quantizeStep':1.0, 'sampleType':'OneSamplePerStep' } return [output0] def getParameterDescriptors(self): paramlist1={ 'identifier':'threshold', 'name':'Noise threshold: ', 'description':'Return null or delete this function if not needed.', 'unit':'v', 'minValue':0.0, 'maxValue':0.5, 'defaultValue':0.05, 'isQuantized':False } return [paramlist1] def setParameter(self,paramid,newval): if paramid == 'threshold' : self.threshold = newval return def getParameter(self,paramid): if paramid == 'threshold' : return self.threshold else: return 0.0 def process(self,inbuf,timestamp): inArray = array(inbuf[0]) crossing = False prev = self.previousSample count = 0.0 numLin = 0.0 denom = 0.0 centroid = 0.0 # re = array(inbuf[2:len(inArray):2]) # im = array(inbuf[3:len(inArray):2]) output0=[] output1=[] # pw = 0 # for i in xrange(1,len(inbuf[0])) : # pw = pw + abs(inbuf[0][i]) if sum(abs(inArray)) > self.threshold : for i in range(1,(len(inArray)/2)) : # for i in range(1,len(inbuf[0])) : re = inArray[i*2] im = inArray[i*2+1] # re = inbuf[0][i].real # im = inbuf[0][i].imag freq = i * self.m_inputSampleRate / self.m_blockSize power = sqrt (re*re + im*im) / (self.m_blockSize/2) denom = denom + power numLin = numLin + freq * power if denom != 0 : centroid = numLin / denom else : centroid = 0.0 feature0={ 'hasTimestamp':False, 'values':[centroid], #strictly must be a list 'label':str(centroid) } output0.append(feature0) return [output0]