Transform.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import os.path
  2. import numpy as np
  3. import itertools
  4. import Tools
  5. import scipy.fftpack
  6. # Those patterns are used for tests and benchmarks.
  7. # For tests, there is the need to add tests for saturation
  8. FFTSIZES=[16,32,64,128,256,512,1024,2048,4096]
  9. SINES=[0.25,0.5,0.9]
  10. NOISES=[0.1,0.4]
  11. def asReal(a):
  12. #return(a.view(dtype=np.float64))
  13. return(a.reshape(np.size(a)).view(dtype=np.float64))
  14. def noiseSignal(nb):
  15. return(np.random.randn(nb))
  16. def sineSignal(freqRatio,nb):
  17. fc = nb / 2.0
  18. f = freqRatio*fc
  19. time = np.arange(0,nb)
  20. return(np.sin(2 * np.pi * f * time/nb))
  21. def noisySineSignal(noiseAmp,r,nb):
  22. return(noiseAmp*noiseSignal(nb) + r*sineSignal(0.25,nb))
  23. def stepSignal(r,nb):
  24. n = int(nb/2)
  25. return(np.concatenate((np.zeros(n), r*np.ones(n))))
  26. def writeFFTForSignal(config,sig,scaling,i,j,nb,signame):
  27. fft=scipy.fftpack.fft(sig)
  28. ifft = np.copy(fft)
  29. if scaling:
  30. fft = np.array([x/2**scaling[j] for x in fft])
  31. config.writeInput(i, asReal(sig),"ComplexInputSamples_%s_%d_" % (signame,nb))
  32. config.writeInput(i, asReal(fft),"ComplexFFTSamples_%s_%d_" % (signame,nb))
  33. config.writeInput(i, asReal(fft),"ComplexInputIFFTSamples_%s_%d_" % (signame,nb))
  34. def writeRFFTForSignal(config,sig,scaling,i,j,nb,signame):
  35. rfft=scipy.fftpack.rfft(sig)
  36. # Changed for f32 and f64 to reproduce CMSIS behavior.
  37. if not scaling:
  38. rfft=np.insert(rfft, 1, rfft[-1])
  39. rfft[-1]=0.0
  40. rifft = np.copy(rfft)
  41. else:
  42. rfft=np.insert(rfft, 1, 0.0)
  43. rifft = np.copy(rfft)
  44. if scaling:
  45. rfft = np.array([x/2**scaling[j] for x in rfft])
  46. rifft = np.hstack((rfft,rfft))
  47. rifft[rfft.size] = 0.0
  48. rifft[rfft.size+1:2*rfft.size:2] = np.flip(rfft[0:rfft.size-1:2])
  49. rifft[rfft.size+2:2*rfft.size:2] = -np.flip(rfft[1:rfft.size-1:2])
  50. rifft[2*rfft.size-2] = 0
  51. rifft[2*rfft.size-1] = 0
  52. config.writeInput(i, (sig),"RealInputSamples_%s_%d_" % (signame,nb))
  53. config.writeInput(i, (rfft),"RealFFTSamples_%s_%d_" % (signame,nb))
  54. config.writeInput(i, (rifft),"RealInputIFFTSamples_%s_%d_" % (signame,nb))
  55. def writeTests(configs):
  56. i = 1
  57. # Write FFT tests for sinusoid
  58. j = 0
  59. for nb in FFTSIZES:
  60. sig = noisySineSignal(0.05,0.7,nb)
  61. sigc = np.array([complex(x) for x in sig])
  62. for config,scaling in configs:
  63. writeFFTForSignal(config,sigc,scaling,i,j,nb,"Noisy")
  64. writeRFFTForSignal(config,sig,scaling,i,j,nb,"Noisy")
  65. i = i + 1
  66. j = j + 1
  67. # Write FFT tests for step
  68. j = 0
  69. for nb in FFTSIZES:
  70. sig = stepSignal(0.9,nb)
  71. sigc = np.array([complex(x) for x in sig])
  72. for config,scaling in configs:
  73. writeFFTForSignal(config,sigc,scaling,i,j,nb,"Step")
  74. writeRFFTForSignal(config,sig,scaling,i,j,nb,"Step")
  75. i = i + 1
  76. j = j + 1
  77. # Used for benchmarks
  78. data1=np.random.randn(512)
  79. data1 = Tools.normalize(data1)
  80. for config,scaling in configs:
  81. config.writeInput(i, data1,"RealInputSamples" )
  82. def generatePatterns():
  83. PATTERNDIR = os.path.join("Patterns","DSP","Transform","Transform")
  84. PARAMDIR = os.path.join("Parameters","DSP","Transform","Transform")
  85. configf64=Tools.Config(PATTERNDIR,PARAMDIR,"f64")
  86. configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
  87. configf16=Tools.Config(PATTERNDIR,PARAMDIR,"f16")
  88. configq31=Tools.Config(PATTERNDIR,PARAMDIR,"q31")
  89. configq15=Tools.Config(PATTERNDIR,PARAMDIR,"q15")
  90. scalings = [4,5,6,7,8,9,10,11,12]
  91. writeTests([(configf64,None),
  92. (configf32,None),
  93. (configf16,None)
  94. ,(configq31,scalings)
  95. ,(configq15,scalings)])
  96. if __name__ == '__main__':
  97. generatePatterns()