Minimal C Zeugungs Beispiel
Das folgende Beispiel erzeugt einen reinen 1000k Hz Sinus im Rohformat. Bei 44,1 kHz Abtastrate, wird es 4 Sekunden dauern:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
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 & 8;
fwrite(bytes, 2, sizeof(uint8_t), f);
}
fclose(f);
return EXIT_SUCCESS;
}
Wiedergabe mit:
sudo apt-get install ffmpeg
ffplay -autoexit -f u16be -ar 44100 -ac 1 out.raw
Parameter erklärt unter: https://superuser.com/a/1063230/128124
Getestet auf Ubuntu 15.10. Mehr fun examples on GitHub, einschließlich eines einfachen Canon-Synth.
Physik
Audio wird als eine einzelne Zahl für jeden Moment in der Zeit codiert. Vergleichen Sie das mit einem Video, das WIDTH * HEIGHT Zahlen pro Moment benötigt.
Diese Nummer wird dann in der linearen Verschiebung der diaphragm des Lautsprechers:
| /
|/
|-/
| | A I R
|-\
| \
| \
<-> displacement
| /
| /
|---/
| | A I R
|---\
| \
| \
<---> displacement
| /
| /
|-----/
| | A I R
|-----\
| \
| \
<-----> displacement
Die Verschiebung Luft nach hinten und nach vorne schiebt, Druckdifferenzen zu schaffen, die als P-waves durch die Luft reisen.
Nur Verschiebung spielt eine Rolle: Ein konstantes Signal, auch wenn es maximal ist, erzeugt keinen Ton: Die Membran bleibt nur in einer festen Position.
Die sampling frequency bestimmt, wie schnell die Verschiebungen durchgeführt werden sollen.
44,1kHz ist eine gemeinsame Abtastfrequenz, weil Menschen bis zu 20 kHz und wegen der Nyquist–Shannon sampling theorem hören können.
Die Abtastfrequenz ist analog zu der FPS für Video, obwohl sie einen viel höheren Wert im Vergleich zu den 25 (Kino) - 144 (Hardcore Gaming Monitore) Bereich, den wir häufig für Video sehen, hat.
Formats
.raw
ist ein underspecified Format, das nur die Amplitude Bytes und keine Metadaten enthält.
Wir müssen einige Meta-Parameter in der Befehlszeile wie die Abtastfrequenz übergeben, da das Format diese Daten nicht enthält.
Es gibt auch andere unkomprimierten Formaten, die alle erforderlichen Metadaten enthalten, z.B. , siehe: WAV File Synthesis From Scratch - C
In der Praxis beschäftigen sich die meisten Leute jedoch ausschließlich mit komprimierten Formaten, die Dateien/Streaming viel kleiner machen. Einige dieser Formate berücksichtigen Eigenschaften des menschlichen Gehörs, um die Audiodaten in einem verlustbehafteten Weg zu komprimieren.
Biologie
Menschen wahrnehmen Klang vor allem durch ihre Frequenzzerlegung (AKA Fourier transform).
Ich denke, das liegt daran, dass das Innenohr Teile hat, die zu verschiedenen Frequenzen schwingen (TODO bestätigen).
Deshalb wird, wenn Musik zu synthetisieren, denken wir mehr in Bezug auf den Frequenzen Addition statt Zeitpunkt. Dies wird in this example dargestellt.
Dies führt dazu, dass für jeden Zeitpunkt in einem 1D-Vektor zwischen 20Hz und 20kHz gedacht wird.
Die mathematische Fourier-Transformation verliert den Begriff der Zeit, also machen wir beim Synthetisieren Gruppen von Punkten und summieren Frequenzen für diese Gruppe und nehmen die Fourier-Transformation dort.
Glücklicherweise ist die Fourier-Transformation linear, sodass wir die Verschiebungen einfach addieren und normalisieren können.
Die Größe jeder Gruppe von Punkten führt zu einem Zeit - Frequenz - Präzisions - Kompromiss, vermittelt durch die gleiche Mathematik wie Heisenberg's uncertainty principle.
Wavelets kann eine genauere mathematische Beschreibung dieser intermediären Zeit - Frequenz - Beschreibung sein.
Sehr schöne Erklärung, danke! –
Technisch gesehen ist es eine Reihe von Amplitudenmessungen. Es ist nur zufällig, dass die meisten ADCs Spannung verwenden, um die Amplitude darzustellen. –
@SteveKuo technisch gesehen, das ist richtig, aber es scheint wie hinzufügen, dass in irgendeiner sinnvollen Weise würde das Problem sehr kompliziert. Und da dies keine elektrotechnische Baustelle ist ... – derobert