Decimate.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. import os.path
  2. import numpy as np
  3. import itertools
  4. import Tools
  5. from scipy.signal import firwin
  6. import scipy.signal
  7. import math
  8. from scipy.signal import upfirdn
  9. #from pylab import figure, clf, plot, xlabel, ylabel, xlim, ylim, title, grid, axes, show,semilogx, semilogy
  10. # scipy 1.4.0 at lest is needed
  11. # Those patterns are used for tests and benchmarks.
  12. # This is containing patterns for decimation and interpolation
  13. def cartesian(*somelists):
  14. r=[]
  15. for element in itertools.product(*somelists):
  16. r.append(element)
  17. return(r)
  18. def writeBenchmarks(config):
  19. NBSAMPLES=256
  20. NUMTAPS = 64
  21. samples=np.random.randn(NBSAMPLES)
  22. taps=np.random.randn(NUMTAPS)
  23. samples = Tools.normalize(samples)
  24. taps =Tools.normalize(taps)
  25. config.writeInput(1, samples,"Samples")
  26. config.writeInput(1, taps,"Coefs")
  27. def generateBenchmarkPatterns():
  28. PATTERNDIR = os.path.join("Patterns","DSP","Filtering","DECIM","DECIM")
  29. PARAMDIR = os.path.join("Parameters","DSP","Filtering","DECIM","DECIM")
  30. configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
  31. configf16=Tools.Config(PATTERNDIR,PARAMDIR,"f16")
  32. configq31=Tools.Config(PATTERNDIR,PARAMDIR,"q31")
  33. configq15=Tools.Config(PATTERNDIR,PARAMDIR,"q15")
  34. writeBenchmarks(configf32)
  35. writeBenchmarks(configf16)
  36. writeBenchmarks(configq31)
  37. writeBenchmarks(configq15)
  38. # For decimation, number of samples must be a multiple of decimation factor.
  39. # So we cannot use a generator in the test description.
  40. numTaps = [1,2,4,8,16]
  41. blockSizeFactor = [1,2,4,8,16]
  42. decimationFactor = [4,5,8]
  43. combinations = [numTaps,blockSizeFactor,decimationFactor]
  44. finalLength = 3 * len(numTaps) * len(decimationFactor) * len(blockSizeFactor)
  45. r=np.array([(n,blFactor*dFactor,dFactor) for (n,blFactor,dFactor) in itertools.product(*combinations)])
  46. r = r.reshape(finalLength)
  47. configf32.writeParam(1, r)
  48. configf16.writeParam(1, r)
  49. configq31.writeParam(1, r)
  50. configq15.writeParam(1, r)
  51. # For interpolation, number taps must be a multiple of interpolation factor.
  52. # So we cannot use a generator in the test description.
  53. numTapsFactor = [1,2,4,8]
  54. blockSize = [16,64]
  55. interpolationFactor = [2,4,5,8,9]
  56. combinations = [numTapsFactor,blockSize,interpolationFactor]
  57. finalLength = 3 * len(numTapsFactor) * len(interpolationFactor) * len(blockSize)
  58. r=np.array([(nFactor * iFactor,bl,iFactor) for (nFactor,bl,iFactor) in itertools.product(*combinations)])
  59. r = r.reshape(finalLength)
  60. configf32.writeParam(2, r)
  61. configf16.writeParam(2, r)
  62. configq31.writeParam(2, r)
  63. configq15.writeParam(2, r)
  64. def writeDecimateTests(config,startNb,format):
  65. decimates=[1,2,4,8]
  66. blocksFactor=[Tools.loopnb(format,Tools.TAILONLY),
  67. Tools.loopnb(format,Tools.BODYONLY),
  68. Tools.loopnb(format,Tools.BODYANDTAIL)
  69. ]
  70. numTaps =[
  71. Tools.loopnb(format,Tools.TAILONLY),
  72. Tools.loopnb(format,Tools.BODYONLY),
  73. Tools.loopnb(format,Tools.BODYANDTAIL),
  74. Tools.loopnb(format,Tools.TAILONLY)+1,
  75. Tools.loopnb(format,Tools.BODYONLY)+1,
  76. Tools.loopnb(format,Tools.BODYANDTAIL)+1
  77. ]
  78. #decimates=[2]
  79. #blocks=[1]
  80. #numTaps =[8,16]
  81. #if format==15:
  82. # factor=5
  83. #else:
  84. # factor=6
  85. factor = 1
  86. ref = []
  87. allConfigs=cartesian(decimates,blocksFactor,numTaps)
  88. allsamples=[]
  89. allcoefs=[]
  90. alloutput=[]
  91. for (q,blockF,numTaps) in allConfigs:
  92. b = np.array(list(range(1,numTaps+1)))/(3.0*(numTaps+2))
  93. # nbsamples must be multiple of q
  94. nbsamples=factor*blockF*q
  95. samples=np.random.randn(nbsamples)
  96. samples=Tools.normalize(samples)
  97. #output=scipy.signal.decimate(samples,q,ftype=scipy.signal.dlti(b,1.0),zero_phase=False)
  98. output=upfirdn(b,samples,up=1,down=q,axis=-1,mode='constant',cval=0)
  99. output=output[0:factor*blockF]
  100. #print(debug-output)
  101. allsamples += list(samples)
  102. alloutput += list(output)
  103. allcoefs += list(reversed(b))
  104. ref += [q,len(b),len(samples),len(output)]
  105. config.writeInput(startNb, allsamples)
  106. config.writeInput(startNb, allcoefs,"Coefs")
  107. config.writeReference(startNb, alloutput)
  108. config.writeInputU32(2, ref,"Configs")
  109. startNb = startNb + 1
  110. return(startNb)
  111. def writeInterpolateTests(config,startNb,format):
  112. #interpolate=[2,4,8]
  113. #blocks=[1,2,4,8,16]
  114. #numTaps =[1,2,4,8,16]
  115. interpolate=[1,2,4,5,8,9]
  116. blocks=[Tools.loopnb(format,Tools.TAILONLY),
  117. Tools.loopnb(format,Tools.BODYONLY),
  118. Tools.loopnb(format,Tools.BODYANDTAIL),]
  119. numTapsFactor =[4,8]
  120. ref = []
  121. allConfigs=cartesian(interpolate,blocks,numTapsFactor)
  122. allsamples=[]
  123. allcoefs=[]
  124. alloutput=[]
  125. for (q,blockSize,numTapsF) in allConfigs:
  126. # numTaps must be a multiple of q
  127. numTaps = numTapsF * q
  128. b = np.array(list(range(1,numTaps+1)))/(3.0*(numTaps+2))
  129. nbsamples=blockSize
  130. samples=np.random.randn(nbsamples)
  131. samples=Tools.normalize(samples)
  132. #output=scipy.signal.decimate(samples,q,ftype=scipy.signal.dlti(b,1.0),zero_phase=False)
  133. output=upfirdn(b,samples,up=q,down=1,axis=-1,mode='constant',cval=0)
  134. output=output[0:blockSize*q]
  135. #print(debug-output)
  136. allsamples += list(samples)
  137. alloutput += list(output)
  138. allcoefs += list(reversed(b))
  139. ref += [q,len(b),len(samples),len(output)]
  140. config.writeInput(startNb, allsamples)
  141. config.writeInput(startNb, allcoefs,"Coefs")
  142. config.writeReference(startNb, alloutput)
  143. config.writeInputU32(startNb, ref,"Configs")
  144. startNb = startNb + 1
  145. return(startNb)
  146. def writeTests(config,format):
  147. # Benchmark ID is finishing at 1
  148. # So we start at 2 for file ID for tests.
  149. startNb = 2
  150. startNb=writeDecimateTests(config,startNb,format)
  151. startNb=writeInterpolateTests(config,startNb,format)
  152. def generateTestPatterns():
  153. PATTERNDIR = os.path.join("Patterns","DSP","Filtering","DECIM","DECIM")
  154. PARAMDIR = os.path.join("Parameters","DSP","Filtering","DECIM","DECIM")
  155. configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
  156. configf16=Tools.Config(PATTERNDIR,PARAMDIR,"f16")
  157. configq31=Tools.Config(PATTERNDIR,PARAMDIR,"q31")
  158. configq15=Tools.Config(PATTERNDIR,PARAMDIR,"q15")
  159. writeTests(configf32,0)
  160. writeTests(configf16,16)
  161. writeTests(configq31,31)
  162. writeTests(configq15,15)
  163. if __name__ == '__main__':
  164. generateBenchmarkPatterns()
  165. generateTestPatterns()