110 lines
2.6 KiB
Python
Executable File
110 lines
2.6 KiB
Python
Executable File
from cmsisdsp.sdf.scheduler import *
|
|
|
|
|
|
AUDIO_INTERRUPT_LENGTH = 160
|
|
MFCCFEATURESSIZE=10
|
|
NBOUTMFCC=50
|
|
OVERLAPMFCC=25
|
|
floatType=CType(F32)
|
|
|
|
|
|
### Define new types of Nodes
|
|
|
|
class Node(GenericNode):
|
|
def __init__(self,name,theType,inLength,outLength):
|
|
GenericNode.__init__(self,name)
|
|
self.addInput("i",theType,inLength)
|
|
self.addOutput("o",theType,outLength)
|
|
|
|
@property
|
|
def typeName(self):
|
|
return "Node"
|
|
|
|
class StereoSource(GenericSource):
|
|
def __init__(self,name,inLength):
|
|
GenericSource.__init__(self,name)
|
|
self.addOutput("o",floatType,2*inLength)
|
|
|
|
@property
|
|
def typeName(self):
|
|
return "StereoSource"
|
|
|
|
# This is a fake TFLite node just for illustration
|
|
class TFLite(GenericSink):
|
|
def __init__(self,name):
|
|
GenericSink.__init__(self,name)
|
|
self.addInput("i",floatType,NBOUTMFCC*MFCCFEATURESSIZE)
|
|
|
|
@property
|
|
def typeName(self):
|
|
return "TFLite"
|
|
|
|
# This is a fake MFCC just to illustrate how it could be used in a graph.
|
|
# For a real MFCC example, look at example5
|
|
class MFCC(GenericNode):
|
|
def __init__(self,name,inLength):
|
|
GenericNode.__init__(self,name)
|
|
|
|
self.addInput("i",floatType,inLength)
|
|
self.addOutput("o",floatType,MFCCFEATURESSIZE)
|
|
|
|
@property
|
|
def typeName(self):
|
|
return "MFCC"
|
|
|
|
|
|
### Define nodes
|
|
half=Constant("HALF")
|
|
src=StereoSource("src",AUDIO_INTERRUPT_LENGTH)
|
|
toMono=Unzip("toMono",floatType, AUDIO_INTERRUPT_LENGTH)
|
|
|
|
sa=Dsp("scale",floatType,AUDIO_INTERRUPT_LENGTH)
|
|
sb=Dsp("scale",floatType,AUDIO_INTERRUPT_LENGTH)
|
|
|
|
add=Dsp("add",floatType,AUDIO_INTERRUPT_LENGTH)
|
|
|
|
audioWindow=SlidingBuffer("audioWin",floatType,640,320)
|
|
mfcc=MFCC("mfcc",640)
|
|
|
|
mfccWindow=SlidingBuffer("mfccWind",floatType,NBOUTMFCC*MFCCFEATURESSIZE,OVERLAPMFCC*MFCCFEATURESSIZE)
|
|
tf=TFLite("TFLite")
|
|
|
|
g = Graph()
|
|
|
|
g.connectWithDelay(src.o, toMono.i,10)
|
|
g.connect(toMono.o1,sa.ia)
|
|
g.connect(toMono.o2,sb.ia)
|
|
|
|
# A constant node as no output
|
|
# So it is connected directly
|
|
g.connect(half,sa.ib)
|
|
g.connect(half,sb.ib)
|
|
|
|
g.connect(sa.o,add.ia)
|
|
g.connect(sb.o,add.ib)
|
|
|
|
g.connect(add.o,audioWindow.i)
|
|
g.connect(audioWindow.o, mfcc.i)
|
|
g.connect(mfcc.o,mfccWindow.i)
|
|
g.connect(mfccWindow.o,tf.i)
|
|
|
|
print("Generate graphviz and code")
|
|
|
|
conf=Configuration()
|
|
conf.debugLimit=1
|
|
conf.cOptionalArgs="int opt1,int opt2"
|
|
#conf.memoryOptimization=True
|
|
#print(g.nullVector())
|
|
sched = g.computeSchedule(conf)
|
|
#print(sched.schedule)
|
|
print("Schedule length = %d" % sched.scheduleLength)
|
|
print("Memory usage %d bytes" % sched.memory)
|
|
#
|
|
|
|
#conf.codeArray=True
|
|
sched.ccode("generated",conf)
|
|
|
|
with open("test.dot","w") as f:
|
|
sched.graphviz(f)
|
|
|