| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- 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)
|