import numpy as np import scipy.signal def shifter(matrix): last = matrix[len(matrix)-1] x = len(matrix) result = [0] * x for i in range(1,len(matrix)): result[i] = matrix[i-1] result[0] = last return result def circular_convolve(x,h,n,m): primary_matrix = np.zeros((max(n,m),max(n,m))) for i in range(0,len(primary_matrix[0])): primary_matrix[0][i] = x[i] for i in range(1,max(n,m)): primary_matrix[i] = shifter(primary_matrix[i-1]) ultimate_matrix = np.transpose(primary_matrix) difference_in_length = abs(n-m) for i in range(m,m+difference_in_length): h.append(0) resultant = np.dot(ultimate_matrix,h) return resultant X = np.ones(10) X[0] += 2 H = np.zeros(10) H[0] += 1 y = np.fft.ifft(H*X) print(np.sum(y)) #lin_conv = scipy.signal.fftconvolve(x,h,"full") #circ_conv = circular_convolve(x, h, len(x), len(x)) # #print(f"Linear convolution: {lin_conv}") #print(f"Circular convolution: {circ_conv}")