Convolutions.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import os.path
  2. import numpy as np
  3. import itertools
  4. import Tools
  5. # Those patterns are used for tests and benchmarks.
  6. # For tests, there is the need to add tests for saturation
  7. def cartesian(*somelists):
  8. r=[]
  9. for element in itertools.product(*somelists):
  10. r.append(element)
  11. return(r)
  12. def writeTests(config,format):
  13. NBSAMPLES=128
  14. inputsA=np.random.randn(NBSAMPLES)
  15. inputsB=np.random.randn(NBSAMPLES)
  16. inputsA = Tools.normalize(inputsA)
  17. inputsB = Tools.normalize(inputsB)
  18. if format==31:
  19. # To avoid overflow. There is no saturation in CMSIS code for Q31 conv/corr
  20. inputsA = inputsA / 16
  21. inputsB = inputsB / 16
  22. config.writeInput(1, inputsA,"InputsA")
  23. config.writeInput(1, inputsB,"InputsB")
  24. a = [1,2,3,Tools.loopnb(format,Tools.TAILONLY),
  25. Tools.loopnb(format,Tools.BODYONLY),
  26. Tools.loopnb(format,Tools.BODYANDTAIL)
  27. ]
  28. a = list(np.unique(np.array(a)))
  29. if format == 15:
  30. nbs = [(14, 15), (14, 16), (14, 17), (14, 18), (14, 33), (15, 15),
  31. (15, 16), (15, 17), (15, 18), (15, 33), (16, 15), (16, 16),
  32. (16, 17), (16, 18), (16, 33), (17, 15), (17, 16), (17, 17),
  33. (17, 18), (17, 33), (32, 15), (32, 16), (32, 17), (32, 18), (32, 33)]
  34. elif format == 7 :
  35. nbs = [(30, 31), (30, 32), (30, 33), (30, 34), (30, 49), (31, 31),
  36. (31,32), (31, 33), (31, 34), (31, 49), (32, 31), (32, 32),
  37. (32, 33), (32,34), (32, 49), (33, 31), (33, 32), (33, 33), (33, 34),
  38. (33, 49), (48,31), (48, 32), (48, 33), (48, 34), (48, 49)]
  39. else:
  40. nbs = [(4, 1), (4, 2), (4, 3), (4, 8), (4, 11), (5, 1), (5, 2), (5, 3), (5, 8), (5, 11), (6, 1), (6, 2), (6, 3), (6, 8), (6, 11), (9, 1), (9, 2),
  41. (9, 3), (9, 8), (9, 11), (10, 1), (10, 2), (10, 3), (10, 8), (10, 11), (11, 1), (11, 2), (11, 3), (11, 8), (11, 11), (12, 1), (12, 2),
  42. (12, 3), (12, 8), (12, 11), (13, 1), (13, 2), (13, 3), (13, 8), (13, 11)]
  43. nbTest = 1
  44. for (na,nb) in nbs:
  45. #print(na,nb)
  46. ref = np.correlate(inputsA[0:na],inputsB[0:nb],"full")
  47. if na > nb:
  48. padding = na - nb
  49. z = np.zeros(padding)
  50. ref = np.concatenate((z,ref))
  51. else:
  52. padding = nb - na
  53. z = np.zeros(padding)
  54. ref = np.concatenate((ref,z))
  55. config.writeReference(nbTest, ref)
  56. nbTest = nbTest + 1
  57. for (na,nb) in nbs:
  58. #print(na,nb)
  59. ref = np.convolve(inputsA[0:na],inputsB[0:nb],"full")
  60. config.writeReference(nbTest, ref)
  61. nbTest = nbTest + 1
  62. def generatePatterns():
  63. PATTERNDIR = os.path.join("Patterns","DSP","Filtering","MISC","MISC")
  64. PARAMDIR = os.path.join("Parameters","DSP","Filtering","MISC","MISC")
  65. configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
  66. configq31=Tools.Config(PATTERNDIR,PARAMDIR,"q31")
  67. configq15=Tools.Config(PATTERNDIR,PARAMDIR,"q15")
  68. configq7=Tools.Config(PATTERNDIR,PARAMDIR,"q7")
  69. writeTests(configf32,0)
  70. writeTests(configq31,31)
  71. writeTests(configq15,15)
  72. writeTests(configq7,7)
  73. if __name__ == '__main__':
  74. generatePatterns()