Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > MATLAB > Signal
Signal Forum d'entraide sur le traitement du signal en MATLAB
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/10/2012, 00h27   #1
didierBB
Invité régulier
 
Homme
Étudiant
Inscription : juillet 2012
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : juillet 2012
Messages : 17
Points : 7
Points : 7
Par défaut suppression d'amplitude et IFFT

Bonjour tout le monde,

je vous explique mon soucis, merci de me dire si vous avez une idée d'où mes problèmes viennent

Tout d'abord, voici le contexte
- j'ai une courbe bruité et j'ai fais une FFT de ce signal sous matlab afin d'avoir le spectre du signal.
- les j'ai environ 6000 fréquences et celles qui me dérange sont les basses fréquences et quelques autres que je n'ai pas encore très bien identifiées.
- pour commencer à filtrer j'ai essayé des filtres sous matlab mais apparemment ils ne semblent pas convenir à ma situation car tous les filtres
que j'utilise déforment mon signal sur des zones que je ne veux pas (les pentes ne sont plus respectées or je veux vraiment garder les pentes de montées et descente, c'est juste le bruit des plateaux que je veux virer ).
- Du coup, j'ai voulu annuler les fréquences basses de mon signal à l'aide de matlab et reconstruire le signal temporel à l'aide d'une FFT inverse.

Résultats
- Lorsque je passe de mon spectre (où j'ai mis les amplitudes à 0 pour les basses fréquences) à un signal temporelle à l'aide d'une FFT inverse j'ai un soucis :

==> la forme du signal résultant est nickel :Bravo1: mais l'amplitude de la courbe n'est plus la même que celle du signal de départ ! (l'amplitude à diminuée) (

Explication

du coup, je voudrais savoir si vous pourriez m'expliquer pourquoi mon amplitude générale à diminuer ? et comment la remettre à son niveau de départ.
=> je précise que si je fais une FFT de mon signal et une FFT inverse tout de suite après ça marche nickel
=> c'est lorsque je supprime des amplitudes de la FFT que je perds en amplitude globale.

Ce qui m'etonne là dedans est que j'ai fais un test :
=> mettre toutes les amplitudes maximale du signal à 0 et je m'attendais au même résultat, mais là non... mon amplitude est bonne

Mon code
voici mon bout de code (et la PJ):
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 noms='bruit.dat';
donnees=importdata(noms);data=donnees.data;x=data(:,1)';y=data(:,5)';
x=x-x(1);
tempsEssai=x(end)-x(1);
nbPoints=length(x);
f_Echantillonage=nbPoints/tempsEssai;
T=1/f_Echantillonage;
t=T*(0:nbPoints-1);
NFFT = nbPoints; %cas non precis mais marche bien ici
Yfft=fft(y,NFFT)
f=f_Echantillonage/2*linspace(0,1,NFFT/2);
yInverse=ifft(Yfft);
YfftModif=Yfft;
nbFrequencesOK = 3000;
[Xmin IxMin]=sort(x);
for j=1:length(x)
    if(any(x(j)==Xmin(1:nbFrequencesOK)))
        %
    else
        YfftModif(j)=0;
    end
end
yInverseModif=ifft(YfftModif);
Fichiers attachés
Type de fichier : zip bruit.zip (670,9 Ko, 2 affichages)
didierBB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2012, 00h49   #2
Winjerome
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 5 167
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 25
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : septembre 2009
Messages : 5 167
Points : 12 638
Points : 12 638
Bonsoir,

Si tu avais lu comme je te l'avais conseillé un cours sur la FFT, tu saurais que ton bruit est situé dans les hautes fréquences, contrairement à ton signal qui est plus dans les basses. Donc oui si tu annules les basses, tu vas voir ton signal disparaître.

Code :
1
2
3
4
5
6
7
8
[dump IxMin]=sort(x);
for j=1:length(x)
    if(any(j==IxMin(1:nbFrequencesOK)))
        YfftModif(j)=YfftModif(j); % complètement inutile
    else
        YfftModif(j)=0;
    end
end
Il y a plus simple
Code :
YfftModif(1:nbFrequencesOK) = 0;
Sauf que ce que tu fais est faux, ou disons imcomplet. Je te rappelle (ou pas ) que ton spectre est symétrique.
__________________
Débutant en MATLAB ? Vous voulez faire une Interface Graphique ? Les Tutoriels et la FAQ sont là pour vous aider
Une erreur ? FAQ : Messages d'erreur et avertissements
"Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).
Citation:
En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
Pas de question technique par MP, Merci
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/10/2012, 19h35   #3
didierBB
Invité régulier
 
Homme
Étudiant
Inscription : juillet 2012
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : juillet 2012
Messages : 17
Points : 7
Points : 7
Citation:
Envoyé par Winjerome Voir le message
Bonsoir,
Si tu avais lu comme je te l'avais conseillé un cours sur la FFT, tu saurais que ton bruit est situé dans les hautes fréquences, contrairement à ton signal qui est plus dans les basses. Donc oui si tu annules les basses, tu vas voir ton signal disparaître.
Bonsoir Winjerome et merci.

oui en effet je sais que le bruit est dans les hautes fréquences mais ici je conserve bien les basses frequences puisque je classe par ordre croissant et je ne garde que les premieres frequences ?
D'ailleurs mon signal reconstruit est très bien représenté frequentiellement :
- la forme generale de la courbe est tout à fait respectée et les harmoniques eux sont virés...
- le seul soucis est que j'ai perdu en amplitude ....

Citation:
Envoyé par Winjerome Voir le message
Code :
YfftModif(1:nbFrequencesOK) = 0;
ah oui en effet, tu as tout à fait raison

Citation:
Envoyé par Winjerome Voir le message
Sauf que ce que tu fais est faux, ou disons imcomplet. Je te rappelle (ou pas ) que ton spectre est symétrique.
en effet j'avais oublié ceci.

Par contre je ne vois pas trop les consequences :
- Lorsque je fais un spectre je ne trace que la moitié car si je trace le graph complet j'ai une symétrie inutile. ça OK :-)
- par contre lorsque je fais une ifft j'ai bien besoin du spectre complet pour reconstruire comme il faut le signal dans le domaine temporelle ?
ou je ne prends qu'une moitié meme pour le "ifft" ?

ps :
par contre ce que je n'ai pas compris dans tout ça c'est pourquoi l'amplitude est modifiée

EDIT :
j'ai modifié mon bout de code qu'il y avait plus haut car j'avais fais une petite erreur...
A présent tout va bien à part la gestion de la symétrie (et mon probleme d'amplitude de mes courbes qui ont beaucoup diminuées -> mais ça doit être lié à ce probleme de symétrie)

Je tente une explication, peux tu me dire si c'est correct ?
- je prends mon vecteur de fréquence et je le divise en deux
- dans ce vecteur j'efface les amplitude des fréquences les plus hautes
- ensuite j'efface aussi les amplitudes des fréquences symétrique par rapport à la fréquence moyenne ?
- ensuite j'effectue ma transformée de Fourier inverse ?

j'ai peut etre un autre soucis : mon vecteur de frequence n'est pas une puissance de 2 ?
du coup ça peut poser probleme lors de l'utilisation d'une transformée de fourier inverse "ifft" ?
si oui pk ? (je n'ai pas trop compris pk en general on veut un vecteur multiple de 2)
didierBB est déconnecté   Envoyer un message privé Réponse avec citation 01
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h55.


 
 
 
 
Partenaires

Hébergement Web