ESSSST.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import json
  2. import base64
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. def decode_and_plot_channel(json_path, target_channel=1, dtype=np.float32):
  6. with open(json_path, 'r', encoding='utf-8') as f:
  7. data = json.load(f)
  8. # Берём первый измерительный блок
  9. measurement = data[0]
  10. channels = measurement["channel_data"]
  11. # Ищем нужный канал
  12. for ch in channels:
  13. if ch["channel_num"] == target_channel:
  14. encoded = ch["channel_data"]
  15. raw_bytes = base64.b64decode(encoded)
  16. arr = np.frombuffer(raw_bytes, dtype=dtype)
  17. plt.plot(arr, label=f"Канал {target_channel}")
  18. plt.xlabel("Индекс")
  19. plt.ylabel("Амплитуда")
  20. plt.title(f"График сигнала из канала {target_channel}")
  21. plt.grid(True)
  22. plt.legend()
  23. plt.tight_layout()
  24. plt.show()
  25. return
  26. print(f"Канал с номером {target_channel} не найден.")
  27. import json
  28. import base64
  29. import numpy as np
  30. import scipy.fft as fft
  31. import matplotlib.pyplot as plt
  32. class DataDecoder:
  33. def __init__(self, filename):
  34. self.data = ''
  35. with open(filename, 'r') as file:
  36. self.data = file.read()
  37. self.structed_data = json.loads(self.data)
  38. def getRawData(self, averaging_num=0, data_num=0, channel_num=0):
  39. for items in self.structed_data:
  40. if(items['averaging_num'] == averaging_num and items['data_num'] == data_num):
  41. for channel_data in items['channel_data']:
  42. if(channel_data['channel_num'] == channel_num):
  43. return channel_data['channel_data']
  44. return None
  45. def getDataDecoded(self, averaging_num=0, data_num=0, channel_num=0, points=10):
  46. rawData = self.getRawData(averaging_num, data_num, channel_num)
  47. edata = base64.b64decode(rawData.encode('utf-8'))
  48. arr = np.frombuffer(edata, dtype=np.int16, count=points, offset=0)
  49. return arr
  50. def getDataScaled(self, averaging_num=0, data_num=0, channel_num=0, points=10, range=5.0):
  51. decodedData = self.getDataDecoded(averaging_num, data_num, channel_num, points)
  52. return range * decodedData / 32768
  53. def getDataRate(self, averaging_num=0, data_num=0):
  54. for items in self.structed_data:
  55. if(items['averaging_num'] == averaging_num and items['data_num'] == data_num):
  56. return items['measurement_rate']
  57. def getDataSpectrum(self, averaging_num=0, data_num=0, channel_num=0, points=10, range=5.0, zero_fill=0, first_idx=0, last_idx=10):
  58. scaledData = self.getDataScaled(averaging_num, data_num, channel_num, points, range)
  59. zerofilledData = np.append(scaledData[first_idx:last_idx], np.zeros(zero_fill))
  60. rate = self.getDataRate()
  61. transferedData = fft.rfft(zerofilledData) * 2 / (last_idx-first_idx)
  62. freqs = fft.rfftfreq((last_idx-first_idx)+zero_fill, 1/rate)
  63. spectrum = np.abs(transferedData)
  64. phases = np.angle(transferedData)
  65. spect_dict = {'freqs': freqs,
  66. 'phases': phases,
  67. 'spectrum': spectrum}
  68. return spect_dict
  69. def getDataPoints(self, averaging_num=0, data_num=0):
  70. for items in self.structed_data:
  71. if(items['averaging_num'] == averaging_num and items['data_num'] == data_num):
  72. return items['measurement_points']
  73. def plot_signal_B(decoder, averaging_num=0, data_num=0, channel_num=1, range_volts=5.0):
  74. points = decoder.getDataPoints(averaging_num, data_num)[0]
  75. rate = decoder.getDataRate(averaging_num, data_num)
  76. signal = decoder.getDataScaled(averaging_num, data_num, channel_num, points, range_volts)
  77. time = np.arange(points) / rate
  78. plt.figure(figsize=(12, 4))
  79. plt.plot(time, signal, label=f'Канал {channel_num}')
  80. plt.xlabel('Время, с')
  81. plt.ylabel('Амплитуда, В')
  82. plt.title(f'Сигнал (Канал {channel_num})')
  83. plt.grid(True)
  84. plt.legend()
  85. plt.tight_layout()
  86. plt.show()
  87. dec = DataDecoder('test.json') # заменишь на нужное имя файла
  88. plot_signal_B(dec)