Один из способов создать подходящий массив 0-1 - это np.fromfunction
, передав ему функцию, которая возвращает True в волне. Преобразование в плавающее приводит к массиву 0-1.
Для этой иллюстрации лучше расположить волну в середине массива, избегая граничных эффектов, связанных с сверткой. Использование mode='same'
позволяет построить все кривые вместе. Кроме того, не забудьте разделить вывод convolve
на sample_rate
, иначе он будет расти пропорционально ему с каждой сверткой.
import numpy as np
import matplotlib.pyplot as plt
sample_rate = 100
num_samples = 500
wave = np.fromfunction(lambda i: (2*sample_rate < i) & (i < 3*sample_rate), (num_samples,)).astype(np.float)
wave1 = np.convolve(wave, wave, mode='same')/sample_rate
wave2 = np.convolve(wave1, wave, mode='same')/sample_rate
wave3 = np.convolve(wave2, wave, mode='same')/sample_rate
plt.plot(np.stack((wave, wave1, wave2, wave3), axis=1))
plt.show()
Математически они известны как кардинальные B-сплайны и как плотность распределение Ирвина-Холла .