Ошибка KeyError: 4
Делаю курсовую работу по цифровой обработке сигнала, в открываемом файле содержатся точки сигнала, всё работало, в последнюю очередь нужно было расшифровать сообщение в сигнале. Написал вот такой вот код:
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import medfilt, butter, filtfilt
# Загрузка данных из csv файла
signal = np.loadtxt('21.csv')
# Применение медианного фильтра для удаления выбросов
median_filtered_signal = medfilt(signal)
# Настройка параметров фильтра нижних частот для сигнала
filter_order = 4
cutoff_frequency = 0.1
b, a = butter(filter_order, cutoff_frequency, btype='lowpass', analog=False)
# Применение фильтра нижних частот к сигналу
low_filtered_signal = filtfilt(b, a, median_filtered_signal)
# Параметры усилителя сигнала
amplification_factor = 0.9 # Фактор деления
# Усиление сигнала
amplified_signal = low_filtered_signal * amplification_factor
# Параметры декодирования сигнала
Amin = 2
h = 4
W1 = 771
# Демодуляция сигнала
envelope_signal = np.abs(amplified_signal) # Используйте усиленный сигнал для демодуляции
# Деквантование сигнала
quantized_signal = np.floor(envelope_signal / h) # Разделите огибающую на шаг квантования
# Графики
plt.subplot(4, 1, 1)
plt.plot(signal, label='Исходный сигнал')
plt.legend()
plt.subplot(4, 1, 2)
plt.plot(median_filtered_signal, label='Медианный фильтр')
plt.legend()
plt.subplot(4, 1, 3)
plt.plot(low_filtered_signal, label='ФНЧ')
plt.legend()
plt.subplot(4, 1, 1)
plt.plot(amplified_signal, label='Усиленный сигнал')
plt.legend()
plt.tight_layout()
plt.show()
plt.subplot(2, 1, 1)
plt.plot(quantized_signal, label='Квантованный сигнал')
plt.legend()
plt.subplot(2, 1, 1)
plt.plot(envelope_signal, label='Демодулированный сигнал')
plt.legend()
plt.tight_layout()
plt.show()
decoded_signal = []
key_table = {2: '001', 6: '010', 10: '011', 14: '100', 18: '101', 22: '110', 26: '111'}
for i in range(0, len(quantized_signal), 250):
segment = quantized_signal[i:i + 250]
max_value = int(round(np.mean(np.sort(segment)[-2:]) * h))
closest_values = [v for v in key_table.keys() if abs(v - max_value) <= 1]
if closest_values:
closest_value = max(closest_values)
decoded_signal.append(key_table[closest_value])
else:
closest_value = min(key_table.keys(), key=lambda x: abs(x - max_value))
diff = abs(max_value - closest_value)
if diff <= 1:
decoded_signal.append(key_table[closest_value])
else:
decoded_signal.append(key_table[max_value])
decoded_signal = ''.join(decoded_signal)
print("Расшифрованный сигнал:", decoded_signal)
Выдаёт ошибку
Traceback (most recent call last):
File "C:\Users\1\Desktop\Курсовая ЦОС\main.py", line 83, in <module>
decoded_signal.append(key_table[max_value])
KeyError: 4
Process finished with exit code 1
Уровни в key_table ставил по примеру однокурсников, должно всё работать, но именно с моим вариантом почему-то работать не хочет. Подскажите почему это происходит и как это решить?
Источник: Stack Overflow на русском