Modérateurs: Modération Forum DIY, Modération Forum Installations, Le Bureau de l’Association HCFR • Utilisateurs parcourant ce forum: Zbymar et 46 invités

Egalisation sous Linux avec le framework AVDSP de maxidcx

Message » 03 Mai 2020 16:29

Bonjour,

maxidcx c'est lancé dans un projet ambitieux : modifier le firmware de l'interface USB d'un oktodac pour l'utiliser aussi comme DSP !
Après tout, la puissance de calcul de l'XMOS dans ces interfaces est généralement sous utilisée.
https://www.homecinema-fr.com/forum/diy-sources/extension-dsp-pour-dac-okto-research-t30102466.html

Alors non seulement il a réussi, mais il a en fait créé un véritable framework de programmation dsp générique, portable et le tout en opensource :
https://github.com/fabriceo/AVDSP

A partir de cette base, il était facile de l'intégrer au sous-système son de Linux (Alsa), offrant ainsi la possibilité d'ajouter n'importe quel traitement DSP à un streamer Linux.

Le but de ce post, n'est pas de décrire le fonctionnement et l'utilisation d'AVDSP. D'abord par ce que je suis pas doué pour la doc et ensuite par ce qu'un framework de programmation n'est pas forcement une chose simple qui s'explique en un post.

Je vais au contraire, vous montrer une utilisation basique, ne nécessitant pas de programmation : l'égalisation de la réponse en fréquence à partir d'EQ générées avec REW.

Cela s'adresse à des utilisateurs ayant quand même une certaine habitude de Linux (compilation depuis des sources, configuration Alsa ...), mais rien d'insurmontable.

1) Téléchargement et compilation
Les sources sont téléchargeable ici :
https://github.com/fabriceo/AVDSP/releases/tag/v1.0

Une fois téléchargées et unzippées, lire la partie compilation du fichier AVDSP/module_avdsp/linux/README.md pour compiler l'ensemble du framework.
Au final ont dispose dans le répertoire AVDSP/module_avdsp/build, d'une commande : dspcreate et d'un plugin Alsa : libasound_module_pcm_avdsp.so

A noter, que, comme on compile sur la machine d’exécution, ceci est valable quelque soit la plateforme (x86_64 ou ARM).

2) Création des EQ avec REW
Avec REW, charger la mesure de la réponse que vous voulez égaliser. (voir tutos sur ce forum).

Lancer l'outil EQ en configurant l'utilisation du dsp : generic. Ce mode mettra à votre disposition de nombreuses fonctions d'égalisation et de filtrage. Elles sont pratiquement toutes supportées par AVDSP (sauf LS 12 et HS 12 , mais LS et HS le sont).

Une fois satisfait du résultat, exporter les eqs sous forme de fichier texte (menu : File/Export/Export filter settings as text)

Si vous voulez des eqs différentes pour votre enceinte gauche et droite créer deux fichiers. (Par exemple : filtregauche.txt et filtredroit.txt).

3) Génération du bytecode
AVDSP est fondé sur l'utilisation d'un code intermédiaire (bytecode). Le fichier de bytecode doit être généré avant de pouvoir être exécuté par le runtime. C'est le rôle de la commande dspcreate :

Code: Tout sélectionner
./dspcreate -binfile eq.bin -dspformat 2  -dspprog ../dspprogs/REWgenericEQ.so filtregauche.txt filtredroit.txt

  • eq.bin est le nom du fichier bytecode à générer
  • REWgenericEQ.so est un programme AVDSP. dspcreate execute ce programme pour qu'il lise les fichiers d'EQ texte de REW et fasse les appels au framework AVDSP afin de creer le bytecode.
  • -dspformat 2 est nécessaire car AVDSP sait générer du bytecode pour traitement en flottant ou int64 (et d'autres). Seul le format int64 (2) est supporté en Linux.
  • filtregauche.txt filtredroit.txt sont les deux fichiers générés à l'étape 2.
    Si vous voulez les mêmes eq pour les deux voies, il faut répéter le nom du fichier deux fois sur la ligne de commande.

4) Installation et configuration Alsa
Maintenant que l'on a le fichier de bytecode, il va falloir l’exécuter (en fait l'interpréter).

C'est le rôle du plugin alsa : libasound_module_pcm_avdsp.so. Il faut le recopier au bon endroit pour qu'il soit pris en compte par Alsa. Cela peut dépendre de la distribution Linux utilisée (ie : sur une Fedora c'est : /usr/lib64/alsa-lib/ ).

Il faut modifier le fichier de configuration Alsa (/etc/asound.conf) et rajouter les lignes suivantes :

Code: Tout sélectionner
pcm.dsp {
        type avdsp
   dspprog "/mydir/eq.bin"
        slave {
                pcm "hw:USB,0"
        }
}


Cela va créer un nouveau device Alsa appelé dsp qui fait appel au plugin AVDSP pour interpréter /mydir/eq.bin et envoyer le résultat vers le device "hw:USB,0"
Bien-sur, il faut adapter /mydir au path où vous avez mis eq.bin et USB,0 au nom Alsa de la sortie son utilisée. (en général le nom du DAC).

5) Utilisation
C'est presque fini :zen:
On a maintenant un nouvel device Alsa qu'il suffit d'utiliser comme sortie son. Alsa va rediriger le flux vers le plugin AVDSP qui renverra vers le device slave !
Pour l'essayer , on peut tester avec aplay :
Code: Tout sélectionner
aplay -D dsp

Si il n'y a pas d'erreur d'ouverture de device, alors tout ba bien :bravo:

Ensuite tout dépend de votre utilisation.
Par exemple pour un serveur mpd on configurera ainsi :
Code: Tout sélectionner
audio_output {
   type      "alsa"
   name      "DAC"
   device      "dsp"
   dop      "no"
}


Mais tout programme pouvant jouer du son dans un device Alsa pourra utiliser le plugin avdsp en jouant vers le device dsp...
Et voila :bravo:

Encore une fois, ce n'est qu'un exemple d'utilisation. Le plus simple en fait ...
On peut par exemple aussi, faire du filtrage actif, si on dispose d'une carte son possédant plusieurs voies. Il suffit de créer autant de fichiers texte eq que de voies (ie 6 pour une paire d'enceinte 3 voies) et utiliser REWgenericEQ de la façon suivante :
Code: Tout sélectionner
./dspcreate -binfile eq.bin -dspformat 2  -dspprog ../dspprogs/REWgenericEQ.so -w 3 bassG.txt mediumG.txt aigueG.txt bassD.txt mediumD.txt aigueD.txt

Le device dsp aura alors 2 voies en entrée et 6 voies en sortie vers le DAC (il peut y avoir un peu de conf Alsa supplémentaire pour le routage).

Si on veut aller plus loin, il faut mettre les mains dans le cambouis et commencer à programmer ses propres fonctions de DSP, comme maxidcx l'a fait pour son filtrage soustractif...
Dernière édition par tcli le 28 Sep 2020 11:58, édité 1 fois.
tcli
 
Messages: 4066
Inscription Forum: 23 Nov 2009 22:40
Localisation: Complètement à l'ouest
  • offline

Message » 03 Mai 2020 21:28

Excellent, un rapprochement de ça avec rephase sur une machine Linux serait le rêve :D
Avatar de l’utilisateur
speedbad
Membre HCFR
Membre HCFR
 
Messages: 3640
Inscription Forum: 13 Fév 2005 5:12
Localisation: IdF
  • offline

Message » 04 Mai 2020 20:58

Merci beaucoup tcli pour le tutoriel et ton support pendant le développement! :bravo:
ca me donne envie de brancher le RPI pour tester dans Volumio...
maxidcx
Membre HCFR Contributeur
Membre HCFR Contributeur
 
Messages: 3103
Inscription Forum: 25 Avr 2007 10:50
  • offline

Message » 05 Mai 2020 11:58

speedbad a écrit:Excellent, un rapprochement de ça avec rephase sur une machine Linux serait le rêve :D

Alors on peut théoriquement faire aussi du FIR avec AVDSP, mais ce n'est pas la partie la mieux testée et elle sera moins performante qu'avec un BruteFIR qui fait de la convolution par FFT.

En fait actuellement, je n’utilise sous Linux que la partie que j'ai décrite ci-dessus, mais je regarde à faire du IIR pour la correction des basses et FIR court pour le haut (ce qui ne posera pas de pb de perf).

On a d'autres idées bizarres avec maxdcx, mais c'est trop tôt pour en parler.
tcli
 
Messages: 4066
Inscription Forum: 23 Nov 2009 22:40
Localisation: Complètement à l'ouest
  • offline

Message » 05 Mai 2020 15:30

Bravo a toi et a maxidcx :wink: très intéressant tout ça, merci pour le partage :wink:
wakup2
Pro-Divers
Pro-Divers
 
Messages: 10101
Inscription Forum: 14 Fév 2007 0:30
Localisation: Vouvray
  • offline

Message » 23 Mai 2020 13:55

tcli a écrit:
speedbad a écrit:Excellent, un rapprochement de ça avec rephase sur une machine Linux serait le rêve :D

Alors on peut théoriquement faire aussi du FIR avec AVDSP, mais ce n'est pas la partie la mieux testée et elle sera moins performante qu'avec un BruteFIR qui fait de la convolution par FFT.

En fait actuellement, je n’utilise sous Linux que la partie que j'ai décrite ci-dessus, mais je regarde à faire du IIR pour la correction des basses et FIR court pour le haut (ce qui ne posera pas de pb de perf).

On a d'autres idées bizarres avec maxdcx, mais c'est trop tôt pour en parler.


Ok merci, c'est du mono thread votre librairie ou sa parallélise genre répartition des canaux par core ?
Avatar de l’utilisateur
speedbad
Membre HCFR
Membre HCFR
 
Messages: 3640
Inscription Forum: 13 Fév 2005 5:12
Localisation: IdF
  • offline

Message » 23 Mai 2020 15:14

Sur le xcore c'est du multi-thread sinon il n'y aurait pas assez de puissance pour faire grand chose.
En Linux pour l'instant c'est mono thread mais j'ai fait en sorte que le passage au multi-thread soit possible.
Je le ferais surement un jour quand il y aura le besoin. Pour l'instant je l'utilise sur un petit PC avec quelques biquads, j'ai largement la puissance nécessaire sans multithreader.
tcli
 
Messages: 4066
Inscription Forum: 23 Nov 2009 22:40
Localisation: Complètement à l'ouest
  • offline

Message » 23 Mai 2020 15:23

Ok je pensais à un ODROID-N2 et un moyen de rentrer 7.1/stereo sur une carte USB pour sortir sur une autre carte USB carte 16ch
Avatar de l’utilisateur
speedbad
Membre HCFR
Membre HCFR
 
Messages: 3640
Inscription Forum: 13 Fév 2005 5:12
Localisation: IdF
  • offline

Message » 23 Mai 2020 17:40

ah oui quand même, ca va en faire des amplis derrière.
Si il y a vraiment besoin , je peut passer la version Linux en multi thread assez rapidement.
tcli
 
Messages: 4066
Inscription Forum: 23 Nov 2009 22:40
Localisation: Complètement à l'ouest
  • offline

Message » 23 Mai 2020 18:37

Pas tant que ça, je n'utilise pas tout (8 bientôt 10 sorties sur les 24) et pour l’arrière c'est juste rooté sans coupure mais avec EQ (enceinte d'angle :mdr:).

Je suis tombé la dessus, CamillaDSP, en gros un paquet linux qui est plus simple/complet que BruteFIR et tout aussi perf, il utilise RustFFT :
https://www.diyaudio.com/forums/pc-base ... n-etc.html
https://github.com/HEnquist/camilladsp

Comme tu disais que pour le FIR c'était pas le plus adapté.
Je réfléchis depuis un certain temps à simplifier mais ce n'est pas si simple que ça et pour le moment je ne trouve pas trop de solution qui me convienne.
Donc pas urgent le mutli thread mais ça serait gros plus pour la solution, puis voir le commit la dessus m’intéresse vachement :ane:
Avatar de l’utilisateur
speedbad
Membre HCFR
Membre HCFR
 
Messages: 3640
Inscription Forum: 13 Fév 2005 5:12
Localisation: IdF
  • offline

Message » 24 Mai 2020 9:39

punaise pour comprendre un code source "rust" faut se lever de bonne heure ! dur dur le dimanche matin. Dommage car ca aurait été intéressant de repiquer quelques notions pour les injecter dans AVDSP.
concernant le FIR, le code source actuel AVDSP n'utilise pas de fft pour la convolution, du coup ca reste très limité en nombre de taps.
maxidcx
Membre HCFR Contributeur
Membre HCFR Contributeur
 
Messages: 3103
Inscription Forum: 25 Avr 2007 10:50
  • offline

Message » 24 Mai 2020 11:45

Par contre AVDSP gère automatiquement le changement de filtre suivant la fréquence d'échantillonnage.
Avec BruteFIR c'est plus compliqué .
tcli
 
Messages: 4066
Inscription Forum: 23 Nov 2009 22:40
Localisation: Complètement à l'ouest
  • offline

Message » 02 Fév 2021 9:52

Salut
ca marche aussi sur raspberry pi4 avec Volumio!
j'ai juste galèré car les échantillons de tests son Mono et le plug in était en stéréo; en insérant un "type route" mono2stereo tout va bien.
merci tcli pour ton aide.
il y a de très belles perspectives avec ce plugin alsa avdsp :bravo:

je prévois de publier un tutoriel end-to-end pour volumio/rpi très prochainement :)
maxidcx
Membre HCFR Contributeur
Membre HCFR Contributeur
 
Messages: 3103
Inscription Forum: 25 Avr 2007 10:50
  • offline

Message » 02 Fév 2021 10:25

Bonne nouvelle. :bravo:

Il faudrait que je rendre l'entré et la sortie plus souple en terme de formats.
Pour l'instant c'est 16 ou 32 bits stéréo en entré et 32 bits stéréo en sortie.
Des vieux DAC USB peuvent ne pas supporter 32bits et il un player vouloir du 24 bits (mais a part aplayer qui est très limité, en général ils savent convertir).
tcli
 
Messages: 4066
Inscription Forum: 23 Nov 2009 22:40
Localisation: Complètement à l'ouest
  • offline

Message » 03 Fév 2021 15:49

Salut,
j'ai modifié le plugin avdsp pour qu'il supporte le S24_3LE en entrée.
j'en avais trop raz le bol de devoir passer par un "plug" pour pouvoir lire un fichier wav 24 bits directement avec aplay :hehe:
pour la sortie vers un dac qui ne supporterait pas le S32_LE je pense qu'il suffit d'insérer un "plug" entre la sortie slave dsp et l'entree du device pcm (dac). mais on peux aussi essayer de gérer çà dans une prochaine version.

aussi j'ai ajouté un paramètre "timestat" qui peux prendre une valeur 0 ou 1 à 60.
ca affiche de façon périodique le temps de traitement d'un sample en micro sec, et le % par rapport à la fréquence de sampling;
c'est juste le temps cpu pour la partie dsp, pas pour toute la chaine audio. mais ca donne une indication.
si on met 1, ca affiche le résultat une seule fois après la premiere seconde de traitement.
si on met une valeur > 1, ex 60, alors le résultat s'affiche à nouveau toutes les 60 secondes avec la moyenne sur ces 60 sec.
ca utilise la fonction clock() de time.h et ca à l'air de fonctionner.

pour info, en appliquant 6 biquads sur 2 canaux (donc 12 bq) sur une source wav 88k upsamplée à 192k 32bits par soxr, dans "top" le process mpd est à 16% cpu pour le raspi4 dont moins de la moitié pour le plugin avdsp à priori. ya de la marge pour faire un crossover 2x4voies avec EQ (en IIR) sans faire du multithreading semble t il

un truc a améliorer c'est la gestion du nombre de canaux d'entrée et de sortie en ayant la capacité de s'adapter à la source ou au device de sortie, car sinon on peux avoir besoin d'un plugin "route" qui prends du temps "inutilement". je creuse
EDIT: après avoir creusé :mdr: il s'avère que le plugin avdsp est déjà prévu pour s'adapter au nombre de channels du slave ! il suffit de générer des sorties à valeurs 0 dan les canaux inutilisés et on arrive a faire un mapping parfait entre les capacité du device cible et la source amont (le plus souvent stereo). ca roule
maxidcx
Membre HCFR Contributeur
Membre HCFR Contributeur
 
Messages: 3103
Inscription Forum: 25 Avr 2007 10:50
  • offline


Retourner vers Sources et DAC