Bonjour à tous,

Je ne suis pas très fort en physique et programmation sous Matlab c´est pourquoi je demande un peu d´aide à la communauté de developpez.
Pour un projet de recherche, je cherche à obtenir le spectre de puissance d´une surface rugueuse, ce qui reviens à travailler sur une série de profil spatiaux 1D.

Donc la méthode (via la littérature) est pour chaque profil parallèle, de calculer le spectre de puissance de Fourier en fonction du nombre d´ondes (wave number).
Puis de réduire le bruit en "empilant" chaque transformé de Fourier 1D des profils. Sachant que pour chaque profil de longueur L contenant N incréments, la fréquence spatial doit s´établir entre 1/L et la fréquence de Nyquist N/2L ,

Pour l´instant j´ai un collègue qui m´as filer un coup de main, mais je ne suis pas tout à fait convaincu et ca donne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
% im = matrice de la surface rugueuse (typiquement 1000*1000)
 
L=length(im(50,:));
 
f=1; fs=L; x=im; axis=0:(f/fs):L;
 
NFFT=1024;
 
fVals=fs*(-NFFT/2:NFFT/2-1)/NFFT;
 
X=zeros(L,NFFT);Px2=zeros(L,NFFT);
 
for i=1:1:L
 
    X(i,:)=fftshift(fft(im(i,:),NFFT));
 
Px2(i,:)=X(i,:).*conj(X(i,:)/(NFFT*L)); %Power of each freq components
 
end
 
meanavpx=zeros(1,NFFT);
 
for i=1:1:NFFT
 
    meanavpx(1,i)=mean(Px2(:,i));
 
end
 
logmean=10*log10(meanavpx);
 
semilogx(fVals,logmean,'b','Marker','.','LineStyle','None'),title('Power Spectral Density','FontSize', 15);xlabel('Spatial Frequency (k)','FontSize', 15);ylabel('Log(S(k))','FontSize', 15)


Quelqu´un a une idée pour améliorer ce code? L´objectif finale est de fitter ce spectre de puissance par une loi de puissance avec laquelle je peux extraire un paramètre, mais pour cette partie c´est facile,

Merci bien,

Ernest