BasicMaths.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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 writeTests(config,format):
  8. NBSAMPLES=256
  9. data1=np.random.randn(NBSAMPLES)
  10. data2=np.random.randn(NBSAMPLES)
  11. data3=np.random.randn(1)
  12. data1 = data1/max(data1)
  13. data2 = data1/max(data2)
  14. config.writeInput(1, data1)
  15. config.writeInput(2, data2)
  16. ref = data1 + data2
  17. config.writeReference(1, ref)
  18. ref = data1 - data2
  19. config.writeReference(2, ref)
  20. ref = data1 * data2
  21. config.writeReference(3, ref)
  22. ref = -data1
  23. config.writeReference(4, ref)
  24. ref = data1 + 0.5
  25. config.writeReference(5, ref)
  26. ref = data1 * 0.5
  27. config.writeReference(6, ref)
  28. nb = 3
  29. ref = np.array([np.dot(data1[0:nb] ,data2[0:nb])]) / 2**15
  30. if format == 31 or format == 15:
  31. config.writeReferenceQ63(7, ref)
  32. elif format == 7:
  33. config.writeReferenceQ31(7, ref)
  34. else:
  35. config.writeReference(7, ref)
  36. nb = 8
  37. ref = np.array([np.dot(data1[0:nb] ,data2[0:nb])]) / 2**15
  38. if format == 31 or format == 15:
  39. config.writeReferenceQ63(8, ref)
  40. elif format == 7:
  41. config.writeReferenceQ31(8, ref)
  42. else:
  43. config.writeReference(8, ref)
  44. nb = 9
  45. ref = np.array([np.dot(data1[0:nb] ,data2[0:nb])]) / 2**15
  46. if format == 31 or format == 15:
  47. config.writeReferenceQ63(9, ref)
  48. elif format == 7:
  49. config.writeReferenceQ31(9, ref)
  50. else:
  51. config.writeReference(9, ref)
  52. ref = abs(data1)
  53. config.writeReference(10, ref)
  54. ref = np.array([np.dot(data1 ,data2)])
  55. config.writeReference(11, ref)
  56. return(11)
  57. def writeTestsWithSat(config,format):
  58. if format == 31:
  59. NBSAMPLES=9
  60. if format == 15:
  61. NBSAMPLES=17
  62. if format == 7:
  63. NBSAMPLES=33
  64. nb = writeTests(config,format)
  65. data1 = np.full(NBSAMPLES, 2**format - 1)
  66. data1[1::2] = 2
  67. data2 = np.full(NBSAMPLES, -2**format)
  68. data2[1::2] = -2
  69. datar=np.random.randn(NBSAMPLES)
  70. datar = datar/max(datar)
  71. datar = datar / 3.0 # Because used to test shift of 2 without saturation
  72. config.writeInput(12, datar)
  73. if format == 31:
  74. config.writeInputS32(12,data1-1,"MaxPosInput")
  75. config.writeInputS32(12,data2+1,"MaxNegInput")
  76. config.writeInputS32(12,data2,"MaxNeg2Input")
  77. if format == 15:
  78. config.writeInputS16(12,data1-1,"MaxPosInput")
  79. config.writeInputS16(12,data2+1,"MaxNegInput")
  80. config.writeInputS16(12,data2,"MaxNeg2Input")
  81. if format == 7:
  82. config.writeInputS8(12,data1-1,"MaxPosInput")
  83. config.writeInputS8(12,data2+1,"MaxNegInput")
  84. config.writeInputS8(12,data2,"MaxNeg2Input")
  85. d1 = 1.0*(data1-1) / 2**format
  86. d2 = 1.0*(data2+1) / 2**format
  87. d3 = 1.0*(data2) / 2**format
  88. ref = d1 + d1
  89. config.writeReference(nb+1, ref,"PosSat")
  90. ref = d2 + d2
  91. config.writeReference(nb+2, ref,"NegSat")
  92. d1 = 1.0*(data1-1) / 2**format
  93. d2 = 1.0*(data2+1) / 2**format
  94. ref = d1 - d2
  95. config.writeReference(nb+3, ref,"PosSat")
  96. ref = d2 - d1
  97. config.writeReference(nb+4, ref,"NegSat")
  98. ref = d3*d3
  99. config.writeReference(nb+5, ref,"PosSat")
  100. ref = -d3
  101. config.writeReference(nb+6, ref,"PosSat")
  102. ref = d1 + 0.9
  103. config.writeReference(nb+7, ref,"PosSat")
  104. ref = d2 - 0.9
  105. config.writeReference(nb+8, ref,"NegSat")
  106. ref = d3 * d3[0]
  107. config.writeReference(nb+9, ref,"PosSat")
  108. ref = datar * 2.0
  109. config.writeReference(nb+10, ref,"Shift")
  110. ref = d1 * 2.0
  111. config.writeReference(nb+11, ref,"Shift")
  112. ref = d2 * 2.0
  113. config.writeReference(nb+12, ref,"Shift")
  114. PATTERNDIR = os.path.join("Patterns","DSP","BasicMaths","BasicMaths")
  115. PARAMDIR = os.path.join("Parameters","DSP","BasicMaths","BasicMaths")
  116. configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
  117. configq31=Tools.Config(PATTERNDIR,PARAMDIR,"q31")
  118. configq15=Tools.Config(PATTERNDIR,PARAMDIR,"q15")
  119. configq7=Tools.Config(PATTERNDIR,PARAMDIR,"q7")
  120. #writeTests(configf32,0)
  121. writeTestsWithSat(configq31,31)
  122. writeTestsWithSat(configq15,15)
  123. writeTestsWithSat(configq7,7)
  124. # Params just as example
  125. someLists=[[1,3,5],[1,3,5],[1,3,5]]
  126. r=np.array([element for element in itertools.product(*someLists)])
  127. configf32.writeParam(1, r.reshape(81))