phase-encoding-simple.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #!/usr/bin/env python3
  2. # -*- coding: UTF-8 -*-
  3. from scipy.optimize import differential_evolution
  4. import numpy as np
  5. voxel_num = 5
  6. phase_range = np.pi
  7. phase_init = 0.0
  8. total_periods = 50
  9. rf_samples_per_period = 10
  10. voxel_amplitudes = np.random.rand(voxel_num)
  11. test_amplitudes = np.zeros(voxel_num)
  12. test_amplitudes = voxel_amplitudes
  13. voxel_phases = np.linspace(0,phase_range, voxel_num)
  14. if len(voxel_amplitudes) != len(voxel_phases):
  15. print("ERROR! Size of amplitude and phase arrays do not match!")
  16. raise
  17. omega = 2*np.pi
  18. period = 2*np.pi/omega
  19. time_steps = np.linspace(0, period*total_periods, rf_samples_per_period*total_periods)
  20. def rf_signal(time):
  21. signal = 0.0
  22. for i in range(voxel_num):
  23. signal += voxel_amplitudes[i]*np.sin(
  24. omega*time + voxel_phases[i] + phase_init
  25. )
  26. return signal
  27. def assumed_signal(time, amplitudes):
  28. signal = 0.0
  29. for i in range(voxel_num):
  30. signal += amplitudes[i]*np.sin(
  31. omega*time + voxel_phases[i] + phase_init
  32. )
  33. return signal
  34. def fitness(amplitudes):
  35. diff = rf_signal(time_steps) - assumed_signal(time_steps, amplitudes)
  36. return np.sqrt(np.mean(np.square(diff)))
  37. #print(voxel_phases)
  38. print (voxel_amplitudes)
  39. # import matplotlib.pyplot as plt
  40. # plt.plot(time_steps, rf_signal(time_steps))
  41. # plt.show()
  42. #print(fitness(test_amplitudes))
  43. bounds = []
  44. minmax = (0,1)
  45. for i in range(voxel_num):
  46. bounds.append(minmax)
  47. result = differential_evolution(fitness, bounds, polish=True)
  48. print(result.x, result.fun)
  49. print("Diff")
  50. print((voxel_amplitudes-result.x))
  51. print("percent")
  52. print((voxel_amplitudes-result.x)*100)