#!/usr/bin/env python # -*- coding: utf-8 -*- """ calcul de la transformée de Fourier discrète d'une fonction par FFT """ __author__ = "Dominique Lefebvre" __copyright__ = "Copyright 2020 - TangenteX.com" __version__ = "1.0" __date__ = "11 avril 2020" __email__ = "dominique.lefebvre@tangentex.com" from scipy import sin, pi, linspace, arange from matplotlib.pylab import figure,plot,grid, title,xlabel,ylabel,stem, absolute import cmath # fonction de calcul de la FFT par récursivité def fft(x): N = len(x) if N <= 1: return x even = fft(x[0::2]) odd = fft(x[1::2]) T= [cmath.exp(-2j*cmath.pi*k/N)*odd[k] for k in range(N//2)] return [even[k] + T[k] for k in range(N//2)] + \ [even[k] - T[k] for k in range(N//2)] # paramètres du signal L = 2.0 # durée du signal fd = 1.0/L # domaine fréquentiel du signal a0 = 1. # amplitude du signal f0 = 1.0 # fréquence du signal # paramètres de l'échantillonnage N = 32 # nombre de points d'échantillonnage dt = L/N # intervalle temporel entre deux points fe = 1./dt # fréquence d'échantillonnage # construction du signal t = linspace(0.0,L,N) s = a0*sin(2*pi*f0*t) # définition du domaine fréquentiel freq = arange(N)*fd # calcul de la TFD de la fonction f par FFT tfd = fft(s) # impression des coefficients for i in range(N): print i,s[i],tfd[i] # tracé de la répartition des coefficients de Fourier fig1 = figure(figsize=(10,8)) grid(True) plot(range(N),tfd,'ob') title('Distribution des coefficients de Fourier - Algo FFT') xlabel('Rang du coefficient ck de Fourier') ylabel('Amplitude') # tracé du spectre fig2 = figure(figsize=(10,8)) grid(True) stem(freq[0:N//2],absolute(tfd[0:N//2]),'r') title('Spectre du signal - Algo FFT en python pur') xlabel(u'Fréquence') ylabel('Amplitude')