[MATLAB] Pb: Symétrie spectre et noms fichier

Résolu/Fermé
Newenda Messages postés 75 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 26 avril 2021 - 23 mars 2009 à 10:10
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 - 24 mars 2009 à 14:07
Bonjour,

Voici mon programme pour afficher le spectre d'un signal acoustique :



------------------------------------------------------------------------------------------------------------------
clear all
close all

%rdir n'est pas une fonction incrémentée dans matlab (la copier dans chaque
%dossier du programme qui l'utilise)
A=rdir('D:\Travail\DOSSIER_TEST\TEST_BOUCLE\test01BF\*.txt');

%boucle permettant de lire tous les fichiers du dossier
for p=1:size(A,1)

disp(A(p).name)
[fid]=fopen(A(p).name,'rt')

% boucle permettant d'éliminer les N premières lignes du fichier
N = 15;
for n=2:N;
fgetl(fid);
end;


%frequence echantillonage
f_ech = 10000;

%tmax = temps d'enregistrement d'un événement
tmax = 0.500;

%axe fréquence
%freq = [1:1:5000]
freq = [0:1/tmax:f_ech-1/tmax];
freq = freq';

%axe de temps
t = [0:1/f_ech:tmax-1/f_ech];
t=t';

% Lecture des données qui se trouvent sur deux colonnes
donnee=fscanf(fid,'%g %g',[2 inf]);

% Mettre le vecteur de donnees dans le bon ordre
donnee=donnee';

%donnees de la voie n°1 (1ere colonne)
voie1 = donnee(:,1);

%Fermeture du fichier texte
fclose(fid);


%%%%%%%%%%%%%%SPECTRE SIGNAUX%%%%%%%%%%%%%

voie1_fft = fft(voie1);
spi = abs(voie1_fft).^2;

size(t)
size(freq)
size(spi)

figure;
plot(freq, spi);
title('name.txt');
------------------------------------------------------------------------------------------------------------------

retourne les size suivants:

------------------------------------
ans =

5000 1


ans =

5000 1


ans =

5000 1
-------------------------------


J'ai une question et un problème :

1- Le problème est que, comme vous pouvez le voir sur une des figures jointe (lien dessous), mon spectre à une symétrie en 5000 Hz et ça je ne vois pas du tout pourquoi...
J'ai mis les size des différentes matrices pour vérification...

2- Ma question est: Comment nommé automatiquement les figures par les nom de leurs fichiers correspondant ?

http://img24.imageshack.us/img24/993/figure6.jpg

Merci d'avance !

3 réponses

Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 835
24 mars 2009 à 03:19
Salut

C'est comme d'habitude, si t'es habitué à travailler en analyse du signal, tu fais avec les dft et t'exploites ça avec la fréquence centrale que t'obtiens, soit t'essaies de te ramener à quelque chose de plus... ben je sais pas, de plus visuel peut-être... et tu centres tout. Les dft, c'est ni plus ni moins des ft mais y a quand même des différences. Alors soit tu bidouilles avec fftshift, soit tu fais le calcul à la main.
Si tu veux centrer le tout, tu peux faire un truc de ce genre-là :
%Plage fréquence
fmax = 10000;
%Temps d'enregistrement d'un événement
tmax = 0.500;
%Nombre de points
N=5000;
%Doit être égal à
%N=f_ech*tmax;
%Axe fréquence
freq=linspace(0,fmax/2-fmax/(2*N),N);
%Pareil que
%freq=-fmax/2+fmax/(2*N)+fmax/N*(0:N-1);
%Axe de temps
t=linspace(0,tmax/2-tmax/(2*N),N);
%Pareil que
%t=-tmax/2+tmax/(2*N)+tmax/N*(0:N-1);
%blablabla...
voie1_fft=-T/N*exp(-1i*pi*(N/2-1/(2*N)))*...
exp(1i*pi*(1-1/N)*(0:N-1)).*...
fft(voie1.*exp(1i*pi*(1-1/N)*(0:N-1)));
%blablabla...
Pour nommer les figures par le nom du fichier correspondant, tu mets ça dans le code :
name_figure=A(p).name;
deb=find(name_figure=='\',1,'last')+1;
fin=find(name_figure=='.',1,'last')-1;
name_figure=name_figure(deb:fin);
Rajoute le .txt si t'en as envie.

Ciao
0
Newenda Messages postés 75 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 26 avril 2021 24
24 mars 2009 à 13:56
Yep merci !

Bon finalement j'ai fait ça (la commande que l'on trouve direct dans la doc fft..)

NFFT = 2^nextpow2(N);
voie1_fft = fft(voie1,NFFT)/N;
freq = fmax/2*linspace(0,1,NFFT/2+1);

plot(freq,2*abs(voie1_fft(1:NFFT/2+1))/4,'r');


a+
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 835
24 mars 2009 à 14:07
Vi, si tu veux pas centrer le spectre, ça va aussi... :-D
De rien ;-)
Ciao
0