Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2867 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

  [Matlab] (Résolu) Décalage de fréquences avec DCT

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Matlab] (Résolu) Décalage de fréquences avec DCT

n°1923700
Dagnir
El Che vive
Posté le 13-09-2009 à 12:55:55  profilanswer
 

:hello:  
 
J'essaye de retrouver le spectre d'un signal en utilisant les dct et idct de Matlab.
Le problème c'est que quand j'échantillone le signal le spectre que je trouve est décalé.
 
Par exemple je me crée un spectre en gaussienne centré sur 1500GHz, avec une résolution de 0.05GHz  

Code :
  1. e = 0.05*GSI;
  2. spectrum.center = 1500*GSI;
  3. spectrum.range = 50*GSI;
  4. spectrum.amplitude = 1;
  5. f = 0:e:50*spectrum.center;
  6. spectrum.val = spectrum.amplitude * exp(-((f-spectrum.center)/spectrum.range).^2);


 
Je calcule ensuite le signal qui lui est associé avec idct et je met une échelle de temps linéaire  

Code :
  1. [tps, InSignal] = S2R(spectrum.val, f);
  2. function [t, r] = S2R(s, f)
  3. df = f(2) - f(1);
  4. tmax = 1 / (2*df);
  5. t = tmax * linspace(0, 1, size(s, 2));
  6. r = idct(s')';


 
Si je fais la dct de InSignal avec une mise à l'échelle similaire, je retombe bien sur le spectre d'origine.
Par contre si je fais la même chose mais en prenant par exemple un point sur 8 du signal, pour simuler un sampling, et que je fais la DCT de ce signal "échantilloné", les fréquences sont décalées vers les basses fréquences.
Par exemple

Code :
  1. [frequence spectre]  = R2S(InSignal, tps);
  2. [frequence2 spectre2]  = R2S(InSignal(1:8:floor(length(t)/8)), tps(1:8:floor(length(t)/8)));
  3. plot(frequence, spectre, 'r')
  4. hold on
  5. plot(f, spectrum.val, 'k')
  6. plot(frequence2, spectre2,'g')
  7. function [f, s] = R2S(r, t)
  8. T = t(2) -  t(1);
  9. fmax = 1 / (2*T);
  10. f = fmax * linspace(0, 1, size(r, 2));
  11. s = dct(r')';


 
J'obtiens ca  
http://img27.imageshack.us/img27/9011/frequencyshift.jpg
 
J'ai aussi essayé de sampler plus de points qu'il n'y en a dans InSignal (en faisant une interpolation linéaire) et dans ce cas le maximum du spectre obtenu est très légèrement décalé mais vers la droite.
Si par contre je prends un spectre rectangulaire ou des raies (InSignal = somme de quelques cosinus), je ne vois pas de décalage quelque soit l'intervalle entre les points que je prends.
 
Je pense que ca viens d'un problème d'échelle puisqu'en principe l'intervalle entre les points samplés influe sur la fréquence maximale su spectre, pas sur la résolution. Mais j'ai utiliser le meme principe que ce qui est donné en exemple dans l'aide sur la fft pour créer les échelles, donc je suis assez perdu, quelqu'un pourrait m'orienter ?


Message édité par Dagnir le 15-09-2009 à 13:38:46

---------------
Nous vous souhaitons de beaux rêves, c'est le cinéma gratuit.
mood
Publicité
Posté le 13-09-2009 à 12:55:55  profilanswer
 

n°1924174
Dagnir
El Che vive
Posté le 15-09-2009 à 11:18:19  profilanswer
 

Bon, après avoir retravailler mes échelles au poil en fonction du nombre de points et tout et tout, le problème était toujours là.
Or d'après Wikipedia c'est la DCT de type II qui est la plus utilisée, et elle considère que le premier point échantilloné n'est pas à t=0 mais à Ts/2 (Ts période de sampling).
C'était pas précisé dans l'aide de Matlab mais ca doit bien être une DCT-II qui est calculée puisqu'en commencant mon échantillonnage à t=Ts/2 plutot qu'à t=0 j'obtiens ca
http://img195.imageshack.us/img195/7476/dctii.jpg
(en pointillés le spectre de départ et en rouge le spectre calculé à partir du signal samplé)
Ce qui est beaucoup mieux.

 

Cela dit on peut voir que les valeurs sont légérement en dessous "à gauche" et légérement au dessus "à droite", ce qui fait que le maximum est déplacé vers la droite. Sur l'exemple le maximum est décalé de 4GHz, ce qui est plus que la précision que je suis sencé avoir (j'échantillonne jusqu'à t=4/3 . 10^-9 s donc je devrais avoir une résolution df = 1/tmax = 0.75GHz).
Mais pour le coup je pense que c'est plus un problème mathématique qu'un artéfact de l'algorithme employé. Enfin si quelqu'un a une idée :hello:

 


Auto-réponse :
Ben en fait c'était la même chose, quand je crée mon spectre de départ et que je fais une idct pour avoir le signal, le premier point correspond à t=Ts/2 et pas à t=0. J'ai  juste eu à décaler l'echelle de temps et maintenant ca a l'air de bien marcher :)
Moralité : faire attention au type de DCT utilisé (Matlab = DCT type II)


Message édité par Dagnir le 15-09-2009 à 13:39:52

---------------
Nous vous souhaitons de beaux rêves, c'est le cinéma gratuit.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

  [Matlab] (Résolu) Décalage de fréquences avec DCT

 

Sujets relatifs
[Résolu] Informations d'une photo[Résolu] erreur stray \320 \240
Résolu : Récupérer le nom d'un tableau dynamique sous Excel2007[Résolu] warning friend declaration
[RESOLU] Lors de l'éxecution un coup ca marche, un coup ca marche pas[RESOLU]J2ME et la génération de timestamp...
[Résolu]pb compilation operator ++[RESOLU]Limiter le nombre de résultats d'un fichier xml
[Résolu] problème de CSS sur un menu[Résolu] Macro excel pour tri tableau par semaine
Plus de sujets relatifs à : [Matlab] (Résolu) Décalage de fréquences avec DCT


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR