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

Erreurs de calcul des DSP et optimalisation

Message » 24 Jan 2015 14:46

Les DSP font du filtrage et autres fonctions par calculs.
Ces calculs ont des limites avec les arrondis et d’un autre côté, tout comme l’analogique peuvent saturer.
Pour les arrondis, tout dépend du DSP : nombre de bits du signal et nombre de bits dans les calculs.

Avec aussi deux grandes familles : les DSP a virgule fixe et flottante. Ces derniers ayant bien moins de soucis de cet ordre.

Vu que j’utilise des DSP à virgule fixe avec le DSPiy il est intéressant de quantifier ces limites et leurs impacts en réel.
thierryvalk
 
Messages: 5617
Inscription Forum: 08 Mai 2012 9:39
Localisation: Belgique
  • offline

Impact en FIR

Message » 24 Jan 2015 14:46

Voici pour la théorie :

pos a écrit:Désolé pour le délai de réponse, il fallait que je trouve le temps de faire l'illustration.

L'ADA1452 veut des entiers? Je pensais qu'il était en 32 bits float.

Quelle est la précision nécessaire en FIR et ses conséquences ?
Quels sont les valeurs max générées par Rephase ?
Si la résolution semble trop faible, peut-on appliquer un coefficient multiplicateur sur les taps ? et quelle incidences : multiplication du gain ?


La valeur max de l'impulse sera dépendante de la correction.
Une correction "flat" (phase et amplitude plate) aura comme valeur max 1 (ou le plus grand entier dispo sur le format de sortie wav PCM choisi), ce sera un dirac. La même correction avec un gain global de 6dB (fader de l'onglet general) aura comme valeur max 2, toujours un dirac, etc...
Ensuite si il y a une correction d'amplitude et/ou de phase le pic de l'impulse sera plus réduit. Par exemple un allpass (inverse ou pas) aura la même energie qu'un dirac, mais étalée, donc le pic sera forcément inférieur...
Donc en gros sur un correction ne dépassant pas 0dB la valeur max sera toujours inférieure ou égale à 1.

D'ailleurs en passant, quand on choisi un format de sortie wav PCM et que le pic dépasse la valeur max, rePhase normalise automatiquement l'impulse et indique la réduction en dB dans une boite d'alerte.


Pour ce qui est des effets d'une perte de résolution, avec des entiers tu va simplement remonter les pallier de l'amplitude la plus basse possible pour la correction. L'effet est un peu le même que celui d'un fenêtrage rectangulaire de plus en plus court.

Voilà un exemple d'une correction (LP 96dB/oct à 1kHz) avec divers résolutions de sortie.

resolution diff.png


Le pic de l'impulse est à -27.5 dB, et on retrouve le noise floor théorique de chaque format et le niveau minimal de correction qu'il permet :
16 bits : 27.5 - 6x16 = -68.5 dB
24 bits : 27.5 - 6x24 = -116.5 dB
32 bits : 27.5 - 6x32 = -164.5 dB

évidemment en float on n'a pas ce problème...
thierryvalk
 
Messages: 5617
Inscription Forum: 08 Mai 2012 9:39
Localisation: Belgique
  • offline

Impact en FIR

Message » 24 Jan 2015 14:48

Mesures sur un DSPIy avec ADAU1452.

J’ai tout réglé au max avant écrêtage :
Sortie carte son en toslink -3dB, volume DSPiy à 0dB et entrée carte son à 107dB.
Dans rePhase, passe-haut à 2kHz LR 48 dB/octaves.

Les mesures :
fir bruit 0.jpg


En rouge, niveau de bruit en débranchant simplement l’entrée Toslink.
En violet, le résultat « de base » avec 0dB de gain dans rePhase et 0dB dans DStudio.
En orange, j’ai appliqué un gain de +6dB dans rePhase et compensé en mettant -6dB dsn DStudio après traitement FIR.
Enfin en bleu, toujours +6dB dans rePhase mais -6dB cette fois avant traitement FIR.
On constate que l’on gagné de l’ordre de 6dB de niveau de bruit.

L’explication : (sauf erreur de ma part vu que l’on rentre dans les math)

Le DSP ADAU1452 travaille en 32 bits et utilise des nombres sous la forme 8.24.
Ce qui veut dire 8 bits dont le bit de signe avant la virgule et 24 bits après la virgule.
Ce qui fait en décimal de +128.0 à -128.0
Avec 0dB dans rePhase dans mon exemple, le maximum de l’impulse sera de 0.91 avec +6dB il sera de 1.82.
Ce qui veut dire que l’on travaille sur 24 bits à 0dB et 25 lorsque l’on applique le gain de +6dB.

Le signal d’entrée, lui est en 24 bits et codé en 1.23 ; il recevra donc 7 bits en plus avant la virgule et 1 bits après la virgule passant d’une dynamique de 144dB à 192dB.
Ce qui fait en décimal de +1.0 à -1.0

On a gagné en niveau de bruit, mais il est rare d’être avec un volume à 0dB et un signal d’entrée à -3dB.
Voici les mêmes mesures avec un volume sur le DSPiy de -10dB.
Ces -10dB sont appliqués après tous traitements, juste avant de rentrer dans DAC :

fir bruit -10.jpg


Les différences sont vraiment faibles.
thierryvalk
 
Messages: 5617
Inscription Forum: 08 Mai 2012 9:39
Localisation: Belgique
  • offline

Message » 24 Jan 2015 15:50

En effet,ça doit pas être bien audible.à partir de -100dB... :-? (1.9Vrms/105=19µVrms)

surtout que les amplis derrière ont des planchers + élevés.
thierry38efd
 
Messages: 1735
Inscription Forum: 18 Sep 2013 7:36
  • offline

Message » 24 Jan 2015 22:48

Salut,
voila un sujet important car il ne s’agit pas de réduire à néant tout les effet à cause du "bruit" de calcul.

Concernant les FIR, j'avais fait une analyse avec une feuille excel (voir les 4 posts à partir d'ici: post177968113.html#p177968113) et en substance, on peux avoir un FIR de très bonne qualité simplement en ajoutant 6db de gain dans rephase, comme cela les coefs seront codés entre -2 et 2, soit en 2.24 avec signe, et reduire le gain en sortie bien sur.

il y a aussi d'autres problèmes avec les arrondis en IIR à cause du cumul de l'erreur. la double précision règle le problème.

Après il faut quand même se questionner sur la disto globale de toute la chaine de traitement numérique, asrc+appli dsp (iir, volume, fir, quantization...).
je conseil de (re)lire e white paper de Naim sur leur DAC à base de PCM1704, ils abordent ce problème à certains endroit et expliquent leurs choix pour maintenir 144db de SNR (numérique).
Par exemple, ils affirment qu'il est nécessaire de travailler en flottant avec mantisse sur 40 bits...

Avec une carte USBStreamer de Minidsp, il est possible de faire USB-I2S et I2S-USB et donc de faire une analyse SNR/THD en domaine numérique. je prévois d'en commander une pour me faire une idée sur ce point.
maxidcx
Membre HCFR Contributeur
Membre HCFR Contributeur
 
Messages: 3105
Inscription Forum: 25 Avr 2007 10:50
  • offline

Message » 25 Jan 2015 12:51

Le flottant, c'est pas magique non plus.
A moins de sortir le char d'assaut avec une mantisse monstrueuse, sur de l'audio avec une plage étroite du signal source (entier signé sur au plus 24 bits en en général 16), le flottant va introduire plein d'erreur de précision/quantisation. Le noise floor va être très bon, mais on va introduire plein d’artefacts et de distorsion.
Le virgule (algo) fixe est délicat à mettre au point, mais permet les meilleurs résultat et un passage facile en câblé. En soft, avec des instructions entières adéquates (gestion de "l’écrêtage"), et en ayant pris soin de tout bien "calibrer" sur toute la chaine, on fait des truc de fou sur un bête microcontrôleur.
Le flottant est plus facilement passe partout mais au pris d'une différence démesurée de ressource silicium mise en œuvres. Et on passe plus difficilement au "cablé". Un "très gros" DSP ou CPU en flottant (grosse mantisse) reviens au final à faire du virgule fixe sans le savoir quand bien codé et masquer une bonne partie des pblm de gestion de limites.
Tazz28
 
Messages: 2802
Inscription Forum: 03 Nov 2008 23:47
Localisation: Dreux
  • offline

Message » 26 Jan 2015 23:35

Tazz28 a écrit:Le flottant, c'est pas magique non plus.

Mais tellement pratique ...

Tazz28 a écrit:A moins de sortir le char d'assaut avec une mantisse monstrueuse, sur de l'audio avec une plage étroite du signal source (entier signé sur au plus 24 bits en en général 16), le flottant va introduire plein d'erreur de précision/quantisation. Le noise floor va être très bon, mais on va introduire plein d’artefacts et de distorsion.

Seulement si on si prend mal.
L'idéal c'est de programmer en flottant en ayant la culture virgule fixe :D

Tazz28 a écrit:Le flottant est plus facilement passe partout mais au pris d'une différence démesurée de ressource silicium mise en œuvres. Et on passe plus difficilement au "cablé". Un "très gros" DSP ou CPU en flottant (grosse mantisse) reviens au final à faire du virgule fixe sans le savoir quand bien codé et masquer une bonne partie des pblm de gestion de limites.

Mais ca coute plus rien d'avoir "Un "très gros" DSP ou CPU en flottant avec grosse mantisse" !!!

En ce moment, je ne fais plus trop d'audio. Je m'amuse avec des dongle TNT détournés pour faire des récepteurs radio logiciel large bande.
(http://sdr.osmocom.org/trac/wiki/rtl-sdr).
Pour 20$ on a un oscillateur digital >1Ghz , un mixeur IQ, 2 ADC 8bits échantillonnant à 28Mhz :o , 2 FIR pour donwsampler à ~2Msamples/s afin d'envoyer tout ca via un pauvre port USB.
On connecte le tout à une raspi et je fais du traitement de signal , pas trivial en flottant 64bits sur la raspi. :o
Au début j'avais des scrupules, je m'autocensurais d'un point de vue algo en me disant qu'il fallait pas trop en demander à la pauvre raspi.
Tu parles !, mon programme ne prenait au final que 50% de CPU ... avec une carte qui coute ~40€ ....
Non vraiment, y a vraiment plus de raison de s’embêter et quel confort de programmer en flottant !
Avant d'avoir des problèmes de dynamique avec 64bits faut y aller.

Si j'ai le temps , j'essaierais de voir quel longueur de filtre FIR stéréo on peut faire tourner avec jconvolver (http://kokkinizita.linuxaudio.org/linuxaudio/) sur une raspi ou une bananapi. Le résultat risque d'être surprenant

Sinon, j'ai en ce moment, sur mon bureau une Jetson TK1 de NVIDIA ( https://developer.nvidia.com/jetson-tk1). J'ai pas encore eu le temps de l'essayer :oops: , mais pour 200$ tu as :
- Kepler GPU with 192 CUDA cores
- 4-Plus-1 quad-core ARM Cortex A15 CPU
- 2 GB x16 memory with 64 bit width
- 16 GB 4.51 eMMC memory

Tu imagine, qu'au prix de se farcir de la programmation CUDA ou OPENCL ca doit un peu dépoter pour un prix encore raisonnable.
Bien sur, c'est pas adapté pour de l'audio au niveau interfacage, mais c'est pas impossible non plus ..
tcli
 
Messages: 4075
Inscription Forum: 23 Nov 2009 22:40
Localisation: Complètement à l'ouest
  • offline

Message » 27 Jan 2015 0:17

thierryvalk a écrit:En violet, le résultat « de base » avec 0dB de gain dans rePhase et 0dB dans DStudio.
En orange, j’ai appliqué un gain de +6dB dans rePhase et compensé en mettant -6dB dsn DStudio après traitement FIR.

Attention a ne pas trop vouloir pousser le gain dans le filtre FIR.
Même à 0db tu n'es pas garanti de ne pas avoir de saturation. :hein:
Un signal sinus est une chose , un signal complexe audio une autre.
En toute rigeur, tu auras une garantie de ne jamais saturer ton filtre , uniquement si la somme des valeurs absolues des coefs du fitre est inférieur à 1.0. Suivant ton filtre, ca peut t'ammener à diminuer un peu le gain

Note : quand je dis saturer, je veux dire avoir en sortie du filtre une valeur supérieure à 1.0. L'ADA utilisant une ALU avec plus de dynamique tu ne saturera pas vraiment l'ALU , mais tu auras quand même un problème ens sortie
tcli
 
Messages: 4075
Inscription Forum: 23 Nov 2009 22:40
Localisation: Complètement à l'ouest
  • offline

Message » 27 Jan 2015 0:20

L'idéal c'est de programmer en flottant en ayant la culture virgule fixe :D

On est d'accord.
Mais c'est pas qu'une histoire de prix.
Je me vois mal embarquer un truc à 200$ ou une R-PI et tout le binz qui va avec dans une enceinte ou un caisson tout ça pour une poignée de biquad ou de taps qui rentrent parfaitement dans un cortex M4 facilement utilisable/soudable sur une carte maison et donc la carte d'éval utilisable directement en audio coute 10€.

HS: Mon hackrf attend toujours une antenne digne de ce nom pour faire un peu plus mumuse...
Tazz28
 
Messages: 2802
Inscription Forum: 03 Nov 2008 23:47
Localisation: Dreux
  • offline

Message » 27 Jan 2015 0:32

Attention a ne pas trop vouloir pousser le gain dans le filtre FIR.

Le gain appliqué n’est pas vraiment là pour faire du gain, mais pour correspondre à la notation en virgule fixe qui ne fait pas du +1 -1 mais du +128 -128 qui est spécifique à l’ADAU1452.
Et l’idée est bien de diminuer le gain après traitement FIR pour retomber juste en sortie 24 bits.
thierryvalk
 
Messages: 5617
Inscription Forum: 08 Mai 2012 9:39
Localisation: Belgique
  • offline

Message » 27 Jan 2015 18:39

Oui, mais il faut être sur que la diminution gain se fait a partir du resultat dans l'ALU, si jamais le bloc fir de ADAU1452 a un ecreteur en sortie avant de transformer en 24 bits ca marche pas.
C'est un peut le pb de la solution AD , on ne sait pas trop bien ce qui il y a dans les blocs.
J'avais cru comprendre que tous les blocs étaitent interconneccté par des signaux 24 bits , donc en sortie du bloc FIR t'est en 24 bits ....

snon, réflécht bien au problème que j'évoquais : 0db dans le FIR ne veut pas dre pb de dépacement à la sortie lors du passage 24bits ...
tcli
 
Messages: 4075
Inscription Forum: 23 Nov 2009 22:40
Localisation: Complètement à l'ouest
  • offline

Message » 27 Jan 2015 18:59

En effet, la doc d’AD n’est pas très explicite.
De ce que j’ai compris le signal de 24 bits est transposé en 32bits dès l’entrée et remis en 24 en sortie I2S.
A noter que le DSP peut aussi gérer de l’audio 32 bits.

En entrée 24bits, il rajouterait en entrée 1 bits LSB et 7 en MSB.
Format maintenu pendant tout le traitement pour ensuite passer dans un écrêteur pour repasser en 24bits sur l’I2S tout en virant 1 bits de poids faible.

Mais je continue à réfléchir et chercher de la documentation.
Car la table FIR par défaut de SigmaStudio vaut 1 puis des zéros.

Je vais faire des tests pour visualiser les limites réelles.
thierryvalk
 
Messages: 5617
Inscription Forum: 08 Mai 2012 9:39
Localisation: Belgique
  • offline

Message » 28 Jan 2015 12:27

Hello, juste une petite remarque sur le niveau de "bruit" d'une FIR.

Contrairement à une IIR ou les erreurs de quantification cumulées vont introduire du bruit dans le signal (distorsion non linéaire) et où la résolution est primordiale, en FIR on n'aura quasiment aucune erreur de quantification (surtout en convolution directe: il n'y a pas grand chose de plus simple que ça), sauf évidemment mauvaise implémentation/complication de la convolution, ou saturation...
La seule vraie distorsion que va potentiellement introduire une FIR c'est de la distorsion linéaire, c'est à dire une variation de la courbe de réponse (amplitude et/ou phase) par rapport à ce que l'on avait prévu.

Par exemple le noise floor à -68dB que l'on voit sur la première image du topic, avec la FIR en 16bit fixe, ne veut pas dire que l'on aura du bruit à -68dB en sortie (disto non linéaire), mais bien que la courbe de réponse de la correction ne descendra pas sous les -68dB (disto linéaire), ce qui est évidemment très différent :D
Une FIR trop courte aura des effets similaires (Q plus faibles que prévues et/ou pallier dans le bas).

On peut observer cette distorsion linéaire sur la courbe "result" de rephase, qui prend également en compte depuis la version 0.9.9 la résolution de sortie.
pos
 
Messages: 1996
Inscription Forum: 07 Mai 2007 16:36
  • offline

Message » 28 Jan 2015 13:57

Merci pour cette précision importante.
En effet, sur mes premières mesures on constate que le niveau remonte que si l’on a du signal en entrée.
thierryvalk
 
Messages: 5617
Inscription Forum: 08 Mai 2012 9:39
Localisation: Belgique
  • offline

Message » 28 Jan 2015 22:20

Quelques tests du jour.
Pour avoir de meilleurs résultats, j’ai créé une application sur le DSPiy qui permet de sortir en SPdif ce qui élimine les problèmes de DAC et ADC de la carte son.
Vu que rephase ne permet pas de gain de plus de +6dB j’ai appliqué plusieurs taux de multiplication de l’impulse et compensé avec le gain après traitement FIR.
En orange 0dB appliqué jusqu’en jaune avec 48dB.
firgainimp.jpg

A partir de 32dB on voit le niveau max s’affaiblir, à mon avis imprécision au niveau du gain.
Par contre la disto reste toujours immesurable avec REW donc aucune saturation.


J’ai ensuite un peu joué avec le IIR.
Voici à 30Hz un biquad avec Q de 20 et -30dB.
distoq20.jpg


Voici quelques courbes à 30 et 100Hz avec des Q importants.
q30100.jpg

À 100Hz pas de soucis, par contre à 30Hz c’est très vite erroné.
thierryvalk
 
Messages: 5617
Inscription Forum: 08 Mai 2012 9:39
Localisation: Belgique
  • offline


Retourner vers Filtrage actif, Equalisation et Processeurs