Comment l’audio est-il représenté avec des nombres?

J’aime penser à ce que tout peut être et est représenté par des nombres. Par exemple, le texte en clair est représenté par un code comme ASCII et les images sont représentées par des valeurs RVB. Ce sont les moyens les plus simples de représenter du texte et des images.

Quelle est la manière la plus simple de représenter l’audio avec des nombres? Je veux apprendre à écrire des programmes qui fonctionnent avec l’audio et j’ai pensé que ce serait un bon moyen de démarrer. Je n’arrive pas à trouver de bonnes explications sur internet.

Physiquement, comme vous le savez probablement, l’audio est une vibration. En règle générale, nous parlons de vibrations de l’air entre approximativement 20Hz et 20.000Hz. Cela signifie que l’air va et vient 20 à 20 000 fois par seconde.

Si vous mesurez cette vibration et que vous la convertissez en un signal élecsortingque (par exemple, en utilisant un microphone), vous obtenez un signal élecsortingque dont la tension varie dans la même forme d’onde que le son. Dans notre hypothèse de ton pur, cette forme d’onde correspondra à celle de la fonction sinusoïdale.

Maintenant, nous avons un signal analogique, la tension. Toujours pas numérique. Mais, nous soaps que cette tension varie entre (par exemple) -1V et + 1V. Bien entendu, nous pouvons attacher un voltmètre aux fils et lire la tension.

Arbitrairement, nous changerons l’échelle sur notre voltmètre. Nous allons multiplier les volts par 32767. Il appelle maintenant -1V -32767 et + 1V 32767 . Oh, et ça va arrondir à l’entier le plus proche.

Maintenant, nous raccordons notre voltmètre à un ordinateur et demandons à l’ordinateur de lire le compteur 44 100 fois par seconde. Ajoutez un deuxième voltmètre (pour l’autre canal stéréo), et nous avons maintenant les données qui vont sur un CD audio.

Ce format est appelé PCM linéaire 16 bits stéréo 44,100 Hz . Et ce n’est vraiment qu’un tas de mesures de tension.

L’audio peut être représenté par des échantillons numériques. Essentiellement, un échantillonneur (également appelé convertisseur analogique-numérique) prend une valeur d’un signal audio tous les 1 / fs, où fs est la fréquence d’échantillonnage. L’ADC quantifie alors le signal, qui est une opération d’arrondi. Donc, si votre signal est compris entre 0 et 3 volts (plage de pleine échelle), un échantillon sera arrondi à, par exemple, un nombre de 16 bits. Dans cet exemple, un nombre de 16 bits est enregistré une fois tous les 1 / fs /

Ainsi, par exemple, la plupart des fichiers WAV / MP3 sont échantillonnés avec un signal audio à 44 kHz. Je ne sais pas à quel point vous voulez en savoir, mais il y a cette chose appelée “taux d’échantillonnage de Nyquist” qui dit que la fréquence d’échantillonnage doit être au moins deux fois la fréquence souhaitée. Ainsi, sur votre fichier WAV / MP3, vous pourrez au mieux entendre les fréquences de 22 kHz.

Il y a beaucoup de détails dans ce domaine. La forme la plus simple serait certainement le format WAV. C’est de l’audio non compressé. Les formats tels que mp3 et ogg doivent être décompressés avant de pouvoir les utiliser.

La méthode la plus simple pour représenter le son sous forme de nombres est PCM (Pulse Code Modulation). Cela signifie que l’amplitude du son est enregistrée à une fréquence définie (chaque valeur d’amplitude est appelée un échantillon). Le son de qualité CD, par exemple, est un échantillon de 16 bits (en stéréo) à la fréquence 44100 Hz.

Un échantillon peut être représenté par un nombre entier (généralement 8, 12, 16, 24 ou 32 bits) ou un nombre à virgule flottante (valeur 16 bits ou 32 bits double). Le numéro peut être signé ou non signé.

Pour les échantillons signés à 16 bits, la valeur 0 serait au milieu et les valeurs -32768 et 32767 seraient les amplitudes maximales. Pour les échantillons non signés à 16 bits, la valeur 32768 serait au milieu et 0 et 65535 seraient les amplitudes maximales.

Pour les échantillons à virgule flottante, le format habituel est que 0 est au milieu, et -1.0 et 1.0 sont les amplitudes maximales.

Les données PCM peuvent ensuite être compressées, par exemple en utilisant MP3.

Exemple de génération audio minimale C

L’exemple ci-dessous génère un sinus pur de 1000 kHz au format brut. À un taux d’échantillonnage de 44,1 kHz, il durera 4 secondes.

principal c:

#include  #include  #include  #include  int main(void) { FILE *f; const double PI2 = 2 * acos(-1.0); const double SAMPLE_FREQ = 44100; const unsigned int NSAMPLES = 4 * SAMPLE_FREQ; uint16_t ampl; uint8_t bytes[2]; unsigned int t; f = fopen("out.raw", "wb"); for (t = 0; t < NSAMPLES; ++t) { ampl = UINT16_MAX * 0.5 * (1.0 + sin(PI2 * t * 1000.0 / SAMPLE_FREQ)); bytes[0] = ampl >> 8; bytes[1] = ampl & 0xFF; fwrite(bytes, 2, sizeof(uint8_t), f); } fclose(f); return EXIT_SUCCESS; } 

Générer out.raw :

 gcc -std=c99 -o main main.c -lm ./main 

Jouez directement à out.raw :

 sudo apt-get install ffmpeg ffplay -autoexit -f u16be -ar 44100 -ac 1 out.raw 

ou convertir en un format audio plus courant et jouer ensuite avec un lecteur audio plus courant:

 ffmpeg -f u16be -ar 44100 -ac 1 -i out.raw out.flac vlc out.flac 

Les parameters expliqués à: https://superuser.com/a/1063230/128124

Voici un synthé Canon plus intéressant: synthétiser par programmation de la musique?

Testé sur Ubuntu 18.04. GitHub en amont .

La physique

L’audio est codé sous la forme d’un numéro unique pour chaque instant. Comparez cela à une vidéo, qui nécessite des nombres de LARGEUR * HAUTEUR par moment dans le temps.

Ce nombre est ensuite converti en déplacement linéaire du diaphragme de votre enceinte:

 | / | / |-/ | | AIR |-\ | \ | \ <-> displacement | / | / |---/ | | AIR |---\ | \ | \ <---> displacement | / | / |-----/ | | AIR |-----\ | \ | \ <-----> displacement 

Le déplacement pousse l’air vers l’arrière et vers l’avant, créant des différences de pression qui se propagent dans l’air sous forme d’ ondes P.

Seul le déplacement est important: un signal constant, même maximal, ne produit aucun son: le diaphragme rest dans une position fixe.

La fréquence d’échantillonnage détermine la vitesse à laquelle les déplacements doivent être effectués.

44,1 kHz est une fréquence d’échantillonnage courante car les humains peuvent entendre jusqu’à 20 kHz et en raison du théorème d’échantillonnage de Nyquist – Shannon .

La fréquence d’échantillonnage est analogue à celle du FPS pour la vidéo, bien qu’elle ait une valeur beaucoup plus élevée par rapport à la gamme 25 (cinéma) – 144 (moniteurs de jeu hardcore) que nous voyons couramment pour la vidéo.

Formats

.raw est un format sous-spécifié qui ne contient que les octets d’amplitude et pas de métadonnées.

Nous devons transmettre quelques parameters de métadonnées sur la ligne de commande, comme la fréquence d’échantillonnage, car ce format ne contient pas ces données.

Il existe également d’autres formats non compressés contenant toutes les métadonnées nécessaires, par exemple .wav , voir: Synthèse de fichier WAV à partir de zéro – C

Dans la pratique, cependant, la plupart des gens utilisent exclusivement des formats compressés, ce qui rend les fichiers / stream beaucoup plus petits. Certains de ces formats prennent en compte les caractéristiques de l’oreille humaine pour compresser davantage l’audio avec une perte de qualité.

La biologie

Les humains perçoivent le son principalement par leur décomposition en fréquence ( transformée de Fourier AKA).

Je pense que c’est parce que l’oreille interne a des parties qui résonnent à des fréquences différentes (TODO confirme).

Par conséquent, lors de la synthèse de musique, nous pensons plus à l’ajout de fréquences qu’aux points dans le temps. Ceci est illustré dans cet exemple .

Cela conduit à penser en termes de vecteur 1D entre 20Hz et 20kHz pour chaque instant.

La transformée de Fourier mathématique perd la notion de temps, alors ce que nous faisons en synthétisant, c’est de prendre des groupes de points et de résumer les fréquences pour ce groupe, et de prendre la transformée de Fourier.

Heureusement, la transformée de Fourier est linéaire, nous pouvons donc simplement additionner et normaliser les déplacements directement.

La taille de chaque groupe de points conduit à un compromis de précision temps-fréquence, médiatisé par les mêmes mathématiques que le principe d’incertitude de Heisenberg .

Les ondelettes peuvent être une description mathématique plus précise de cette description intermédiaire temps-fréquence.

Je pense que des échantillons de la forme d’onde à une fréquence d’échantillonnage spécifique seraient la représentation la plus élémentaire.

Avez-vous déjà regardé une forme d’onde de près? L’axe des Y est simplement représenté par un entier, généralement en 16 bits.

Recherchez des choses comme la conversion analogique-numérique. Cela devrait vous aider à démarrer. Ces dispositifs peuvent convertir un signal audio (ondes sinusoïdales) en représentations numériques. Ainsi, un ADC 16 bits serait capable de représenter un sinus entre -32768 et 32768. C’est en virgule fixe. Il est également possible de le faire en virgule flottante (bien que cela ne soit pas recommandé pour des raisons de performances, mais peut être nécessaire pour des raisons de scope). Le contraire (conversion numérique-analogique) se produit lorsque nous convertissons des nombres en ondes sinusoïdales. Ceci est géré par quelque chose appelé un DAC.

Je pense qu’un bon moyen de commencer à jouer avec l’audio serait avec Processing et Minim . Ce programme va dessiner le spectre de fréquences du son de votre microphone!

 import ddf.minim.*; import ddf.minim.analysis.*; AudioInput in; FFT fft; void setup() { size(1024, 600); noSmooth(); Minim.start(this); in = Minim.getLineIn(); fft = new FFT(in.bufferSize(), in.sampleRate()); } void draw() { background(0); fft.forward(in.mix); stroke(255); for(int i = 0; i < fft.specSize(); i++) line(i*2+1, height, i*2+1, height - fft.getBand(i)*10); } void stop() { in.close(); Minim.stop(); super.stop(); } 

La conversion d’audio analogique en une forme numérique nécessite deux étapes.

  1. Échantillonnage
  2. Quantification

Échantillonnage

La fréquence à laquelle une forme d’onde continue (dans ce cas, l’audio) est échantillonnée, est appelée fréquence d’échantillonnage. La gamme de fréquence perçue par l’homme est de 20 à 20 000 Hz. Cependant, les CD utilisent le théorème d’échantillonnage de Nyquist, qui signifie un taux d’échantillonnage de 44 100 Hz, et couvrent des fréquences comsockets entre 0 et 22 050 Hz.

Quantification

L’ensemble discret des valeurs reçues de la phase «Sampling» doit maintenant être converti en un nombre fini de valeurs. Une quantification à 8 bits fournit 256 valeurs possibles, tandis qu’une quantification à 16 bits fournit jusqu’à 65 536 valeurs.

Les réponses sont toutes liées à la fréquence d’échantillonnage, mais n’abordent pas la question. J’imagine qu’un instantané particulier d’un son comprendrait des amplitudes individuelles pour beaucoup de fréquences différentes (disons que vous frappez simultanément un A et un C sur un clavier, le A étant plus fort). Comment cela est-il enregistré dans un nombre de 16 bits? Si vous ne faites que mesurer l’amplitude (le son est fort), comment obtenez-vous les différentes notes?

Ah! Je pense que je le comprends de ce commentaire: “Ce nombre est ensuite converti en déplacement linéaire du diaphragme de votre haut-parleur.” Les notes apparaissent à quelle vitesse le diaphragme vibre. C’est pourquoi vous avez besoin des 44 000 valeurs différentes par seconde. Une note est quelque part de l’ordre de 1000 hertz, donc une note pure permettrait au diaphragme d’entrer et de sortir environ 1000 fois par seconde. Un enregistrement d’un orchestrateur complet comporte de nombreuses notes différentes et peut être converti miraculeusement en un seul historique de mouvement du diaphragme. 44 000 fois par seconde le diaphragme est invité à entrer ou sortir un peu, et cette simple (longue) liste de chiffres peut représenter Beyonce à Beethoven!