psd_subspace
Calcul d'un spectre par la méthode des sous-espaces.
Namespace: dsp::fourier
Prototype
tuple<Vecf, Vecf> psd_subspace(const Veccf &x, int Ns, int Nf=1024, int m=0)
Parameters
x | Signal to be analyzed. |
Ns | Nombre d'exponentielles pures attendues |
Nf | Résolution fréquentielle (en nombre de points) |
m | Dimension de la matrice d'auto-corrélation (si non précisé = dimension du signal) |
Returns
A tuple with two elements: frequences vectors (normalized, between -0.5 and 0.5), and the spectrum.
Description
Cette technique d'estimation spectrale est une méthode paramétrique, qui suppose que le signal est constitué de la somme d'un nombre fini et connu d'exponentielles pures.
La formule utilisée ici est celle de l'algorithme MUSIC (MUltiple SIgnal Classification).
- Note
- Cette fonction est une spécialisation de la méthode des sous-espaces pour la détection d'exponentielles pures. Cependant, la méthode des sous-espaces elle-même est bien plus générale, et peut permettre de détecter d'autres types de signaux (voir la fonction psd_subspace()).
- Warning
- Cette technique implique la décomposition en valeurs propres d'une matrice \(m\times m\) (la matrice d'auto-corrélation du signal), soit de l'ordre de \(m^3\) opérations. Par conséquent, si la dimension du signal est importante, il est conseillé de choisir un \(m\) plus petit.
Exemple : détection de 3 exponentielles pures
soit nfreqs = 3, n = 256;
// Signal constitué de bruit blanc...
Veccf x = randn(n);
// ... et de 3 fréquences pures
pour( auto f: {0.113423, 0.212213, 0.323432})
x += sigexp(f, n);
// Algorithme MUSIC : 3 exponentielles, matrice d'auto-corrél 32x32
soit [fr, Smu] = psd_sousesp(x, nfreqs, 1024, 32);
Figures f;
f.subplot().plot(x, "" , "x" );
f.subplot().plot_psd(x);
f.gcf().titres( "PSD (corrélogramme)" , "Fréquence" );
f.subplot().plot(fr, Smu);
f.gcf().titres( "PSD (MUSIC)" , "Fréquence" );
PSD vs MUSIC spectrum
Notez comme le spectre MUSIC est plus propre ; il ne faut cependant pas oublier que cette technique suppose connu le nombre de signaux (ici 3).- Note
- Pour la détection de sinusoïdes pures (signaux réels), il faudra choisir \(N_s\) comme étant deux fois le nombre de signaux à détecter (en effet, un cosinus ou sinus peut se représenter comme la somme de deux exponentielles complexes).
See also
subspace_spectrum()