{"id":3951,"date":"2020-12-07T23:14:59","date_gmt":"2020-12-07T22:14:59","guid":{"rendered":"https:\/\/ceo.oric.org\/?p=3951"},"modified":"2020-12-07T23:14:59","modified_gmt":"2020-12-07T22:14:59","slug":"linearisation-enveloppe-du-psg8912","status":"publish","type":"post","link":"https:\/\/oric.bqtt.net\/index.php\/2020\/12\/07\/linearisation-enveloppe-du-psg8912\/","title":{"rendered":"Compensation adaptative de la non-lin\u00e9arit\u00e9 du convertisseur num\u00e9rique analogique du modulateur d&#8217;amplitude du PSG AY-3-891x"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Quiconque souhaite adresser le sujet du modelage sonore sur Oric se verra t\u00f4t ou tard confront\u00e9 \u00e0 un des &#8220;d\u00e9faut&#8221; de son g\u00e9n\u00e9rateur de son le AY-3-8912: la non lin\u00e9arit\u00e9 du convertisseur num\u00e9rique analogique utilis\u00e9 dans le circuit d&#8217;enveloppe. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cet article pr\u00e9sente un proc\u00e9d\u00e9 de compensation de cette non lin\u00e9arit\u00e9 capable de s&#8217;adapter \u00e0 diff\u00e9rents volumes sonores. Ce m\u00e9canisme de lin\u00e9arisation, en plus de fournir une commande proportionnelle d&#8217;amplitude ouvre la porte \u00e0 la g\u00e9n\u00e9ration d&#8217;enveloppe tr\u00e8s pr\u00e9cise dont la granularit\u00e9 s&#8217;adapte automatiquement au volume sonore choisi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Position du probl\u00e8me<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"> Avant de nous lancer dans le contournement d&#8217;un probl\u00e8me, commen\u00e7ons par en cerner l&#8217;essence. Quel est exactement le probl\u00e8me de non lin\u00e9arit\u00e9 du machin truc ?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le sch\u00e9ma de principe ci-dessous illustre le fonctionnement de la g\u00e9n\u00e9ration sonore sur un Oric en m\u00eame temps qu&#8217;il introduit les grandeurs dont il va \u00eatre question dans la suite de l&#8217;article.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2020\/12\/GenerationSonore-1024x588.png\" alt=\"\" class=\"wp-image-3974\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Pour g\u00e9n\u00e9rer un son le PSG AY-3-891x utilise un g\u00e9n\u00e9rateur de signal carr\u00e9 dont il module l&#8217;amplitude proportionnellement \u00e0 une tension issue de la conversion num\u00e9rique analogique de la valeur d&#8217;enveloppe programm\u00e9e dans le registre d&#8217;amplitude. Malheureusement, la conversion num\u00e9rique vers analogique est entach\u00e9e d&#8217;une non lin\u00e9arit\u00e9 qui fait que la tension obtenue en sortie n&#8217;est pas proportionnelle \u00e0 la valeur programm\u00e9e dans le registre d&#8217;amplitude. Sur le sch\u00e9ma ci-dessus, on vois que la <strong>tension V<\/strong> a une forme arrondie l\u00e0 o\u00f9 la <strong>commande d&#8217;enveloppe E<\/strong> est en rampe rectiligne.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ce &#8220;probl\u00e8me&#8221; est clairement d\u00e9crit dans les donn\u00e9es techniques du composant AY-3-891x, \u00e0 travers les figures 8 et 9 du document &#8220;PSG AY-3-8912 Data Manual&#8221; ou entre les figures 2 et 3 du datasheet du PSG AY 3 8912 reproduites ci-dessous:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2020\/12\/DifferenceReelObtenu-1024x706.png\" alt=\"\" class=\"wp-image-3958\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">La figure ci-dessous montre clairement que, l\u00e0 o\u00f9 le g\u00e9n\u00e9rateur d&#8217;enveloppe ou la commande manuelle de l&#8217;amplitude demande un signal triangulaire (\u00e0 gauche), la commande analogique en entr\u00e9e du VCA (Voltage Controlled Amplifier) se trouve \u00eatre d&#8217;aspect plut\u00f4t franchement parabolique (figure de droite). Et ce ph\u00e9nom\u00e8ne est pleinement assum\u00e9e avec l&#8217;explication suivante:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Since the primary use of the PSG is to produce sound for the highly imperfect amplitude detection mechanism of the human ear, the D\/A conversion is performed in logarithmic steps with a normalized voltage range from 0 to 1 Volt.<\/p><cite>datasheet AY-3-8912<\/cite><\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Ce qui peut se traduire par:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Puisque la fonction premi\u00e8re du PSG est de produire un son \u00e0 destination du m\u00e9canisme hautement impr\u00e9cis qu&#8217;est l&#8217;oreille humaine, la conversion num\u00e9rique analogique est effectu\u00e9e \u00e0 l&#8217;\u00e9chelle logarithmique avec une plage de tension normalis\u00e9e entre 0 et 1 volt.<\/p><\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;oreille humaine est ind\u00e9niablement moins pr\u00e9cise qu&#8217;un modem ou un oscilloscope mais elle est capable de faire la diff\u00e9rence entre un violon qui joue un La et un piano qui joue un La .. Et la diff\u00e9rence repose, en grande partie, sur l&#8217;enveloppe sonore dont cette phrase nous sugg\u00e8re qu&#8217;elle peut ais\u00e9ment s\u2019accommoder d&#8217;une \u00e9chelle logarithmique en lieux et place d&#8217;une \u00e9chelle lin\u00e9aire.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quelqu&#8217;un qui souhaite tenter de faire g\u00e9n\u00e9rer un son pr\u00e9cis au AY-3-391x sera bien oblig\u00e9 de se poser la question suivante.  <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2020\/12\/EnveloppeDifference-1024x608.png\" alt=\"\" class=\"wp-image-3964\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Et dans cet article, je propose une solution qui consiste \u00e0 lin\u00e9ariser la commande d&#8217;enveloppe par une pr\u00e9-compensation logicielle de la d\u00e9formation \u00e0 laquelle on veut \u00e9chapper.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2020\/12\/PrincipeCompensation-1024x223.png\" alt=\"\" class=\"wp-image-3976\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Pour obtenir une <strong>tension V<\/strong> qui soit le plus possible proportionnelle \u00e0 une <strong>consigne d&#8217;enveloppe C<\/strong>, on peut \u00e9laborer une <strong>commande d&#8217;enveloppe E<\/strong> qui op\u00e8re une d\u00e9formation inverse \u00e0 celle que va produire la conversion num\u00e9rique analogique.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Techniquement, cela consiste \u00e0 appliquer une transformation \u00e0 la donn\u00e9e que nous voulons programmer dans le registre d&#8217;amplitude du AY-3-391x. Une transformation qui tente de compenser et d&#8217;anticiper les d\u00e9g\u00e2ts occasionn\u00e9s lors de la conversion en analogique de notre souhait d&#8217;amplitude formul\u00e9 num\u00e9riquement.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Identification de la d\u00e9formation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"> Dans la version General Instrument du datasheet du AY-3-391x, on trouve une version quot\u00e9e de la d\u00e9formation qui nous int\u00e9resse.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2020\/12\/EnveloppeMeasure.jpg\" alt=\"\" class=\"wp-image-3965\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Des quelques valeurs fournies sur ce graphique, on peut d\u00e9terminer une tendance :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>La valeur de 0.707V pour 14 correspond \u00e0 1\/sqrt(2)<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>La valeur de 0.5 V pour 13 correspond \u00e0 1\/sqrt(4)<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>La valeur de 0.25 V pour 11 correspond \u00e0 1\/sqrt(16)<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Il vient assez naturellement que la tension V en sortie de convertisseur est exprimable par la formule suivante :<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>V = 1 \/ SQRT(2<sup>(15-E)<\/sup>)<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">o\u00f9 :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>E<\/code> est le contenu du registre de contr\u00f4le de l&#8217;amplitude (valeur enti\u00e8re entre 0 et 15).<\/li><li><code>V<\/code> est la tension (valeur r\u00e9elle entre 0 et 1 V)<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dans google, on peut v\u00e9rifier que la courbe obtenue est proche de celle du mod\u00e8le. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2020\/12\/CompensationAY_02.png\" alt=\"\" class=\"wp-image-3967\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Compensation de la d\u00e9formation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour inverser cette fonction (et donc compenser son effet) on devra calculer la commande d&#8217;enveloppe <code>E<\/code> par la formule suivante: <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>E = 15-LOG<sub>2<\/sub>(1\/(V<sup>2<\/sup>))<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">o\u00f9 :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>V<\/code> est la tension (en volt) que nous voulons en sortie du convertisseur N\/A <\/li><li><code>E<\/code> est la commande d&#8217;enveloppe que nous devons programmer dans le PSG pour obtenir la tension <code>V<\/code>.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">La forme de cette fonction nous donne bien \u00e0 penser qu&#8217;elle compensera la courbe pr\u00e9c\u00e9dente.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2020\/12\/CompensationAY_03.png\" alt=\"\" class=\"wp-image-3969\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Maintenant que nous avons une fonction permettant de compenser la non lin\u00e9arit\u00e9 sur l&#8217;ensemble des valeurs possibles en sortie du convertisseur, nous allons voir comment il est possible d&#8217;adapter cette compensation \u00e0 des situations o\u00f9 nous d\u00e9ciderions de limiter le volume maximum sur un canal tout en gardant la m\u00eame dynamique du domaine d&#8217;entr\u00e9e. Nous renoncerions aux valeurs hautes de la tension (car c&#8217;est l\u00e0 que les impr\u00e9cisions sont les plus grandes) mais nous garderions toujours 16 valeurs possibles de consigne d&#8217;enveloppe. L&#8217;objectif est double:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li> gagner en pr\u00e9cision absolue,<\/li><li>offrir la m\u00eame expressivit\u00e9 d&#8217;un son quelque soit le volume sonore auquel on le restitue.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Adaptation de la compensation en fonction du volume<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;id\u00e9e cl\u00e9 ici est d&#8217;associer \u00e0 la consigne d&#8217;enveloppe maximale (15) un extremum de tension correspondent \u00e0 un palier r\u00e9el du composant physique. Ceci afin d&#8217;adapter au maximum la dynamique d&#8217;entr\u00e9e au potentiel de sorti et b\u00e9n\u00e9ficier au maximum du surcro\u00eet de pr\u00e9cision que nous offre le sacrifice des niveaux \u00e9lectriques \u00e9lev\u00e9s<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons vu au tout d\u00e9but que les paliers de tension du composant physique sont sous la forme: <code>1\/sqrt(2^(15-E))<\/code> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En injectant cette expression dans l&#8217;\u00e9quation vu pr\u00e9c\u00e9demment, et en simplifiant, il appara\u00eet que la commande d&#8217;enveloppe <code>E<\/code> \u00e0 programmer dans le PSG s&#8217;exprime par:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>E = Volume + 2*LOG<sub>2<\/sub>(C)<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">o\u00f9 :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>Volume <\/code>est une valeur enti\u00e8re entre 0 et 15,<\/li><li><code>C<\/code> est la consigne d&#8217;enveloppe exprim\u00e9e en 15\u00e8me du niveau \u00e9lectrique correspondant \u00e0 <code>Volume<\/code> <\/li><li><code>E<\/code> est la commande d&#8217;enveloppe que nous devons programmer dans le PSG pour obtenir la tension <code>V = C*(15\/Volume<\/code>).<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Cette expression est d&#8217;une telle simplicit\u00e9 qu&#8217;elle m&#8217;a tr\u00e8s fortement fait douter de mes calculs. J&#8217;ai donc \u00e9cris un petit script python pour:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>mod\u00e9liser la d\u00e9formation engendr\u00e9e par le convertisseur num\u00e9rique analogique,<\/li><li>calculer une table de compensation  pour chaque volume sonore (de 0 \u00e0 15),<\/li><li>simuler l&#8217;effet de la pr\u00e9-compensation,<\/li><li>comparer avec le cas sans compensation.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Voil\u00e0 les r\u00e9sultats obtenus pour le volume maximal de 15.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2020\/12\/LinearV15.png\" alt=\"\" class=\"wp-image-3980\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Les points verts repr\u00e9sentent la tension \u00e9lectrique obtenue lorsque le registre d&#8217;amplitude du circuit d&#8217;enveloppe n&#8217;est pas transform\u00e9. La valeur programm\u00e9e est directement celle de l&#8217;axe des abscisses.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La ligne en jaune repr\u00e9sente la tension \u00e9lectrique id\u00e9ale qui serait obtenue si la conversion num\u00e9rique analogique \u00e9tait purement lin\u00e9aire et que nous disposions d&#8217;un nombre infini de bit pour exprimer la consigne.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Enfin, les point bleus repr\u00e9sentent la tension \u00e9lectrique obtenue par la transformation de la consigne \u00e0 travers une table de compensation g\u00e9n\u00e9r\u00e9e par les \u00e9quations fournies plus haut.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nous constatons que les points bleus et vert reposent bien tous sur les m\u00eames paliers r\u00e9els du composant physique mais qu&#8217;ils sont arrang\u00e9s de telle sorte que leur \u00e9loignement \u00e0 la courbe id\u00e9al soit le minimum possible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;effet de la lin\u00e9arisation est ind\u00e9niable. Voyons comment se comporte l&#8217;adaptation de la compensation pour le cas de volume maximum que nous fixerions \u00e0 certains paliers du composant (paliers pour E=14 et E=12).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2020\/12\/LinearV14.png\" alt=\"\" class=\"wp-image-3984\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2020\/12\/LinearV12.png\" alt=\"\" class=\"wp-image-3985\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;adaptation de la compensation semble effective.  <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cette \u00e9tude th\u00e9orique a permis de:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>d\u00e9montrer la faisabilit\u00e9 math\u00e9matique d&#8217;une lin\u00e9arisation acceptable du comportement du circuit d&#8217;enveloppe du PSG AY-3-391x,<\/li><li>exposer le mat\u00e9riel algorithmique n\u00e9cessaire \u00e0 mise en \u0153uvre d&#8217;une compensation adaptative.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Vous pouvez t\u00e9l\u00e9charger ci-dessous le script python qui m&#8217;a servi \u00e0 g\u00e9n\u00e9rer la table de compensation, simuler son utilisation et v\u00e9rifier les r\u00e9sultats.<\/p>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2020\/12\/compAY.zip\"><br>compensation AY<\/a><a href=\"https:\/\/oric.bqtt.net\/wp-content\/uploads\/2020\/12\/compAY.zip\" class=\"wp-block-file__button\" download>T\u00e9l\u00e9charger<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Quiconque souhaite adresser le sujet du modelage sonore sur Oric se verra t\u00f4t ou tard confront\u00e9 \u00e0 un des &#8220;d\u00e9faut&#8221; de son g\u00e9n\u00e9rateur de son le AY-3-8912: la non lin\u00e9arit\u00e9 du convertisseur num\u00e9rique analogique utilis\u00e9 dans le circuit d&#8217;enveloppe. Cet article pr\u00e9sente un proc\u00e9d\u00e9 de compensation de cette non lin\u00e9arit\u00e9 capable de s&#8217;adapter \u00e0 diff\u00e9rents [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3993,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[338,22],"tags":[856,880],"class_list":["post-3951","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-338","category-ceomag","tag-psg-8912","tag-sound-generator"],"_links":{"self":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/posts\/3951","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/comments?post=3951"}],"version-history":[{"count":0,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/posts\/3951\/revisions"}],"wp:attachment":[{"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/media?parent=3951"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/categories?post=3951"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oric.bqtt.net\/index.php\/wp-json\/wp\/v2\/tags?post=3951"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}