Les fichiers audio dans LTspice pour la simulation d’effets

Cet article explique comment importer et exporter des fichiers audio (au format wav) dans LTspice.
Cela est très intéressant pour tester un effet analogique et simuler par exemple le rendu d’une pédale de guitare!

Commençons par un montage de base avec un AO:

baseInv

C’est un amplificateur inverseur. Comme R1 = R2, c’est un inverseur simple.

L’AMPLIFICATEUR OPERATIONNEL

Pour l’ampli op, on a choisi un ampli op standard LM741. 

Je passe rapidement sur les détails techniques : on utilise le fichier LM741.sub et on ajoute la directive
« .lib C:\monchemin\LM741.sub »
On renomme opamp2 en LM741/NS.

LM741

Il reste à ajouter une alimentation symétrique en -4.5v, +4.5V pour alimenter l’AO. On utilise pour cela deux « cells » avec les labels V+ et V- :alimA0

Ci-joint le circuit inverseur.

AJOUT D’UN FICHIER AUDIO EN ENTREE

Le « trick », c’est de presser la touche « ctrl » tout en cliquant droit sur le générateur de tension (le composant « voltage »):

EntreeWav1

Dans le champ « value », on utilise le mot clef wavefile
wavefile= »C:\monchemin\monfichier.wav » chan 0
chan 0 indique de prendre le premier canal, en cas de fichier stéréo.
EntreeWav2
Ci-joint le fichier audio (enregistré avec un smartphone de base) : say it aint so extrait . Ce fichier dure environ 15.2 secondes. Dans la « simulation command », on ajuste la durée à 15.3 secondes.

ENREGISTREMENT DU FICHIER AUDIO EN SORTIE

On ajoute pour cela une directive avec le mot clef .wave :
.wave « C:\monchemin\monfichierWavOut.wav » 16 44100 Vout

  • .wave : pour indiquer que la sortie est un audio au format wav,
  • « C:\… » : le nom du fichier de sortie,
  • 16 : nombre de bits de quantification – 16 bits est la valeur standard,
  • 44100 : fréquence d’échantillonnage en Hz, c’est à dire le nombre de valeurs par seconde. 44100, c’est la qualité CD,
  • Enfin, Vout est le label qui correspond à la sortie.
  • SortieWav

SIMULATION D’UN EFFET PASSE-BAS

Pour que cela devienne intéressant, on transforme notre circuit inverseur en un passe-bas par l’ajout d’une capa en parallèle de la résistance R2.

SortieWavPasseBas

La fréquence de coupure du passe-bas est 1/(2*pi*R2*C1). Avec C1=160n, cette fréquence est d’environ 1kHz.

On lance la simulation. Notez bien que la simulation demande une latence considérable. Il est conseillé de tester son circuit sur des fichiers courts.

Ci-joint, le fichier audio en sortie du passe-bas : say it aint so extrait passe base 1kHz .

CONCLUSION

L’audio en entrée et en sortie, la possibilité de simuler des effets analogiques. Rien à dire : LT spice c’est génial!

P.J. : le schéma spice pour le passe-bas avec audio en entrée et sortie : PB

Compiler le code source de TensorFlow avec les optimisations AVX2 et FMA sous Mac OS X

Ce post concerne l’installation du paquet TensorFlow à partir du code source.

La motivation première est d’éviter ce warning :

"The TensorFlow library wasn't compiled to use AVX2 and FMA instructions, but these are available on your machine and could speed up CPU computations."

Pour contextualiser, je travaille sur un MacBook Pro 2017:

MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
Processeur 2.3 GHz Intel core i5 (2 coeurs)
Mémoire 8 Go 2133 MHz LPDDR3
Graphisme Intel Iris Plus Graphics 640 1536 Mo

Donc pas de GPU.

L'objectif est de compiler TensorFlow « nativement » pour ma machine, ce qui a priori devrait être mieux optimisé et donc plus performant en temps de calcul que l’installation standard par « pip install tensorflow ».

Cet article est principalement inspiré de la documentation de TensorFlow : https://www.tensorflow.org/install/source.
Je suis parti en fait de ce « post » : https://gist.github.com/winnerineast/05f63146e4b1e81ae08d14da2b38b11f, dans lequel il manque cependant des prérequis avant la compilation.
Enfin, la compilation sous Mac OS fait appel à « Bazel ». Son installation est expliquée là : https://docs.bazel.build/versions/master/install-os-x.html.

Dans un premier temps, j’explique l’installation d’Anaconda et la mise en place d’un environnement virtuel.
Ça n’est pas directement lié à notre problème, mais cela permet de poser le contexte.

Anaconda

Installation

Il faut aller là https://www.anaconda.com/distribution/ et cliquer sur le lien 64-Bit Command Line Installer (435 MB) - installation en ligne de commande.

Ensuite ouvrir un terminal et aller dans le répertoire Downloads

$ cd Downloads

Lancer l’installation

$ bash Anaconda3-2019.07-MacOSX-x86_64.sh

Création d’un environnement virtuel (python 3.6)

$ conda create --name py36 python=3.6 anaconda

Quand on veut activer l’environnement virtuel dans un terminal

$ source activate py36

Pour sortir de l’environnement

$ conda deactivate
On revient à nos moutons : taper

$ source activate py36

Puis

$ conda update numpy (inutile a priori puisqu’on vient d’installer l’environnement py36, mais ça peut servir s’il est déjà installé).

ON REVIENT A LA COMPILATION

 

ATTENTION, à ne pas oublier.

Il faut installer deux paquets avant la compilation sous peine de générer des erreurs.

$ source activate py36 (si ce n’est pas déjà fait)

$ pip install -U keras_applications==1.0.6 --no-deps

$ pip install -U keras_preprocessing==1.0.5 --no-deps

Pas besoin de l’option «--user » parce qu’on est dans un env. virtuel.

INSTALLATION DE BAZEL

« install Bazel using binary installer » tel que décrit dans https://docs.bazel.build/versions/master/install-os-x.html

Dans le GitHub, sélectionner la version 0.26.1 https://github.com/bazelbuild/bazel/releases/tag/0.26.1 puis télécharger le fichier bazel-0.26.1-installer-darwin-x86_64.sh

Enfin installer :

$ cd Downloads

$ bash bazel-0.26.1-installer-darwin-x86_64.sh --user

Attention, il est important que la version de Bazel soit <= 0.26.1

TELECHARGEMENT DU CODE SOURCE DE TENSORFLOW

$ git clone https://github.com/tensorflow/tensorflow.git

$ cd tensorflow

$ git checkout r1.14

La dernière ligne indique que l’on utilise la version/branche 1.14 de TensorFlow

COMPILATION

$ source activate py36 (si ce n’est pas déjà fait)

$ ./configure

Garder les options par défaut dans la configuration.

En particulier, l’option « march=native » indique que la compilation est faite pour votre Mac.

$ bazel clean

$ bazel build -c opt --copt=-mavx2 --copt=-mfma  -k //tensorflow/tools/pip_package:build_pip_package

ATTENTION LA COMPILATION PEUT PRENDRE DU TEMPS, PLUSIEURS HEURES SUR MA MACHINE.

CONSTRUIRE LE PAQUET

$ ./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

INSTALLER LE PAQUET avec pip

$ pip install /tmp/tensorflow_pkg/tensorflow-1.14.1-cp36-cp36m-macosx_10_7_x86_64.whl

Test pour vérifier que TensorFlow fonctionne

Sortir du dossier tensorflow :
$ cd

$ source activate py36 (si besoin)
$ python
Python 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 13:42:17) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name=‘a')
>>> b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name=‘b')
>>> c = tf.matmul(a, b)
>>> with tf.Session() as sess:
        print (sess.run(c))
        aa = sess.run(a)
        bb = sess.run(b)
>>> print(aa.dot(bb))

Et voilà!

Comment enlever la musique de fond dans le tts Acapela (text to speech)?

Dans ce post, je vais expliquer comment retirer la musique de la parole, dans l’audio généré dans la démo de Acapela. Nous allons enregistrer le flux audio généré avec Audacity et en utiliser un programme home-made en python pour la séparation parole/musique.

Acapela permet faire de la synthèse de la parole à partir du texte ou encore TTS – Text To Speech. Il y a plein de voix possible et le truc marche super bien.
Acapela propose une version de démonstration avec une limite de temps sur l’audio généré et avec la musique ajoutée à la parole.

Pour sauvegarder la parole et retirer la musique de fond, il va falloir :

  1. entrer une phrase dans le TTS dans Acapela demos.
  2. enregistrer le flux audio avec Audacity et générer la phrase
  3. sauvegarder l’audio dans Audacity en faisant attention de le mettre en 22050 Hz.
  4. télécharger l’application appcapela qui est une interface graphique (GUI) en python 3, qui va permettre de séparer la parole de la musique.

On va enregistrer un flux audio avec Audacity. Ceci est détaillé dans l’article Enregistrer vos flux audio avec Audacity sous Windows  Il faut:

  1. taper « peripherique » dans la case en bas à gauche de Windows, choisir « gérer les périphériques audio ». Dans l’onglet « enregistrement », cliquez droit sur « mixage stéréo » et puis « activer » et « définir comme périphérique par défaut ».peripherique-enregistrement
  2. lancer Audacity, changer les options d’enregistrement:Audacity_wasapi2
    1. sélectionner « Windows WASAPI »
    2. à côté du microphone choisir « xxx (loopback) ». Dans mon cas, c’est « OUT (UA – 25EX (loopback) » parce que j’ai une carte son USB UA-25EX. L’important, c’est « loopback » qui permet de récupérer le flux audio.
    3. Choisir « 1 (Mono) Recording Channel », pour enregistrer en mono.
    4. Important, choisir une fréquence d’échantillonnage de 22050 Hz!
      Audacity_22kHz
      On peut toujours ré-échantillonner avec ffmpeg, avec la commande
      « ffmpeg -i monfichier.wav -ar 22050 monfichier_22050.wav ».
      Je ferai peut-être un post sur l’utilisation de ffmpeg sous Unix et sous Windows (plus tricky).
    5. Lancer l’enregistrement (bouton rouge en haut)
    6. Lancer le flux à enregistrer, comme YouTube par exemple. Dans notre cas, ce sera la démo de Acapela.
    7. Stopper l’enregistrement
    8. Nettoyer l’enregistrement avec l’outil ciseau Audacity_ciseau
    9. Enfin exporter l’audio.Audacity_export

Installer python/ Anaconda3

Le programme permettant de séparer la voix de la musique est écrit en Python. Il va donc falloir installer Python (version 3.x) avec Anaconda. Télécharger aussi le programme qui se trouve dans « GitHub ».

  1. télécharger Anaconda3 et l’installer.
    Anaconda pour Python 3
  2. La version 3.7 de Python s’avère être incompatible avec le paquet « wxpython-phoenix » qui se charge de l’interface graphique. On va donc créer un environnement virtuel pour python 3.6. C’est la bonne manière de procéder. Pour cela, on ouvre une fenêtre DOS en tapant « cmd » en bas à gauche de l’écran Windows (là où il y est écrit « Tapez ici pour rechercher »), puis entrée/return.
    Dans la fenêtre de commande, tapez conda create –name py36 python=3.6 anaconda (création de l’environnement)
  3. activer l’environnement en tapant « activate py36 » dans la fenêtre de commande. Sous Linux ou Mac Os, ce serait « source activate py36 ».
  4. Télécharger appcapela
    Aller dans mon repo « LaurentNorbert » dans GitHub : appcapela et télécharger :download_appcapela
    puis décompresser l’archive.
  5. Pour lancer appcapela :
    1. lancer la fenêtre de commande en tapant « cmd » en bas à gauche dans la barre Windows et taper entrer/return pour la lancer.
    2. si c’est une nouvelle fenêtre de commande, tapez « activate py36 ».
    3. installer les paquets en ligne de commande en tapant:
      1. conda install -c newville wxpython-phoenix
      2. pip install resampy
      3. pip install soundfile
    4. aller dans le répertoire dans lequel on a décompressé l’archive. Si le répertoire est « C:\Users\laure\Downloads\appcapela-master\appcapela-master », alors tapez « cd C:\Users\laure\Downloads\appcapela-master\appcapela-master ».
    5. taper « pythonw appcappella.py » pour lancer l’application.
      Attention il faut utiliser pythonw et non python, parce que c’est une application graphique (GUI).ihm
    6. Dans l’interface graphique :
      1. cliquez sur le bouton « model and speech output folder » et sélectionnez le répertoire outputandmodel.
      2. cliquez sur le bouton « noisy file » et choisissez le fichier audio que vous souhaitez dé-bruiter.
      3. cliquez sur « process file », attendez qu’un popup vous indique que le traitement est terminé.
      4. le fichier traité se trouve dans le répertoire outputandmodel

DONE !!!!

Comment importer une diode Zener dans LTspice?

Bonsoir,

Je reprends mon blog. Je me suis  découvert une passion pour l’électronique pendant l’année 2015 et je ponds ici un premier article technique.

J’utilise un logiciel gratuit (?) LTspice qui permet de modéliser n’importe quel schéma d’électronique ANALOGIQUE. A la root’s quoi.

Je trouve ce logiciel génial. Il permet de faire un pont entre le fer à souder et la simulation sur ordi. La théorie et la pratique quoi. Par contre, il faut pas mal barouder sur le net pour trouver les bonnes informations quand ça coince.

Entrons dans le vil du sujet: l’objectif de ce post est d’expliquer comment importer un modèle de composant dans LTspice, en l’occurrence une diode Zener 5.1V.

Le contexte: je souhaite obtenir une alimentation symétrique (+4.5V,0V,-4.5V) à partir d’une pile 9V.

Voici le schéma du montage sous LTspice :

AlimZenerDebut2

En rouge, entourée la diode Zener. Le modèle ne me convient pas.

Je veux une diode Zener à 5.1V.

Voici comment j’ai procédé:

  1. chercher une librairie sur le net. google  » ltspice zener diode « . On choisit un lien proposé, par exemple: http://www.simonbramble.co.uk/lt_spice/ltspice_lt_spice_models.htm (lien valide au 2/01/2015). On télécharge le fichier »spicemodels_zener_diodes.zip » en cliquant sur le lien « Zener Diodes« .On le dé-zip et on extrait un fichier « zener_diodes.txt ».
  2. Il y a un petit problème : ce fichier contient des erreurs, il manque des « .ENDS » à la fin de certaines sous-fonctions (qui commencent par. SUBCKT). Alors, soit on ajoute des « .ends » partout où il en manque, et il en manque! J’ai opté pour une autre solution: j’ai recopié les définitions (des diodes) qui m’intéressent dans un nouveau fichier « ZenerDiodesBZX84.lib ». Comme son nom l’indique, je n’ai gardé que les diodes zener de type « BZX84 ». J’ai vérifié qu’aucun « .ends » ne manque à l’appel. J’ai ensuite placé ce fichier dans un répertoire de mon choix « G:\Users\Laurent\Documents\LTspice\modelWeb ». Il n’est pas nécessaire de le placer dans un sous-répertoire de LTspice, et je le déconseille.
  3. Je lance dans LTspice. Je crée le beau circuit qui contient une diode Zener. Il n’y a pas de diode zener 5.1V!
    1. J’ajoute la directive SPICE : « .lib G:\Users\Laurent\Documents\LTspice\modelWeb\ZenerDiodesBZX84.lib« , afin que LTspice prenne en compte ma librairie de diodes Zener.
    2. Je vais avec la souris sur le texte associé à la diode. Je clique droit et je remplace le texte « D » par « DI_BZX84C5V1 » pour avoir une diode Zener bzx84C5V1 qui a un seuil de 5.1V.
      AlimZenerRes
      C’est presque fini. Presque!
    3. Là c’est tricky. Dernière étape: il faut indiquer à LTspice que le composant est défini de manière externe, c’est à dire dans ma librairie. Pour cela, il faut placer la souris sur la diode et presser la touche ctrl tout en cliquant droit avec la souris. Il apparaît une fenêtre « Component Attribut Editor ». L’attribut « Prefix » a pour valeur « D » pour indiquer que c’est une diode. On remplace cette valeur par « X », qui indique que c’est un composant défini de manière externe.
      attributEditor
      Attribute Editor avant changement

      attributEditorAfter
      Attribute Editor après changement

J’ai pas mal galéré entre le fichier .lib qui contenait des erreurs et surtout le changement de la valeur de l’attribut « Prefix ».

Ce qui est à retenir:

  1. On peut ajouter des composants dont on trouve la définition sur le net. On les inclut dans un circuit avec la directive Spice: « .lib maLibrairie.lib ».
  2. S’il s’agit d’une variante d’un composant existant déjà dans Spice, on donne au champ « Prefix », dans la fenêtre « Component Attribut Editor », la valeur « X », qui signifie « Externe ».

J’ai trouvé la solution sur le site « Adding Spice Models to LTspice« .

Je mets en lien la librairie et le circuit avec la diode Zener en question.

 

 

Une expérience amusante

Bonsoir!

kaleidoscope physique

Aujourd’hui, je propose une expérience ludique extraite du livre « Le kaleidoscope de la physique » .
C’est un livre très riche et passionnant sur la physique de la vie de tous les jours, entre autres. Pour comprendre le livre, il faut avoir un minimum de connaissances en physique (niveau lycée).

Bon, j’en viens à l’expérience :
Placez un verre rempli d’eau dans un four à micro ondes. Faites fonctionner le four une à deux minutes. Que se passe-t-il? L’eau est chaude! Normal…

Maintenant mettez un verre rempli huile et un verre avec un peu d’eau (par sécurité) dans le micro ondes et faites le fonctionner quelques minutes. Le résultat : l’huile n’est pas chaude ou peu chaude. Bizarre!

En effet, une molécule d’eau (H2O) a des propriétés électriques particulières (il forme un dipôle électrique) et le four micro ondes produit un champ électro-magnétiques. Les molécules d’eau se mettent en mouvement sous l’action de ces ondes électro-magnétiques. Or, « un corps chaud n’est pas autre chose qu’un corps dont les atomes s’agitent beaucoup ».
Par contre, l’huile n’a pas ces propriétés électriques (la molécule d’huile ne forme pas un dipôle). Donc l’huile ne s’échauffe pas sous l’effet des ondes.

En fait, essentiellement, seuls les aliments qui contiennent de l’eau peuvent être réchauffés dans un micro ondes. L’eau dans les aliments chauffe et réchauffent les autres molécules des aliments par conduction thermique. C’est pour cela que la cuisson est identique à l’intérieur et en surface des aliments (l’effet de peau mis à part).
Vous pourrez trouver plus de détails dans le livre sus-cité (chapitre « Quand la physique envahit la cuisine », pages 149 à 152).

Connecteurs

Bonsoir,

Voici un petit article sur les connecteurs de la marque Molex.
D’après wikipedia, ce sont des connecteurs qui sont utilisés pour l’alimentation des disques durs, des lecteurs CD/DVD et des ventilateurs dans les ordinateurs.

Voici une photo que j’ai récupérée sur la page de Molex de wikipedia.

220px-Molex1

Je me suis dit « je connais! C’est dans mon PC ». Je ne sais pas si ça fait de moi un geek.

Enfin, voilà. Ce que je trouve génial, et qui est expliqué dans l’article wikipedia, c’est que l’entreprise Molex, fondée en 1938, fabriquait initialement des pots de fleurs en plastique!

Une belle aventure industrielle…

VST et DLL

Bonsoir à tous,

Un article sur les plugins VST (traitement audio) qui font appel à une librairie externe sous windows (une « DLL »).

Un plugin VST est un petit logiciel qui s’intègre à un éditeur audio comme « audacity » ou à un séquenceur (j’utilise « Reaper » qui est gratuit).

Je suis en train de faire un plugin VST pour faire du débruitage (off-line) dans audacity.

Mon plugin VST en soi est assez classique. On sélectionne une zone avec du bruit seul et on prend une « empreinte » du bruit dans un premier temps. Ensuite on sélectionne la zone à débruiter avec les réglages qui vont bien. Il existe déjà un plugin de ce type dans audacity et il marche plutôt pas mal. Je veux en faire un « home-made ». J’expliquerai peut-être dans un prochain article comment il fonctionne.

Enfin, je travaille sur ce plugin VST. Comme dans beaucoup de traitements audio, ce plugin utilise la transformée de Fourier discrète. Pour cela, j’ai d’abord utilisé la librairie « FFTW » (« Fastest Fourier Transform in the West »). C’est une librairie « libre de droits » (licence GPL). Elle se présente sous forme d’un fichier DLL sous windows. Sans entrer dans les détails, un programme qui utilise FFTW dans son code doit avoir sous la main cette DLL au moment de l’exécution. Et donc, il doit savoir où la trouver!

Cependant, avec audacity comme avec Reaper, mon plugin VST (qui se présente lui aussi sous forme d’une DLL) n’est pas reconnu. En investigant un peu, je me suis rendu compte que le coupable est la fameuse DLL de FFTW. Je ai mis les deux DLL (la DLL qui est mon plugin et la DLL de FFTW) dans le répertoire des plugins VST. Et ça, ça ne marche pas.

Depuis, j’ai passé mon chemin et j’utilise la fft de ALGLIB (ALGLIB FFT). Là pas de DLL externe. Le code C++ est compilé directement en même temps que le plugin. Miracle, ça marche sans problème. ALGLIB est aussi une librairie « libre » pour toute utilisation non commerciale (licence GPL).

A posteriori, je me dis qu’en mettant la DLL externe utilisée par le plugin VST dans le répertoire où est exécuté le programme (là où se trouve audacity.exe par exemple), ça aurait pu le faire. Mais bof.

P.S:

Voici deux liens expliquant comment intégrer une DLL à un code C/C++ avec Visual Studio et  les emplacements où windows va chercher les librairies et dans quel ordre.

How do I use a third-party DLL file in Visual Studio C++?

delay load DLL error (module not found)

Bon, dans un prochain post, je vous expliquerai comment j’ai fait ce plug-in.

Bonne nuit!

Dérangements mathématiques

Bonsoir,

Je commence ce blog par un questionnement mathématique.

J’ai eu besoin au cours d’un travail de classer des films (film 1, film 2, film 3 etc.).
Ensuite dans une phase d’apprentissage, l’ordinateur choisissait les films dans un ordre aléatoire. Je n’avais pas beaucoup de films mais j’ai remarqué que souvent l’ordre choisi par l’ordinateur pour les films et mon classement coïncidait pour zéro ou un seul film.

ça m’a amené à me poser la question suivante: si on prend des nombres de 1 à n et qu’on les « mélangent » (ça s’appelle une permutation), quels sont le nombre et la proportion de permutations qui auront 0, 1, 2 ou n points fixes?

Par exemple, si on prend les nombres de 1 à 3,
– il y a une permutation à 3 points fixes (1,2,3) -> (1,2,3), – c’est l’identité.
– il y a 0 permutations à 2 points fixes,
– il y a 3 permutations à 1 point fixe,
(1,2,3)->(1,3,2)
(1,2,3)->(3,2,1)
(1,2,3)->(2,1,3)
– il y a 2 permutations à 0 points fixes – ce sont des « dérangements ».
(1,2,3)->(3,1,2)
(1,2,3)->(2,3,1)

Au total, il y a 1+3+2 = 6 permutations avec 3 nombres.

Je voulais vérifier mathématiquement la propriété intuitive que si on un grand ensemble de nombre de 1 à n (n grand), la configuration la plus probable pour une permutation est qu’il n’y ait pas de point fixe. Une permutation qui n’a pas de point fixe est appelée dérangement.

En fait, la proportion de dérangements parmi toutes les permutations possibles est asymptotiquement (quand n devient grand), de environ 36.8% (1/e où e est le nombre d’Euler). La proportion de permutations avec 1 seul point fixe est asymptotiquement la même.

J’ai mis en pièce jointe un document avec des démonstrations pour calculer le nombre de dérangements par deux méthodes.
Vous trouverez aussi plus d’information et des démonstrations en faisant une recherche sur ce thème dans les forums de http://www.les-mathematiques.net

pièce jointe: invariantsPermutations