Forum Programmation.python URGENT, D'où viennent les artifactes de la FFT de mon signal?

Posté par  . Licence CC By‑SA.
0
15
avr.
2017

Salut tout le monde, Je suis vraiement desepérée à la recherche de la cause des artifactes dans le fft de mon signal.
N'ayez pas peur de la longeur du code, la partie importante est tout en bas, au début c'est juste la déclaration des variables et fonctions.

Le tout revient à réaliser un signal disant s_pos et un autre s_neg. le s_neg n'est rien d'autre que s_pos mis au negatif et miroité. Étant ainsi, j 'attends que la transformé de Fourrier de s_neg qu'elle soit la même que: -np.conjugate(S_pos) puisque s_pos est réelle. Mais apparament le miroitement d'une convolution me donne des artifactes. Est-ce que quelqun pourrait SVP me dire pourquoi? et comment je fais pour m'en débarasser et retrouver la même chose pour :

S_neg (Bleu) et S_neg_expected(Rouge) (Voir fichier attaché)?? Merci d'avance !!!

import numpy as np
import matplotlib.pyplot as plt
amp = 18e-3 
a = 1/.61e3
b = 5.5
fs=5e6
f0 = fs/2/102
t_min = 0 
dt = 1./fs
t_max = (10772) * dt
t = np.arange(t_min,t_max,dt)
x_min = -amp/b
x_max = amp/b
dx =  dt*(x_min-x_max)/(t_min-t_max)
x = np.arange(x_min,x_max,dx)
def Lorentzian(xx):
    if not hasattr(xx, '__iter__'):
        xx = [ xx ]
    res = np.zeros(len(xx))
    for i in range(len(xx)):
        x = xx[i]
        if np.fabs(x) < 0.1:
            res[i] =  1./3. - x**2/15. + 2.* x**4 / 189. - x**6/675. + 2.* x**8 / 10395. - 1382. * x**10 / 58046625. + 4. * x**12 / 1403325.
        else:
            res[i] = (1./x**2 - 1./np.sinh(x)**2)
    return res
def distrib(x):
    res = np.zeros(np.size(x))
    res[int(3*np.floor(np.size(x)/5))] = 6
    res[int(3*np.floor(np.size(x)/5)+20)] = 6
    return res
def mirror(seq):
    output = list(seq[::-1])
    return output
func1 = lambda x : Lorentzian(b*(x/a))
x_s = lambda t : amp * np.cos(2*np.pi*f0*t)/b
signal = lambda x : np.convolve(distrib(x), func1(x)-func1(x)[0], 'same')
## Partie importante ####
s_pos = signal(x_s(t[0:102]))
s_neg = mirror(-s_pos)
S_pos = np.fft.fft(s_pos)
S_neg_expected = -np.conjugate(S_pos) 
S_neg = np.fft.fft(s_neg)
plt.figure()
plt.plot(S_neg_expected,'r')
plt.plot(S_neg,'b')
  • # Pas très lisible

    Posté par  (site web personnel) . Évalué à 6.

    Ton code n'est pas très lisible, il y a quelques points à améliorer:

    • Il y a un 102 qui se balade. C'est quoi? Au moins donne lui un nom!
    • Réassigner les paramètres de fonction, c'est pas super pour la lisibilité, tu peux nommer xx0 l'argument de Lorentzian ou bien polymorphicX par exemple.
    • Les alias de type import numpy as np et import matplotlib.pyplot as plt rendent le code plus rapide à écrire et plus dur à lire, pour moi c'est plutôt un problème qui se règle en utilisant mieux son éditeur qu'en utilisant ce type d'alias.

    Ceci dit pour moi le problème est que, si je te comprends bien, s_pos échantillonne ton signal sur les temps $t_0$ à $t_{102}$ mais contrairement à ce que tu as l'air d'écrire s_neg n'échantillonne pas la fonction qui associe - signal(-x) à x mais plutôt -signal(t[102] - x). Cela modifie la transformation de Fourier.

    Sinon, ce serait pas mal d'en savoir plus sur tes artefacts, par exemple tu pourrais montrer les images résultantes.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.