Transform.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. if scaling:
  42. rfft = np.array([x/2**scaling[j] for x in rfft])
  43. config.writeInput(i, (sig),"RealInputSamples_%s_%d_" % (signame,nb))
  44. config.writeInput(i, (rfft),"RealFFTSamples_%s_%d_" % (signame,nb))
  45. config.writeInput(i, (rfft),"RealInputIFFTSamples_%s_%d_" % (signame,nb))
  46. def writeTests(configs):
  47. i = 1
  48. # Write FFT tests for sinusoid
  49. j = 0
  50. for nb in FFTSIZES:
  51. sig = noisySineSignal(0.05,0.7,nb)
  52. sigc = np.array([complex(x) for x in sig])
  53. for config,scaling in configs:
  54. writeFFTForSignal(config,sigc,scaling,i,j,nb,"Noisy")
  55. writeRFFTForSignal(config,sig,scaling,i,j,nb,"Noisy")
  56. i = i + 1
  57. j = j + 1
  58. # Write FFT tests for step
  59. j = 0
  60. for nb in FFTSIZES:
  61. sig = stepSignal(0.9,nb)
  62. sigc = np.array([complex(x) for x in sig])
  63. for config,scaling in configs:
  64. writeFFTForSignal(config,sigc,scaling,i,j,nb,"Step")
  65. writeRFFTForSignal(config,sig,scaling,i,j,nb,"Step")
  66. i = i + 1
  67. j = j + 1
  68. # Used for benchmarks
  69. data1=np.random.randn(512)
  70. data1 = Tools.normalize(data1)
  71. for config,scaling in configs:
  72. config.writeInput(i, data1,"RealInputSamples" )
  73. def generatePatterns():
  74. PATTERNDIR = os.path.join("Patterns","DSP","Transform","Transform")
  75. PARAMDIR = os.path.join("Parameters","DSP","Transform","Transform")
  76. configf64=Tools.Config(PATTERNDIR,PARAMDIR,"f64")
  77. configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
  78. configq31=Tools.Config(PATTERNDIR,PARAMDIR,"q31")
  79. configq15=Tools.Config(PATTERNDIR,PARAMDIR,"q15")
  80. scalings = [4,5,6,7,8,9,10,11,12]
  81. writeTests([(configf64,None),
  82. (configf32,None)
  83. ,(configq31,scalings)
  84. ,(configq15,scalings)])
  85. if __name__ == '__main__':
  86. generatePatterns()