Нечетный результат в Python Scipy FFT - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть доступ к scipy и я хочу создать БПФ о простой гауссовой функции, которая равна exp (-t ^ 2) .А также хорошо известно, что преобразование Фурье exp (−t ^ 2) равно √πexp (−π ^ 2 * k ^ 2) .Но БПФ exp (-t ^ 2) не было таким же, как √πexp (−π ^ 2 * k ^ 2) .

Я пробовал следующеекод:

import scipy.fftpack as fft
from scipy import integrate
import numpy as np
import matplotlib.pyplot as plt

#FFT
N=int(1e+3)
T=0.01 #sample period
t = np.linspace(0,N*T, N)

h=np.exp(-t**2)
H_shift=2*np.abs(fft.fftshift(np.fft.fft(h)/N))
freq=fft.fftshift(fft.fftfreq(h.shape[0],t[1]-t[0]))


#Comparing FFT with fourier transform
def f(x):
    return np.exp(-x**2)
def F(k):
    return (np.pi**0.5)*np.exp((-np.pi**2)*(k**2))

plt.figure(num=1)
plt.plot(freq,F(freq),label=("Fourier Transform"))
plt.legend()
plt.figure(num=2)
plt.plot(freq,H_shift,label=("FFT"))
plt.legend()
plt.show()

enter image description here

#Checking Parseval's Theorm
S_h=integrate.simps(h**2,t)
#0.62665690150683084
S_H_s=integrate.simps(H_shift**2,freq)
#0.025215875346935791
S_F=integrate.simps(F(freq)**2,freq)
#1.2533141373154999

График, который я построил, не совпадает, также значения FFT не следуют правилу Парсеваля.enter image description here.Это должно быть S_H_s = S_h * 2 , но мой результат не был.Я думаю, что S_H_s , который является результатом FFT, является неправильным значением из-за S_F = S_h * 2 .

Есть ли проблемы в моем коде ??Помощь очень ценится!Заранее спасибо.

1 Ответ

0 голосов
/ 27 февраля 2019

Я предлагаю вам построить свой входной сигнал h и убедиться, что он выглядит как гауссовский.

Оповещение о спойлере: это не так, это половина гауссовского!вот так, вы вводите много высоких частот, которые видите на своем графике.

Чтобы правильно провести этот эксперимент, следуйте этому рецепту для создания входного сигнала:

t = np.linspace(-(N/2)*T,(N/2-1)*T, N)
h = np.exp(-t**2)
h = fft.ifftshift(h)

The *Функция 1011 * служит для перемещения местоположения t=0 к крайнему левому элементу массива.Обратите внимание, что t здесь построен тщательно, так что t=0 находится точно в правильном месте для правильной работы, предполагая N четного размера.Вы можете проверить, что fft.ifftshift(t)[0] равно 0.0.

...