Численное преобразование Фурье прямоугольной функции

Цель этого сообщения – правильно понимать численное преобразование Фурье на Python или Matlab с примером, в котором хорошо известно Аналитическое преобразование Фурье. Для этого я выбираю прямоугольную функцию, аналитическое выражение ее и ее преобразование Фурье сообщается здесь https://en.wikipedia.org/wiki/Rectangular_function

Здесь код в Matlab

x = -3 : 0.01 : 3; y = zeros(length(x)); y(200:400) = 1; ffty = fft(y); ffty = fftshift(ffty); plot(real(ffty)) 

И вот код в Python

 import numpy as np import matplotlib.pyplot as plt x = np.arange(-3, 3, 0.01) y = np.zeros(len(x)) y[200:400] = 1 ffty = np.fft.fft(y) ffty = np.fft.fftshift(ffty) plt.plot(np.real(ffty)) 

В обоих двух языках программирования у меня есть некоторый результат с некоторыми проблемами: во-первых, преобразование Фурье не является реальным, как ожидалось, более того, даже выбрав реальную часть, решение не похоже на аналитическое решение: фактически первый график как это должно быть по крайней мере в форме, и второй график – это то, что я получаю от своих расчетов.

Есть ли кто-нибудь, кто мог бы предложить мне, как аналитически рассчитать преобразование Фурье прямоугольной функции?

введите описание изображения здесь

введите описание изображения здесь

В вашем коде Matlab есть две проблемы:

Во-первых, y = zeros(length(x)); должен быть y = zeros(1,length(x)); , В настоящее время вы создаете квадратную матрицу, а не вектор.

Во-вторых, DFT (или FFT) будет вещественным и симметричным, если y . Ваш y должен быть симметричным, а это означает относительно 0 . Итак, вместо y(200:400) = 1; использовать y(1:100) = 1; y(end-98:end) = 1; y(1:100) = 1; y(end-98:end) = 1; , Напомним, что DFT похож на ряд Фурье сигнала, из которого ваш вход – всего один период, а первый образец соответствует моменту времени 0.

Так:

 x = -3 : 0.01 : 3; y = zeros(1,length(x)); y(1:100) = 1; y(end-98:end) = 1; ffty = fft(y); ffty = fftshift(ffty); plot(ffty) 

дает

 >> isreal(ffty) ans = 1 

введите описание изображения здесь

Код в Python

 import matplotlib.pyplot as plt import numpy as np x = np.arange(-3, 3, 0.01) y = np.zeros(len(x)) y[200:400] = 1 yShift = np.fft.fftshift(y) fftyShift = np.fft.fft(yShift) ffty = np.fft.fftshift(fftyShift) plt.plot(ffty) plt.show()