Transform.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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 randComplex(nb):
  12. data = np.random.randn(2*nb)
  13. data = Tools.normalize(data)
  14. data_comp = data.view(dtype=np.complex128)
  15. return(data_comp)
  16. def asReal(a):
  17. #return(a.view(dtype=np.float64))
  18. return(a.reshape(np.size(a)).view(dtype=np.float64))
  19. def randComplex(nb):
  20. data = np.random.randn(2*nb)
  21. data = Tools.normalize(data)
  22. data_comp = data.view(dtype=np.complex128)
  23. return(data_comp)
  24. def asReal(a):
  25. #return(a.view(dtype=np.float64))
  26. return(a.reshape(np.size(a)).view(dtype=np.float64))
  27. def noiseSignal(nb):
  28. return(np.random.randn(nb))
  29. def sineSignal(freqRatio,nb):
  30. fc = nb / 2.0
  31. f = freqRatio*fc
  32. time = np.arange(0,nb)
  33. return(np.sin(2 * np.pi * f * time/nb))
  34. def noisySineSignal(noiseAmp,r,nb):
  35. return(noiseAmp*noiseSignal(nb) + r*sineSignal(0.25,nb))
  36. def stepSignal(r,nb):
  37. n = int(nb/2)
  38. return(np.concatenate((np.zeros(n), r*np.ones(n))))
  39. def writeFFTForSignal(config,sig,scaling,i,j,nb,signame):
  40. fft=scipy.fftpack.fft(sig)
  41. ifft = np.copy(fft)
  42. if scaling:
  43. fft = np.array([x/2**scaling[j] for x in fft])
  44. config.writeInput(i, asReal(sig),"ComplexInputSamples_%s_%d_" % (signame,nb))
  45. config.writeInput(i, asReal(fft),"ComplexFFTSamples_%s_%d_" % (signame,nb))
  46. config.writeInput(i, asReal(fft),"ComplexInputIFFTSamples_%s_%d_" % (signame,nb))
  47. def writeTests(configs):
  48. i = 1
  49. # Write FFT tests for sinusoid
  50. j = 0
  51. for nb in FFTSIZES:
  52. sig = noisySineSignal(0.05,0.7,nb)
  53. sig = np.array([complex(x) for x in sig])
  54. for config,scaling in configs:
  55. writeFFTForSignal(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. sig = np.array([complex(x) for x in sig])
  63. for config,scaling in configs:
  64. writeFFTForSignal(config,sig,scaling,i,j,nb,"Step")
  65. i = i + 1
  66. j = j + 1
  67. data1=np.random.randn(512)
  68. data1 = Tools.normalize(data1)
  69. for config,scaling in configs:
  70. config.writeInput(i, data1,"RealInputSamples" )
  71. def generatePatterns():
  72. PATTERNDIR = os.path.join("Patterns","DSP","Transform","Transform")
  73. PARAMDIR = os.path.join("Parameters","DSP","Transform","Transform")
  74. configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
  75. configq31=Tools.Config(PATTERNDIR,PARAMDIR,"q31")
  76. configq15=Tools.Config(PATTERNDIR,PARAMDIR,"q15")
  77. scalings = [4,5,6,7,8,9,10,11,12]
  78. writeTests([(configf32,None)
  79. ,(configq31,scalings)
  80. ,(configq15,scalings)])
  81. if __name__ == '__main__':
  82. generatePatterns()