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 Michaël (site web personnel) . Évalué à 6.
Ton code n'est pas très lisible, il y a quelques points à améliorer:
xx0
l'argument de Lorentzian ou bienpolymorphicX
par exemple.import numpy as np
etimport 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'écrires_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.