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

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

Marsh Posté le 13-09-2009 à 12:55:55    

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

Marsh Posté le 13-09-2009 à 12:55:55   

Reply

Marsh Posté le 15-09-2009 à 11:18:19    

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

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed