Transformée à facteur de qualité constant (CQT)

Principe

La transformée à facteur de qualité constant ou plus communément appelée "transformée à Q constant" (CQT), introduite par J.C. Brown en 1988 (voir références), est une alternative intéressante à la transformée de Fourier fenêtrée (STFT / Short Time Fourier Transform) ou aux ondelettes pour l'analyse temps-fréquence, en particulier dans le domaine des applications audios.

En effet, pour ce type d'applications, la métrique de référence est définie par les capacités de l'oreille humaine, or nous percevons les sons justement par un système physique qui peut être modélisé par un banc de filtres de facteur de qualité à peu près constant, où ce que l'on appelle facteur de qualité Q est le rapport entre la largeur des filtres et leur fréquence centrale : Q = df / f. Autrement dit, à basse fréquence, nous somme capable d'une résolution fréquentielle très fine (quelques Hz à 1000 Hz), et à haute fréquence nous somme beaucoup moins précis (quelques dizaines de Hz à 10 KHz).

API du script SCILAB

Le script SCILAB que vous pourrez trouver ici (voir lien à droite) vous propose deux fonctions :

  • [t,f,Y] = cqt(x, fs, fmin, fmax, gamma, [Q = 34[, ofs = 20[, precision = 0.98]]]) Calcul de la transformée temps / fréquence CQT, avec :

    • t : vecteur des temps d'analyse (sortie)
    • f : vecteur des fréquences d'analyse (sortie)
    • Y : Matrice contenant la représentation temps fréquence calculée : axe du temps suivant la première dimension, et axe des fréquences suivant la deuxième dimension (sortie).
    • x : signal d'entrée
    • fs : fréquence d'échantillonnage (Hz)
    • fmin : fréquence minimum d'analyse (Hz)
    • fmax : fréquence maximum d'analyse (Hz)
    • gamma : rapport entre deux fréquences d'analyse successives. Par exemple, pour une précision d'un huitième de ton (un ton = un douzième d'octave), gamma = 2 ^ (1 / (12 * 8))
    • Q : facteur de qualité (valeur par défaut : 34)
    • ofs : Fréquence d'échantillonnage en sortie d'analyse temps / fréquence (valeur par défaut : 20 Hz)
    • precision : Précision de calcul de la CQT (valeur par défaut : 0.98). Plus la valeur est proche de 1, plus le calcul est précis, mais demande plus de temps et de mémoire.

  • cqt_plot(t,f,Y[,opt='n']) avec :

    • t,f,Y : valeurs retournées par la fonction cqt
    • opt : 'n' pour affichage linéaire en fréquence ou 'l' pour affichage logarithmique (valeur par défaut)

Exemple avec un chirp

Dans cet exemple, on teste la CQT sur un chirp linéaire 400-1000 Hz, suivi d'une fréquence constante 1000 Hz, le tout superposé avec une sinusoide à 300 Hz.

  // Sampling frequency = 8 KHz
  fs   = 8e3;
  // Minimum frequency of analysis = 100 Hz
  fmin = 100;
  // up to 1200 Hz
  fmax = 1200; 
  // Précision = 1 huitième de ton = 1 quarantuitième d'octave
  gamm = 2^(1/(12 * 4));
  
  // Generate a 4 seconds signal, in 2 parts:
  //  2 seconds of linear chirp from 400 to 1000 Hz
  //  2 seconds of constant frequency 1000 Hz
  // + constant frequency 300 Hz signal
  duree = 2;
  t1 = linspace(0,duree,duree*fs);
  f = [linspace(400,1000,duree*fs/2) 1000*ones(1,duree*fs/2)];
  phi = cumsum(f ./ fs);
  x = sin(2 * %pi * phi);
  x2 = sin(2*%pi*300 .* t1) / 2;
  x = x + x2;
  
  // Compute and plot the CQT
  [t,f,Y] = cqt(x, fs, fmin, gamm, nfreqs, Q = 34);
  cqt_plot(t,f,Y,'n');

Voilà ce que l'on obtient :

Résultat de la CQT (affichage temps / fréquence)

Exemple avec l'analyse de notes musicales

Ici, on teste avec un fichier audio contenant des notes de guitare (générées artificiellement), espacées de 1/2 ton, et groupées en 4 notes successives espacées de une seconde.

  [x,y] = loadwave("GUITAR-SCALE.wav");
  fs = y(3); // Sampling frequency
  
  // Decimate by 2 to decrease processing time
  d = 0.5;
  x = intdec(x, d);
  fs = fs * d;

  // A1 (midi 13)
  fmin = 55;
  // A8 (midi 97)
  fmax = 7040; 
  // Résolution = 1 demi-ton (1 douzième d'octave)
  gamm = 2^(1/12);
  
  [t,f,Y] = cqt(x, fs, fmin, fmax, gamm, Q = 34);
  cqt_plot(t,f,Y);

Voilà ce que l'on obtient : les différentes notes sont clairement identifiables, aussi bien à haute fréquence qu'à basse fréquence.

Résultat de la CQT (affichage temps / fréquence)