Acoustic passion

Acoustic passion

Linux - Filtre antirepliement : oversampling ALSA/JACK

Bonjour,

Dans cet article je vais aborder le problème du filtrage anti-repliement spectral de la reproduction sonore.

Je vous renvoie sur ce site et un post de forum que j'ai réalisé sur le très bon site de Dominique Pétoin (une référence...) :

http://users.polytech.unice.fr/~leroux/courssignal/node24.html
http://smf.petoindominique.fr/index.php?topic=1055.0

Comme on peut le constater, le filtre antirepliement spectral est simplement un filtre passe-bas qui coupe toutes les fréquences supérieures à la fréquence de sampling original (44,1khz pour la plupart du temps : sampling des CD audio grands publics...).

Pour éviter les effets de repliement spectral lors de la reproduction sonore, la solution la plus efficace est la combinaison d'un oversampling numérique avec filtrage numérique passe-bas a 22050hz d'ordre extrêmement élevé. En effet, on peut obtenir une pente extrême avec un déphasage linéaire (group delay).

J'ai choisi un filtre numérique de 2048 coefficients pour une fréquence oversamplé de 88,2khz (pile poil le double de 44,1khz tiens, il suffit donc de rajouter 1 zero entre chaque sample du signal original et de filtre ce signal par une convolution avec le filtre passe-bas numérique antirepliement !)

Plus le filtre numérique est long, plus le signal est retardé. Ce retard est de (N-1)/2*sampling, ce qui nous donne donc dans mon cas un retard de

2048-1/2*sampling=0,0116s=11,6ms.

C'est une latence tout à fait convenable.

Concernant la réalisation du filtre, je l'ai designé sous HolmImpulse par une astuce que je ne décrirai pas ici (ce n'est pas le but de l'article).

Le filtre que j'ai généré possède une réponse plate de 0 a 20000hz, puis une chute a partir de 20000hz jusqu'à 22050hz ou l'amplitude atteint -190dB (en théorie).

Après conversion du domaine fréquenciel au domaine temporel (obtention du filtre sur 2048 coefficients), la réponse réelle du filtre obtenu est la suivante :



Les coefficients du filtre, sous format texte, a télécharger ici.

Enregistrez ce fichier comprenant les coefficients du filtre dans le répertoire de votre choix, et réglez brutefir de façon a faire une convolution du signal avec ce filtre.

Si vous ne savez pas comment faire : rtfm (Read The Fucking Manual) ou contactez-moi pour un exemple de configuration.

Il suffira alors de faire traverser votre flux audio par brutefir, pour appliquer le filtre antirepliement. Brutefir étant un logiciel permettant une convolution extrêmement rapide et performante (possibilité de calcul interne en 64bits a condition de le paramétrer pour bien sûr !), cette convolution n'utilise même pas plus de 5% de mon CPU, contrairement a des algorythmes d'upsampling de libasound2 (plugins alsa) qui font grimper mon CPU de 50% !!

Pour ce qui est des flux ALSA, la connection ALSA/JACK par le pcm "plug" gérant l'oversampling (malheureusement je ne sais pas comment le désactiver, ou effectuer un oversampling par ajout simple de "0" interlacés...), j'ai utilisé l'algorithme d'une librairie disponible : speexrate_best.

Ce filtre effectuant un premier oversampling a priori de qualité avec une suppression efficace des hautes fréquences, rien n'empêche d'appliquer par-dessus notre filtre JACK en fin de boucle ;p

Il faut pour cela les packages "libasound2" et "libresample0".

Il suffit de créer/éditer un fichier nommé .asoundrc dans votre répertoire home. Pour cela, entrez dans un terminal la ligne de commande suivante (sans le "#") :

# sudo gedit ~/.asoundrc

Le fichier doit contenir ceci :

defaults.pcm.rate_converter "speexrate_best"

pcm.!default {
     type plug
     slave
     {
           pcm "rawjack"
     }
}

pcm.rawjack {
      type jack
      playback_ports {
           0 system:playback_1
           1 system:playback_2
      }
      capture_ports {
           0 system:capture_1
           1 system:capture_2
      }
}

Enregistrez le fichier (Ctrl+S). Tapez ensuite en ligne de commande :

# sudo alsa-utils restart

Cette commande permet de relancer alsa, ce qui chargera alors votre fichier de configuration alsa nouvellement crée (.asoundrc).

Ce fichier permet de configurer ALSA pour définir le "pcm" a utiliser par défaut. Ici, les applications ALSA utiliserons le plugin "plug" qui gèrera la concordance du flux avec le plugin "jack" qui lui permettra l'interfacage du flux avec le serveur jack.

Lorsque vous lancerez une application alsa, le flux audio sera alors connecté au serveur jack, et la fréquence de sampling sera ajustée a la fréquence requise pour le flux audio jack (par l'intermédiaire du plugin "plug"), l'upsampling 44,1khz ==> 88,2khz sera donc réalisé ici pour le flux ALSA (ou 48khz ==> 88,2khz dans le cas d'un flux a 48khz ou un downsampling dans le cas d'une lecture de blueray par exemple...).

La première ligne de commande définie l'algorithme utilisé pour l'upsampling, ici donc je conseille l'utilisation de "speexrate_best".

Il existe d'autres algorithmes disponibles (notamment "samplerate_best", "samplerate_medium", "samplerate_linear" et "samplerate_hold" mais leur qualité/consommation CPU sont bien inférieurs a l'algorithme de speexrate... Du moins a l'écoute je n'obtiens rien d'agréable est des consommations de CPU totalement abhérentes : 70% pour l'upsampling du flux sur 2 canaux seulement... (j'ai un proc E8400, 2coeurs cadencés a 3Ghz, y'a pire ! ;).


13/01/2011
0 Poster un commentaire

Inscrivez-vous au blog

Soyez prévenu par email des prochaines mises à jour

Rejoignez les 20 autres membres