Разберёмся, почему возникает данная . Посмотрим на выражение:
round(int(x + 31) / 64)
x + 31 это массив длины 1024, а мы его приводим к int'у и непонятно, что должно получиться в результате. Python так и говорит:
TypeError: только массивы длины один могут быть приведены к скалярному типу (int это скалярный тип)
Уберём приведение к int'у:
y = ns * byts[round((x + 31) / 64)]
Ошибка пропадёт, но появится :
TypeError: type numpy.ndarray doesn't define __round__ method
Можно заменить на :
y = ns * byts[np.round((x + 31) / 64)]
Мы получим другую :
TypeError: only integer scalar arrays can be converted to a scalar index
Дело в том, что np.round((x + 31) / 64) это массив, с типом элементов float, а мы используем этот массив как массив индексов, а индексы могут быть только целыми. Нужно изменить тип элементов массива с помощью :
y = ns * byts[np.round((x + 31) / 64).astype(int)]
Мы опять получим другую :
TypeError: only integer scalar arrays can be converted to a scalar index
Дело в том, что byts это обычный массив, и через квадратные скобки нельзя обращаться с массивом индексов. Сделаем byts numpy-массивом:
byts = np.array([0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1])
Наша следующая :
IndexError: index 16 is out of bounds for axis 1 with size 16
Возникает из-за того, что в конце массива np.round((x + 31) / 64 есть элементы, равные 16. Возможным решением будет изменение типа элементов массива x на int:
x = np.linspace(0, 1023, 1024).astype(int)
и замена сложного выражения np.round((x + 31) / 64 на простое x // 64:
y = ns * byts[x // 64] # %сигнал
Итоговый код:
import scipyimport scipy.fftpackimport cmath import mathimport matplotlib.pyplot as plt import numpy as npfrom scipy import signalfrom scipy.signal import freqs, iirfilterx = np.linspace(0, 1023, 1024).astype(int) # диапазон значений xbyts = np.array([0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1])ff = 64 # %Частота несущейns = np.sin(2 * np.pi * (x - 1) * ff / 1024) # несущаяy = ns * byts[x // 64] # %сигналplt.plot(y)