| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- import json
- import base64
- import numpy as np
- import matplotlib.pyplot as plt
- def decode_and_plot_channel(json_path, target_channel=1, dtype=np.float32):
- with open(json_path, 'r', encoding='utf-8') as f:
- data = json.load(f)
- # Берём первый измерительный блок
- measurement = data[0]
- channels = measurement["channel_data"]
- # Ищем нужный канал
- for ch in channels:
- if ch["channel_num"] == target_channel:
- encoded = ch["channel_data"]
- raw_bytes = base64.b64decode(encoded)
- arr = np.frombuffer(raw_bytes, dtype=dtype)
- plt.plot(arr, label=f"Канал {target_channel}")
- plt.xlabel("Индекс")
- plt.ylabel("Амплитуда")
- plt.title(f"График сигнала из канала {target_channel}")
- plt.grid(True)
- plt.legend()
- plt.tight_layout()
- plt.show()
- return
- print(f"Канал с номером {target_channel} не найден.")
- import json
- import base64
- import numpy as np
- import scipy.fft as fft
- import matplotlib.pyplot as plt
- class DataDecoder:
- def __init__(self, filename):
- self.data = ''
- with open(filename, 'r') as file:
- self.data = file.read()
- self.structed_data = json.loads(self.data)
- def getRawData(self, averaging_num=0, data_num=0, channel_num=0):
- for items in self.structed_data:
- if(items['averaging_num'] == averaging_num and items['data_num'] == data_num):
- for channel_data in items['channel_data']:
- if(channel_data['channel_num'] == channel_num):
- return channel_data['channel_data']
- return None
- def getDataDecoded(self, averaging_num=0, data_num=0, channel_num=0, points=10):
- rawData = self.getRawData(averaging_num, data_num, channel_num)
- edata = base64.b64decode(rawData.encode('utf-8'))
- arr = np.frombuffer(edata, dtype=np.int16, count=points, offset=0)
- return arr
- def getDataScaled(self, averaging_num=0, data_num=0, channel_num=0, points=10, range=5.0):
- decodedData = self.getDataDecoded(averaging_num, data_num, channel_num, points)
- return range * decodedData / 32768
- def getDataRate(self, averaging_num=0, data_num=0):
- for items in self.structed_data:
- if(items['averaging_num'] == averaging_num and items['data_num'] == data_num):
- return items['measurement_rate']
- 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):
- scaledData = self.getDataScaled(averaging_num, data_num, channel_num, points, range)
- zerofilledData = np.append(scaledData[first_idx:last_idx], np.zeros(zero_fill))
- rate = self.getDataRate()
- transferedData = fft.rfft(zerofilledData) * 2 / (last_idx-first_idx)
- freqs = fft.rfftfreq((last_idx-first_idx)+zero_fill, 1/rate)
- spectrum = np.abs(transferedData)
- phases = np.angle(transferedData)
- spect_dict = {'freqs': freqs,
- 'phases': phases,
- 'spectrum': spectrum}
- return spect_dict
- def getDataPoints(self, averaging_num=0, data_num=0):
- for items in self.structed_data:
- if(items['averaging_num'] == averaging_num and items['data_num'] == data_num):
- return items['measurement_points']
- def plot_signal_B(decoder, averaging_num=0, data_num=0, channel_num=1, range_volts=5.0):
- points = decoder.getDataPoints(averaging_num, data_num)[0]
- rate = decoder.getDataRate(averaging_num, data_num)
- signal = decoder.getDataScaled(averaging_num, data_num, channel_num, points, range_volts)
- time = np.arange(points) / rate
- plt.figure(figsize=(12, 4))
- plt.plot(time, signal, label=f'Канал {channel_num}')
- plt.xlabel('Время, с')
- plt.ylabel('Амплитуда, В')
- plt.title(f'Сигнал (Канал {channel_num})')
- plt.grid(True)
- plt.legend()
- plt.tight_layout()
- plt.show()
- dec = DataDecoder('test.json') # заменишь на нужное имя файла
- plot_signal_B(dec)
|