example_1_9.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. # Bug corrections for version 1.9
  2. import cmsisdsp as dsp
  3. import cmsisdsp.fixedpoint as f
  4. import numpy as np
  5. import math
  6. import colorama
  7. from colorama import init,Fore, Back, Style
  8. from numpy.testing import assert_allclose
  9. import matplotlib.pyplot as plt
  10. from scipy import signal
  11. init()
  12. def printTitle(s):
  13. print("\n" + Fore.GREEN + Style.BRIGHT + s + Style.RESET_ALL)
  14. def printSubTitle(s):
  15. print("\n" + Style.BRIGHT + s + Style.RESET_ALL)
  16. printTitle("Decimate")
  17. test_length_seconds = 0.1
  18. signal_frequency = 100
  19. sampling_freq = 8000
  20. nbSamples = int(test_length_seconds*sampling_freq)
  21. wave = np.sin(2*np.pi*signal_frequency*np.linspace(0,test_length_seconds,nbSamples))
  22. #plt.plot(wave)
  23. #plt.show()
  24. decimationFactor = 4
  25. numTaps = 9
  26. downsamplingFilter = signal.firwin(numTaps,1.0 / decimationFactor)
  27. block_size = 160
  28. assert(block_size % decimationFactor == 0)
  29. ds_state = np.zeros(block_size + len(downsamplingFilter)-1)
  30. decimator = dsp.arm_fir_decimate_instance_f32()
  31. status = dsp.arm_fir_decimate_init_f32(decimator,numTaps,decimationFactor, downsamplingFilter, ds_state)
  32. def processSignal(sig,dec,f):
  33. result = []
  34. for blockNb in range(len(sig) // block_size):
  35. s = blockNb * block_size
  36. e = s + block_size
  37. r = f(dec,sig[s:e])
  38. result.append(r)
  39. output = np.hstack(result)
  40. return(output)
  41. ref = processSignal(wave,decimator,dsp.arm_fir_decimate_f32)
  42. #plt.plot(ref)
  43. #plt.show()
  44. printSubTitle("Decimate Q31")
  45. waveQ31 = f.toQ31(wave)
  46. downsamplingFilterQ31 = f.toQ31(downsamplingFilter)
  47. stateQ31 = np.zeros(block_size + len(downsamplingFilter)-1)
  48. decimatorQ31 = dsp.arm_fir_decimate_instance_q31()
  49. status = dsp.arm_fir_decimate_init_q31(decimatorQ31,numTaps,decimationFactor,
  50. downsamplingFilterQ31, stateQ31)
  51. outputQ31 = processSignal(waveQ31,decimatorQ31,dsp.arm_fir_decimate_q31)
  52. outputF32 = f.Q31toF32(outputQ31)
  53. printSubTitle("Decimate Fast Q31")
  54. waveQ31 = f.toQ31(wave)
  55. downsamplingFilterQ31 = f.toQ31(downsamplingFilter)
  56. stateQ31 = np.zeros(block_size + len(downsamplingFilter)-1)
  57. decimatorQ31 = dsp.arm_fir_decimate_instance_q31()
  58. status = dsp.arm_fir_decimate_init_q31(decimatorQ31,numTaps,decimationFactor,
  59. downsamplingFilterQ31, stateQ31)
  60. outputQ31 = processSignal(waveQ31,decimatorQ31,dsp.arm_fir_decimate_fast_q31)
  61. outputF32 = f.Q31toF32(outputQ31)
  62. printSubTitle("Decimate Q15")
  63. waveQ15 = f.toQ15(wave)
  64. downsamplingFilterQ15 = f.toQ15(downsamplingFilter)
  65. stateQ15 = np.zeros(block_size + len(downsamplingFilter)-1)
  66. decimatorQ15 = dsp.arm_fir_decimate_instance_q15()
  67. status = dsp.arm_fir_decimate_init_q15(decimatorQ15,numTaps,decimationFactor,
  68. downsamplingFilterQ15, stateQ15)
  69. outputQ15 = processSignal(waveQ15,decimatorQ15,dsp.arm_fir_decimate_q15)
  70. outputF32 = f.Q15toF32(outputQ15)
  71. #plt.plot(outputF32)
  72. #plt.show()
  73. assert_allclose(ref,outputF32,rtol=2e-3,atol=1e-3)
  74. printSubTitle("Decimate Fast Q15")
  75. waveQ15 = f.toQ15(wave)
  76. downsamplingFilterQ15 = f.toQ15(downsamplingFilter)
  77. stateQ15 = np.zeros(block_size + len(downsamplingFilter)-1)
  78. decimatorQ15 = dsp.arm_fir_decimate_instance_q15()
  79. status = dsp.arm_fir_decimate_init_q15(decimatorQ15,numTaps,decimationFactor,
  80. downsamplingFilterQ15, stateQ15)
  81. outputQ15 = processSignal(waveQ15,decimatorQ15,dsp.arm_fir_decimate_fast_q15)
  82. outputF32 = f.Q15toF32(outputQ15)
  83. #plt.plot(outputF32)
  84. #plt.show()
  85. assert_allclose(ref,outputF32,rtol=2e-3,atol=1e-3)
  86. printTitle("Interpolate")
  87. upsamplingFactor = 4
  88. numTaps = 16
  89. upsamplingFilter = signal.firwin(numTaps,1.0 / upsamplingFactor)
  90. assert(numTaps % upsamplingFactor == 0)
  91. block_size = 40
  92. printSubTitle("Interpolate F32")
  93. state = np.zeros(block_size + len(upsamplingFilter)//upsamplingFactor-1)
  94. interpolator = dsp.arm_fir_interpolate_instance_f32()
  95. status = dsp.arm_fir_interpolate_init_f32(interpolator,upsamplingFactor,numTaps,
  96. upsamplingFilter, state)
  97. output = processSignal(ref,interpolator,dsp.arm_fir_interpolate_f32)
  98. output = output / np.max(output)
  99. #t = range(nbSamples)
  100. #plt.plot(t,wave,t[:-11],output[11:])
  101. #plt.show()
  102. d = 11
  103. assert_allclose(wave[:-d],output[d:],atol=0.1)
  104. printSubTitle("Interpolate Q31")
  105. upsamplingFilterQ31 = f.toQ31(upsamplingFilter)
  106. stateQ31 = np.zeros(block_size + len(upsamplingFilter)//upsamplingFactor-1)
  107. interpolatorQ31 = dsp.arm_fir_interpolate_instance_q31()
  108. status = dsp.arm_fir_interpolate_init_q31(interpolatorQ31,upsamplingFactor,numTaps,
  109. upsamplingFilterQ31, stateQ31)
  110. outputQ31 = processSignal(outputQ31,interpolatorQ31,dsp.arm_fir_interpolate_q31)
  111. outputF32 = f.Q31toF32(outputQ31)
  112. outputF32 = outputF32 / np.max(outputF32)
  113. assert_allclose(wave[:-d],outputF32[d:],atol=0.1)
  114. printSubTitle("Interpolate Q15")
  115. upsamplingFilterQ15 = f.toQ15(upsamplingFilter)
  116. stateQ15 = np.zeros(block_size + len(upsamplingFilter)//upsamplingFactor-1)
  117. interpolatorQ15 = dsp.arm_fir_interpolate_instance_q15()
  118. status = dsp.arm_fir_interpolate_init_q15(interpolatorQ15,upsamplingFactor,numTaps,
  119. upsamplingFilterQ15, stateQ15)
  120. outputQ15 = processSignal(outputQ15,interpolatorQ15,dsp.arm_fir_interpolate_q15)
  121. outputF32 = f.Q15toF32(outputQ15)
  122. outputF32 = outputF32 / np.max(outputF32)
  123. assert_allclose(wave[:-d],outputF32[d:],atol=0.1)