Численное преобразование Фурье прямоугольной функции
Цель этого сообщения – правильно понимать численное преобразование Фурье на 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))
В обоих двух языках программирования у меня есть некоторый результат с некоторыми проблемами: во-первых, преобразование Фурье не является реальным, как ожидалось, более того, даже выбрав реальную часть, решение не похоже на аналитическое решение: фактически первый график как это должно быть по крайней мере в форме, и второй график – это то, что я получаю от своих расчетов.
Есть ли кто-нибудь, кто мог бы предложить мне, как аналитически рассчитать преобразование Фурье прямоугольной функции?
- Обратная фильтрация с использованием Python
- Почему кросс-спектры отличаются в mlab и scipy.signal?
- Отображение бина Python scipy.fftpack.rfft
- Разница между результатом array_spectrum доступна в matplotlib.mlab и numpy.abs (numpy.fft.fft (данные))
- signal.spectrogram найти максимальную частоту для данного сегмента
В вашем коде 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()
- В python, как я могу проверить, является ли путь символической ссылкой?
- Отображение изображения в QGraphicsScene
- Как создать матрицу с кругом единиц в numpy / scipy
- Вычислить EWMA по разреженным / нерегулярным TimeSeries в Pandas
- Как извлекать функции массива numpy из спектрограммы?
- Обнаружение пиков и их изоляция в шумных спектрах
- Сглаживание серии взвешенных значений в numpy / pandas
- Сделать оператор умножения матрицы @ работать для скаляров в numpy
- Почему я получаю строки нулей в 2D 2D?
- Расчет спектра турбулентности
- DSP – получить амплитуду всех частот