Se connecter
Se connecter

ou
Créer un compte

ou
Tutoriel

Réaliser une fft dans Pure Data

Par Nimon le 26/07/2005 - (Confirmé)
Agrandir
Ajouter ce produit à
  • Mon ancien matos
  • Mon matos actuel
  • Mon futur matos
Pd-iem Pure Data
Photos
1/22

Introduction

Pour analyser un signal, il est indispensable de pouvoir visualiser son spectre. Dans ce tutoriel, nous détaillons la réalisation d'une abstraction Pure Data qui permet le calcul de la fft (Fast Fourier Transform) d'un signal audio.

Étape 1

Créez un nouveau patch puis sauvegardez le sous un nom approprié, "fft.pd" par exemple. Le fait de sauvegarder le patch va permettre de le réutiliser dans d'autres patchs, ce qui est indispensable pour une analyse spectrale.

Il faut maintenant choisir la taille de la fft. Placez pour cela l'objet [block~] en lui donnant pour argument 1024, ce qui signifie que les signaux audios sont traités dans des buffers de 1024 échantillons.

Étape 2

La transformée de Fourier nécessite trois signaux : le signal à analyser, la fenêtre et la fft. Placez donc trois tableaux en cliquant sur Put > Array. Le signal et la fenetre ont pour taille 1024, tandis que la fft est deux fois plus petite soit 512 échantillons.

Si vous voulez pouvoir utiliser plusieurs fft dans vos patchs vous devez ajouter l'identifiant unique "$0-" au début du nom de chaque tableau.

Étape 3

Ajoutez maintenant un [bang] général qui déclenchera le calcul de la fft. Créez une entrée audio avec l'objet [inlet~] et reliez le bang et l'entrée à un objet [tabwrite~ $0-signal].

A chaque fois que vous cliquerez sur le bang, le tableau $0-signal sera rempli avec 1024 échantillons provenant de l'entrée [inlet~].

Étape 4

Il faut maintenant créer la fenêtre. Un cosinus peut faire l'affaire si on lui donne une amplitude de 0.5, qu'on lui ajoute 0.5 pour qu'il évolue entre 0 et 1 et qu'on le déphase de pi. Pour cela placez un objet [osc~] relié à un objet [*~ -0.5], puis à un objet [+~ 0.5].

La fréquence du cosinus se calcul par rapport à l'objet [samplerate~] qui connait la fréquence d'échantillonnage. Reliez cet objet à un [/ 1024] puis à l'entrée fréquentielle du cos~.

Enfin reliez la sortie traitée du cosinus à un objet [tablewrite~ $0-fenetre] et banger le tout comme sur le schéma! (Attention : DSP ON)

Étape 5

Calculez maintenant la fft proprement dite. Pour cela placez deux objets [tabreceive~] ayant pour argument $0-signal et $0-fenetre et multipliez-les. Reliez les ensuite à l'objet [rfft~] qui calcul la partie réelle et imaginaire de la fft de l'entrée.

Prenez ensuite le carré de chacune des deux sorties de [rfft] et sommez les. Envoyez le tout dans le tableau $0-fft avec [tabsend~ $0-fft]. Voilà vous avez votre première version de la fft, vous pouvez reliez un signal pour tester son effet (un bruit blanc par exemple).

Étape 6

AArgh, cependant la fft calculée est inutilisable dans son état actuel. Il faut en effet visualiser son logarithme pour avoir une information intéressante. Le problème est qu'il n'existe aucun objet log audio mais seulement un objet log data.

Vous allez donc écrire en audio... et lire en données. Créez un nouveau tableau de 512 points appelé $0-fftlog. La lecture doit se faire après l'acquisition audio, placez donc après le bang général un delay de 25 ms avec l'objet [delay 25] qui va commander la lecture (la durée précise peut être calculée avec l'objet samplerate~).

Étape 7

Créez maintenant un compteur de 0 à 511 à l'aide des objets [until], [mod] et [select] cablés entre eux comme sur le schéma.

A chaque bang, l'objet [until] va banger l'objet float 512 fois. L'objet [float] s'incrémente de 1 à chaque fois jusqu'à la valeur 512. A cette valeur, l'objet [modulo] sort 0, qui est utilisé par l'objet [select] pour arreter [until]. C'est un peu complexe mais cela permet d'utiliser uniquement des objets natifs Pure Data.

Étape 8

Le logarithme de la fft à afficher est : $0-fftlog = 10log10($0-fft) = 10 ln($0-fft)/ln(10). Creéz en premier un objet [tabread $0-fft] (Attention sans le ~) et reliez son entrée à la sortie du compteur (objet [float]).

Pour calculer ln($0-fft)/ln(10), il faut en premier calculé ln(10). Créez donc un objet [trigger f b] qui va en premier banger à droite puis sortir son entrée float à gauche. Réalisez ensuite les opérations mathématiques nécessaires.

Reliez la valeur logarithmique calculée à l'entrée d'un objet [tabwrite $0-fftlog] et récuperez la valeur de l'index sur la sortie du compteur.

Étape 9

Il faut maintenant mettre en forme l'ensemble pour la visualisation. Placez les 3 tableaux inutiles (fft, signal, fenetre) dans un sous patch. Editez les propriétés de l'affichage de $0-fftlog avec Clic droit > Properties sur le tableau.
Dans la fenêtre graph mettez les valeurs suivantes :
  • screen width : 512
  • Y from -130 to 50
  • screen height : 300
Dans la fenêtre array décochez la sauvegarde des données ( repetez l'opération également dans les tableaux signal et fft) et cochez draw as polygon.

Étape 10

Vous allez maintenant ajouter une légende. Pour ce faire, créez le message [$1-fftlog ylabel -15 40 20 0 -20 -40 -60 -80 -100( que vous bangerez au démarrage à l'aide d'un [loadbang] suivi d'un float contenant l'identifiant unique [f $0].

Vous pouvez également rajouter une entrée données pour commander le bang général avec [inlet].

Étape 11

Réduisez maintenant la taille de la fenêtre à ce que vous voulez uniquement voir. Activez l'option Graph-on Parent avec un clic droit sur un endroit vide du patch, puis Properties > graph on parent coché.

N'oubliez pas d'enlever le signal de test [noise~]

Enfin créez un petit patch pour tester votre fft!

Conclusion

Nous avons ici réalisé une analyse spectrale utilisant uniquement des objets inclus dans la distribution de base de Pure Data. Des concepts fondamentaux ont été introduits sans être détaillés, tel le graph on parent, l'ambivalence signal audio/contrôle, l'objet trigger... en espérant que ce tutoriel vous aurez donnez envie de poursuivre votre exploration du formidable logiciel libre qu'est PD.

Vous souhaitez réagir à cet tutoriel ?

Se connecter
Devenir membre