2014-06-06 4 views
11

Рассмотрим функцию f (t), как я могу вычислить непрерывную диаграмму Фурье (w) и построить ее (используя numpy и matplotlib)?Дискретизированное непрерывное преобразование Фурье с numpy

Это или обратная задача (г (ж) дается, участок F (T) неизвестна) имеет место, если не существует аналитического решения интеграла Фурье.

+0

+1 Так вы пишете вопрос и ответить на него сами? – GingerHead

+5

Да, я читал, что людям это нравится. Это была одна из немногих проблем numpy/matplotlib, на которые я не нашел решения, используя Google. Поэтому я решил поделиться этим решением. Страница, где я читала о том, как ответить на ваш собственный вопрос, была здесь http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ – thomasfermi

+0

Привет, вы были бы так любезно посмотреть на мой вопрос [здесь] (http://stackoverflow.com/questions/34428886/discrete-fourier-transfromation-from-a-list-of-xy-points)? –

ответ

15

Для этого вы можете использовать numpy FFT module, но вам нужно сделать дополнительную работу. Сначала рассмотрим интеграл Фурье и дискретизируем его: Здесь k, m - целые числа, а N - число точек данных для f (t). С помощью этого дискретизации мы получаем enter image description here

суммы в последнем выражении в точности преобразования дискретного преобразования Фурье (ДПФ) Numpy применение (смотрите раздел «деталь осуществления» numpy FFT module). С этим знанием мы можем написать следующий сценарий питона

import numpy as np 
import matplotlib.pyplot as pl 

#Consider function f(t)=1/(t^2+1) 
#We want to compute the Fourier transform g(w) 

#Discretize time t 
t0=-100. 
dt=0.001 
t=np.arange(t0,-t0,dt) 
#Define function 
f=1./(t**2+1.) 

#Compute Fourier transform by numpy's FFT function 
g=np.fft.fft(f) 
#frequency normalization factor is 2*np.pi/dt 
w = np.fft.fftfreq(f.size)*2*np.pi/dt 


#In order to get a discretisation of the continuous Fourier transform 
#we need to multiply g by a phase factor 
g*=dt*np.exp(-complex(0,1)*w*t0)/(np.sqrt(2*np.pi)) 

#Plot Result 
pl.scatter(w,g,color="r") 
#For comparison we plot the analytical solution 
pl.plot(w,np.exp(-np.abs(w))*np.sqrt(np.pi/2),color="g") 

pl.gca().set_xlim(-10,10) 
pl.show() 
pl.close() 

Полученный график показывает, что скрипт работает enter image description here

+3

+1 Для приятного способа публикации вопроса и ответа на него самостоятельно! – GingerHead

+0

Если вы вычисляете (дискретизированный) FT таким образом, можете ли вы включать частоты меньше 1 или периоды, кратные длине входного массива? Возможно, вы могли бы помочь ответить на этот вопрос: http://dsp.stackexchange.com/questions/39017/looking-for-cycles-of-periods-longer-than-the-input-signal-length – mac13k

+0

Да, to-time-Fourier-Transform, вы ДОЛЖНЫ включать небольшие частоты, иначе ваш результат в течение длительного времени будет не очень хорошим. Я думаю, что ваш вопрос напрямую не связан, и я не могу ответить на него, не подвергая его серьезным исследованиям, извините. – thomasfermi

Смежные вопросы