Sommaire des sites JMP 4 | La proto Informatique |
Tour du Monde de Renaud |
Le Yunnan (Chine) |
La Birmanie | Le Spiti | L'Arménie | Le Gujarat |
---|
Je suis en train d'analyser la FTM d'un objectif de microscope. J'ai réussi à faire la simulation sous Python, mais je m'interroge sur la courbe FTM obtenue. Je ne vois pas trop le rapport avec la décomposition en série de Fourier.
J'ai effectué une simultaion de le décomposition en série de Fourier (qui fonctionne bien)
Voir: D:\CloudStation\FTM_SlantEdge\Python\MTF.xlsx
On y voit bien le calcul des coéfficients et la reconstitution du signal. On remarque les oscillations près des extrémités...
.
calculé avec 51 harmoniques!
Coefs de 51 harmoniques!
Voir "MTF - Signal à droite.xlsx"
MTF - Signal au centre.xlsx
a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7 | a8 | a9 | a10 | a11 | a12 | a13 | a14 | a15 | a16 | a17 | a18 | a19 | a20 | a21 | a22 | a23 | a24 | a25 | a26 | a27 | a28 | a29 | a30 | a31 | a32 | a33 | a34 | a35 | a36 | a37 | a38 | a39 | a40 | a41 | a42 | a43 | a44 | a45 | a46 | a47 | a48 | a49 | a50 | a51 |
107,7 | 126,056009 | -127,8716 | 80,96695 | -18,8635 | 12,53927 | -24,5029 | 33,45401 | -20,3952 | 13,16534 | -10,9506 | 15,9109 | -13,2497 | 11,6052 | -8,85284 | 11,1321 | -9,7856 | 9,147706 | -6,41202 | 7,812689 | -7,82867 | 8,665683 | -6,18498 | 5,759708 | -5,0409 | 6,870683 | -6,30882 | 6,01509 | -4,1613 | 4,848648 | -4,81261 | 5,63814 | -4,44985 | 4,485294 | -3,75213 | 4,490714 | -3,98271 | 4,326896 | -3,50777 | 3,920775 | -3,45668 | 3,880298 | -3,17386 | 3,501904 | -3,10335 | 3,601224 | -3,0112 | 3,18148 | -2,65638 | 3,156301 | -2,84151 | 3,122695 |
a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7 | a8 | a9 | a10 | a11 | a12 | a13 | a14 | a15 | a16 | a17 | a18 | a19 | a20 | a21 | a22 | a23 | a24 | a25 | a26 | a27 | a28 | a29 | a30 | a31 | a32 | a33 | a34 | a35 | a36 | a37 | a38 | a39 | a40 | a41 | a42 | a43 | a44 | a45 | a46 | a47 | a48 | a49 | a50 | a51 |
162,3 | 229,965474 | -100,5979 | 11,61696 | -50,5886 | 40,67818 | -8,31552 | 29,12623 | -20,3952 | 12,15647 | -16,4959 | 15,0614 | -9,8638 | 13,55758 | -9,32612 | 10,24407 | -9,7856 | 8,325073 | -7,53605 | 9,552413 | -5,99472 | 7,130606 | -7,48304 | 6,332764 | -5,0409 | 7,371459 | -5,1225 | 5,06291 | -5,66458 | 5,496977 | -3,95511 | 5,475552 | -4,44985 | 4,386125 | -4,15324 | 4,646989 | -3,60978 | 4,253432 | -3,687 | 3,904726 | -3,45668 | 3,816589 | -3,14195 | 3,736346 | -3,05755 | 3,328148 | -3,0834 | 3,299489 | -2,65638 | 3,271964 | -2,74625 | 2,868998 |
a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7 | a8 | a9 | a10 | a11 | a12 | a13 | a14 | a15 | a16 | a17 | a18 | a19 | a20 | a21 | a22 | a23 | a24 | a25 | a26 | a27 | a28 | a29 | a30 | a31 | a32 | a33 | a34 | a35 | a36 | a37 | a38 | a39 | a40 | a41 | a42 | a43 | a44 | a45 | a46 | a47 | a48 | a49 | a50 | a51 |
216,5 | 292,522396 | -10,97174 | 84,00388 | -18,7052 | 38,87154 | -21,562 | 21,31291 | -20,1173 | 14,68334 | -16,4856 | 12,48717 | -12,9131 | 11,31229 | -10,6033 | 9,899166 | -9,45025 | 8,423011 | -8,64358 | 7,482058 | -7,53316 | 7,289392 | -6,0983 | 7,484007 | -4,79548 | 7,491687 | -4,06355 | 6,999365 | -3,95441 | 6,134437 | -4,14982 | 5,269915 | -4,26252 | 4,691617 | -4,11823 | 4,419728 | -3,80163 | 4,284661 | -3,49193 | 4,126812 | -3,27938 | 3,920694 | -3,12116 | 3,739212 | -2,93501 | 3,635036 | -2,70651 | 3,572591 | -2,50256 | 3,467515 | -2,39438 | 3,276325 |
..
...
...
...
...
1- effectuer la dérivée du signal
2- Approximer cette dérivée à l'aide de plusieurs courbes de Gauss
3- Minimiser l'erreur quadratique
4- Reconstituer le signal initial soit en intégrant soit en utilisant les 3 paramètres trouvés de chaque courbe de Gauss pour les remettre dans les intégrales de ces courbes (fonctions de Fermi/sigmoïd)
On utilisera ma simulation _MTF_Fourier_SlantEdgeSim.xlsx
D:\CloudStation\FTM_SlantEdge\Python\_MTF_Fourier_SlantEdgeSim.xlsx
...
...
Fichier D:\CloudStation\FTM_SlantEdge\Python\data_2048.txt
Ce fichier est composé à partir de l'interpolation en 1024 samples et allongé à la main pour faire 6606 de long. En espérant obtenir plus de points dans la FTM.
#1- Lecture du fichier txt
import numpy as np
with open('D:\CloudStation\FTM_SlantEdge\Python\data_2048.txt', 'r') as data:
string_data = data.read()
list_data = string_data.split(',')
list_data.pop()
#2- Sauvegarde en npy
data = np.array(list_data, dtype=float)
np.save('d:\CloudStation\FTM_SlantEdge\Python\data.npy', data)
data
#3- Visualisation de la courbe data (on remarque le décrochement vers le haut)
#31 Préparation des données
import numpy as np
from scipy.fft import rfft, irfft
data = np.load('D:\CloudStation\FTM_SlantEdge\Python\data.npy')
#32 Affichage de la courbe des données
import matplotlib.pyplot as plt
plt.plot(data)
plt.grid()
plt.legend(['Données lues dans le fichier npy: il s agit de la transtion noir vers blanc. Row de la capture vidéo' ])
plt.show() #commentdata
len(data) #on préfère avoir 1 de plus, car la dérivée va en perdre 1
data ftm
#33 On calcule la ftm de data
# Enfin, calculer la FTM
import matplotlib.pyplot as plt
from scipy.fft import rfft, irfft
ftm=rfft(data)
amp=1*data #pour avoir le même type que data
#L[i]=np.sqrt(ftm[i].real**2
+ftm[i].imag**2
for i in range(3304):
# amp[i]=np.sqrt(ftm[i].real**2 +ftm[i].imag**2)
amp[i]=np.sqrt(ftm[i].real**2)
# g[i]=ftmH[i].real #non reste les i
#ess=np.real(ftmH)
x = np.linspace(0,3304, 3004) # ajustage car len(ftmH)=65
plt.axis([-1,15,-25000,1500000])
#plt.plot(x, ftmH, amp)
plt.plot(amp)
plt.grid()
plt.legend(['FTM de dataH (bleu): Amplitude (jaune)'])
plt.show()
#amp
#4- Calcul des données en gamma 2.2 dataH
dataH = np.array(list_data, dtype=float) #uniquement pour avoir le même type que data!
for i in range(6606):
dataH[i]=(data[i]**2.2)/256
# 2.2 est le gamma 256 et un diviseur qcq pour
avoir des amplitudes acceptables
#dataH
#5 Affichage de la courbe des données dataH
import matplotlib.pyplot as plt
plt.plot(dataH)
plt.grid()
plt.legend(['Données lues dans le fichier npy: /n il s agit de la transtion noir vers blanc. Row de la capture vidéo' ])
plt.show() #comment
#dataH
dataH (gamma=2.2) ftmH
#6 Enfin, calculer la FTM de dataH (soit ftmH)import matplotlib.pyplot as plt
from scipy.fft import rfft, irfft
ftmH=rfft(dataH)
ftmH
#7 et on prend l'amplitude
amp=1*dataH #pour avoir le même type que data
#L[i]=np.sqrt(ftm[i].real**2 +ftm[i].imag**2)
for i in range(3304):
#Nb/2 +1
# amp[i]=np.sqrt(ftm[i].real**2 +ftm[i].imag**2)
amp[i]=np.sqrt(ftmH[i].real**2)
# g[i]=ftmH[i].real #non reste les i
#ess=np.real(ftmH)
x = np.linspace(0,3304, 3304) # ajustage car len(ftmH)=65
plt.axis([-1,20,-25000,4000000]) #x [-1,5] et y [-25000 +40000] #permet de définir un zoom
#plt.plot(x, ftmH, amp)
plt.plot(amp)
plt.grid()
plt.legend(['FTM de dataH (bleu): Amplitude (jaune)'])
plt.show()
#amp
...
Fichier 'D:\CloudStation\FTM_SlantEdge\Python\data_1024.txt'
obtenu par interpolation x10, mais ramenée à 1024 (au lieu de 2546): 6 courbes de gauss pour approximer la dérivée, puis intégration. L'optimisation s'est faite sur les 256 points. ?
data ftm
dataH ftmH
...
Données brutes obtenues depuis l'image (pas d'interpolation)
'D:\CloudStation\FTM_SlantEdge\Python\data.txt
data ftm 439768372 1570 1320 937 313 118
dataH
ftmH 112136 23394 8044 1678 3974 764 180
...
...