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

Shift Signal Analysis

ou analyse du décalage d'un signal


Avant propos



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...

1- Premiere analyse

.

Signal à droite




Clipboard01.png

calculé avec 51 harmoniques!

Clipboard02.pngClipboard02.png

Coefs de 51 harmoniques!

Voir    "MTF - Signal à droite.xlsx"

Signal au centre




Clipboard04.png


Clipboard05.png

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


Signal presque à gauche





Clipboard06.png

Clipboard07.png
.
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

Signal à gauche




Clipboard08.png

Clipboard09.png

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

..


xxx




...


yyy



...


...

2- décomposition de la dérivée en série de Gauss

...

L'idée de départ



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

  ...


yyy



...

x- Simulation NumPy


6606

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

array([ 16.   ,  16.   ,  16.   , ..., 234.199, 234.199, 234.199])

#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

Clipboard11.png     Clipboard14.png

                         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

Clipboard12.png       Clipboard15.png Clipboard15.png     Clipboard13.png

                  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

...


1024


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. ?


Clipboard16.png     Clipboard19.png

                            data                                                                   ftm

Clipboard17.png     Clipboard18.png

                                   dataH                                                           ftmH

...


256


Données brutes obtenues depuis l'image (pas d'interpolation)

'D:\CloudStation\FTM_SlantEdge\Python\data.txt

Clipboard20.png              Clipboard23.png

                            data                                                                   ftm  439768372 1570 1320 937 313 118

Clipboard21.png             Clipboard22.png

                      dataH                                              ftmH     112136  23394 8044 1678  3974  764 180

...


yyy


...