Как звук представлен цифрами?

Мне нравится думать о том, как все может быть и представлено числами. Например, открытый текст представлен кодом, подобным ASCII, а изображения представлены значениями RGB. Это самые простые способы представления текста и изображений.

Как проще всего представить аудио с помощью цифр? Я хочу научиться писать программы, работающие со звуком, и подумал, что это будет хорошим началом. Хотя я не могу найти хороших объяснений в Интернете.

10 ответов

Решение

Физически, как вы, наверное, знаете, звук - это вибрация. Как правило, мы говорим о колебаниях воздуха между примерно 20 Гц и 20000 Гц. Это означает, что воздух движется туда-сюда от 20 до 20000 раз в секунду.

Если вы измерите эту вибрацию и преобразуете ее в электрический сигнал (скажем, с помощью микрофона), вы получите электрический сигнал с напряжением, изменяющимся в той же форме сигнала, что и звук. В нашей гипотетике чистого тона эта форма волны будет соответствовать синусоидальной функции.

Теперь у нас есть аналоговый сигнал, напряжение. Все еще не цифровой. Но мы знаем, что это напряжение варьируется между (например) -1 В и +1 В. Мы можем, конечно, присоединить вольтметр к проводам и измерить напряжение.

Произвольно, мы изменим масштаб на нашем вольтметре. Мы умножим вольт на 32767. Теперь он вызывает -1V -32767 и +1V 32767. О, и оно округлится до ближайшего целого числа.

Теперь мы подключаем наш вольтметр к компьютеру и проинструктируем компьютер читать счетчик 44 100 раз в секунду. Добавьте второй вольтметр (для другого стереоканала), и теперь у нас есть данные, которые идут на аудио CD.

Этот формат называется стерео 44,100 Гц, 16-битный линейный PCM. И это действительно просто набор измерений напряжения.

Пример генерации аудио минимального C

Пример ниже генерирует чистый синус 1000 кГц в необработанном формате. При частоте дискретизации 44,1 кГц она будет длиться 4 секунды.

main.c:

#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 & 0xFF;
        fwrite(bytes, 2, sizeof(uint8_t), f);
    }
    fclose(f);
    return EXIT_SUCCESS;
}

генерировать out.raw:

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

Играть out.raw непосредственно:

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

или конвертируйте в более распространенный аудиоформат, а затем играйте с более распространенным аудиоплеером:

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

Параметры объяснены по адресу: /questions/15393148/eclipse-33-redaktor-po-umolchaniyu-pod-vista/15393159#15393159

Вот более интересный синтезатор Canon in D: программно синтезировать музыку для программирования?

Проверено на Ubuntu 18.04. GitHub вверх по течению.

физика

Аудио кодируется как одно число для каждого момента времени. Сравните это с видео, которое нуждается в числах WIDTH * HEIGHT в каждый момент времени.

Затем это число преобразуется в линейное смещение диафрагмы вашего динамика:

|   /
|  /
|-/
| | A   I   R
|-\
|  \
|   \
<-> displacement

|     /
|    /
|---/
|   | A I   R
|---\
|    \
|     \
<---> displacement

|       /
|      /
|-----/
|     | A I R
|-----\
|      \
|       \
<-----> displacement

Смещение толкает воздух назад и вперед, создавая перепады давления, которые распространяются через воздух как P-волны.

Имеет значение только смещение: постоянный сигнал, даже максимальный, не производит звука: диафрагма просто остается в фиксированном положении.

Частота дискретизации определяет, насколько быстро должны выполняться смещения.

44,1 кГц - это общая частота дискретизации, потому что люди могут слышать до 20 кГц, и из-за теоремы выборки Найквиста-Шеннона.

Частота дискретизации аналогична FPS для видео, хотя она имеет гораздо более высокое значение по сравнению с диапазоном 25 (кино) - 144 (хардкорные игровые мониторы), который мы обычно видим для видео.

Форматы

.raw является недостаточно указанным форматом, который содержит только байты амплитуды и не содержит метаданных.

Мы должны передать несколько параметров метаданных в командной строке, например, частоту дискретизации, потому что формат не содержит этих данных.

Существуют также другие несжатые форматы, которые содержат все необходимые метаданные, например, .wav, см.: Синтез файлов WAV с нуля - C

На практике, однако, большинство людей имеют дело исключительно со сжатыми форматами, которые делают файлы / потоковую передачу намного меньше. Некоторые из этих форматов учитывают характеристики человеческого уха для дальнейшего сжатия звука с потерями.

Биология

Люди воспринимают звук главным образом по их частотному разложению ( преобразование Фурье АКА).

Я думаю, это потому, что во внутреннем ухе есть части, которые резонируют с разными частотами (подтверждение TODO).

Поэтому, когда мы синтезируем музыку, мы больше думаем о сложении частот, а не моментов времени. Это иллюстрируется в этом примере.

Это приводит к мысли о 1D-векторе между 20 Гц и 20 кГц для каждого момента времени.

Математическое преобразование Фурье теряет понятие времени, поэтому при синтезе мы собираем группы точек, суммируем частоты для этой группы и используем там преобразование Фурье.

К счастью, преобразование Фурье является линейным, поэтому мы можем просто сложить и нормализовать смещения напрямую.

Размер каждой группы точек приводит к компромиссу между точностью и временем, опосредованным той же математикой, что и принцип неопределенности Гейзенберга.

Вейвлеты могут быть более точным математическим описанием этого промежуточного частотно-временного описания.

Аудио может быть представлено цифровыми образцами. По сути, сэмплер (также называемый аналого-цифровым преобразователем) захватывает значение аудиосигнала каждые 1/ фс, где фс - частота сэмплирования. АЦП затем квантует сигнал, который является операцией округления. Таким образом, если ваш сигнал колеблется от 0 до 3 Вольт (полный диапазон шкалы), то выборка будет округлена до, например, 16-разрядного числа. В этом примере 16-битное число записывается один раз каждые 1/ фс /

Так, например, большинство WAV/MP3 сэмплируют звуковой сигнал с частотой 44 кГц. Я не знаю, сколько деталей вы хотите, но есть такая вещь, как "Частота дискретизации Найквиста", которая говорит, что частота дискретизации должна быть как минимум вдвое больше желаемой частоты. Таким образом, в вашем WAV/MP3-файле вы в лучшем случае сможете услышать частоту до 22 кГц.

В этой области вы можете углубиться в детали. Самой простой формой, безусловно, будет формат WAV. Это несжатый звук. Форматы, такие как mp3 и ogg, должны быть распакованы, прежде чем вы сможете работать с ними.

Простейшим способом представления звука в виде чисел является PCM (импульсная кодовая модуляция). Это означает, что амплитуда звука записывается с заданной частотой (каждое значение амплитуды называется сэмплом). Качество звука CD, например, составляет 16 битных сэмплов (в стерео) на частоте 44100 Гц.

Сэмпл может быть представлен как целое число (обычно 8, 12, 16, 24 или 32 бита) или число с плавающей запятой (16-битное с плавающей запятой или 32-битное двойное). Номер может быть подписан или не подписан.

Для 16-битных выборок со знаком значение 0 будет посередине, а -32768 и 32767 будут максимальными амплитудами. Для 16-битных выборок без знака значение 32768 будет посередине, а 0 и 65535 будут максимальными амплитудами.

Для выборок с плавающей запятой обычный формат таков, что 0 находится посередине, а -1.0 и 1.0 - максимальные амплитуды.

Затем данные PCM могут быть сжаты, например, с использованием MP3.

Я думаю, что образцы формы волны на определенной частоте выборки были бы самым основным представлением.

Я думаю, что хороший способ начать играть со звуком был бы с Processing и Minim. Эта программа будет рисовать частотный спектр звука с вашего микрофона!

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();
}

Вы когда-нибудь смотрели на форму волны крупным планом? Ось Y просто представлена ​​как целое число, обычно в 16 битах.

Посмотрите на вещи, как аналого-цифровое преобразование. Это должно начать вас. Эти устройства могут преобразовывать звуковой сигнал (синусоиды) в цифровые представления. Итак, 16-разрядный АЦП мог бы представлять синус от -32768 до 32768. Это с фиксированной запятой. Это также возможно сделать с плавающей запятой (хотя это не рекомендуется из соображений производительности, но может быть необходимо из соображений диапазона). Обратное (цифроаналоговое преобразование) происходит, когда мы конвертируем числа в синусоидальные волны. Это обрабатывается чем-то, что называется ЦАП.

Есть 2 шага, вовлеченные в преобразование фактического аналогового аудио в цифровую форму.

  1. отбор проб
  2. квантование

отбор проб

Частота дискретизации непрерывного сигнала (в данном случае аудио) называется частотой дискретизации. Частотный диапазон, воспринимаемый людьми, составляет 20 - 20000 Гц. Однако на компакт-дисках используется теорема выборки Найквиста, которая означает, что частота выборки 44 100 Гц охватывает частоты в диапазоне 0–22 050 Гц.

квантование

Дискретный набор значений, полученных из фазы "Выборка", теперь необходимо преобразовать в конечное число значений. 8-битное квантование обеспечивает 256 возможных значений, в то время как 16-битное квантование обеспечивает до 65 536 значений.

Все ответы относятся к частоте выборки, но не касаются вопроса. Я полагаю, что конкретный снимок звука будет включать отдельные амплитуды для множества различных частот (скажем, вы одновременно нажимаете и А, и С на клавиатуре, причем А громче). Как это записывается в 16-битном числе? Если все, что вы делаете, это измеряете амплитуду (насколько громкий звук), как вы получаете различные ноты?

Ах! Мне кажется, я понял это из этого комментария: "Это число затем преобразуется в линейное смещение диафрагмы вашего динамика". Примечания появляются по тому, как быстро вибрирует диафрагма. Вот почему вам нужно 44000 различных значений в секунду. Нота где-то порядка 1000 герц, поэтому чистая нота заставляет диафрагму входить и выходить примерно 1000 раз в секунду. Запись всего оркестра имеет много разных нот повсюду, и это чудесным образом может быть преобразовано в единую историю движения диафрагмы. 44 000 раз в секунду диафрагме дают указание немного входить или выходить, и этот простой (длинный) список чисел может представлять Бейонсе и Бетховена!

Другие вопросы по тегам