Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Пример создания аудио на минимальном С

Пример ниже генерирует чистый синус 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;
}

GitHub upstream.

Создать 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

Созданный файл FLAC: https://github.com/cirosantilli/media/blob/master/canon.flac

Параметры объяснены на: https://superuser.com/questions/76665/how-to-play-a-pcm-file-on-an-unix-system/1063230#1063230

Проверено на Ubuntu 18.04.

Canon в D в C

Вот более интересный пример синтеза.

Результат: https://www.youtube.com/watch?v=JISozfHATms

main.c

#include <math.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

typedef uint16_t point_type_t;

double PI2;

void write_ampl(FILE *f, point_type_t ampl) {
    uint8_t bytes[2];
    bytes[0] = ampl >> 8;
    bytes[1] = ampl & 0xFF;
    fwrite(bytes, 2, sizeof(uint8_t), f);
}

/* https://en.wikipedia.org/wiki/Piano_key_frequencies */
double piano_freq(unsigned int i) {
    return 440.0 * pow(2, (i - 49.0) / 12.0);
}

/* Chord formed by the nth note of the piano. */
point_type_t piano_sum(unsigned int max_ampl, unsigned int time,
        double sample_freq, unsigned int nargs, unsigned int *notes) {
    unsigned int i;
    double sum = 0;
    for (i = 0 ; i < nargs; ++i)
        sum += sin(PI2 * time * piano_freq(notes[i]) / sample_freq);
    return max_ampl * 0.5 * (nargs + sum) / nargs;
}

enum notes {
    A0 = 1, AS0, B0,
    C1, C1S, D1, D1S, E1, F1, F1S, G1, G1S, A1, A1S, B1,
    C2, C2S, D2, D2S, E2, F2, F2S, G2, G2S, A2, A2S, B2,
    C3, C3S, D3, D3S, E3, F3, F3S, G3, G3S, A3, A3S, B3,
    C4, C4S, D4, D4S, E4, F4, F4S, G4, G4S, A4, A4S, B4,
    C5, C5S, D5, D5S, E5, F5, F5S, G5, G5S, A5, A5S, B5,
    C6, C6S, D6, D6S, E6, F6, F6S, G6, G6S, A6, A6S, B6,
    C7, C7S, D7, D7S, E7, F7, F7S, G7, G7S, A7, A7S, B7,
    C8,
};

int main(void) {
    FILE *f;
    PI2 = 2 * acos(-1.0);
    const double SAMPLE_FREQ = 44100;
    point_type_t ampl;
    point_type_t max_ampl = UINT16_MAX;
    unsigned int t, i;
    unsigned int samples_per_unit = SAMPLE_FREQ * 0.375;
    unsigned int *ip[] = {
        (unsigned int[]){4, 2, C3, E4},
        (unsigned int[]){4, 2, G3, D4},
        (unsigned int[]){4, 2, A3, C4},
        (unsigned int[]){4, 2, E3, B3},

        (unsigned int[]){4, 2, F3, A3},
        (unsigned int[]){4, 2, C3, G3},
        (unsigned int[]){4, 2, F3, A3},
        (unsigned int[]){4, 2, G3, B3},

        (unsigned int[]){4, 3, C3, G4, E5},
        (unsigned int[]){4, 3, G3, B4, D5},
        (unsigned int[]){4, 2, A3,     C5},
        (unsigned int[]){4, 3, E3, G4, B4},

        (unsigned int[]){4, 3, F3, C4, A4},
        (unsigned int[]){4, 3, C3, G4, G4},
        (unsigned int[]){4, 3, F3, F4, A4},
        (unsigned int[]){4, 3, G3, D4, B4},

        (unsigned int[]){2, 3, C4, E4, C5},
        (unsigned int[]){2, 3, C4, E4, C5},
        (unsigned int[]){2, 3, G3, D4, D5},
        (unsigned int[]){2, 3, G3, D4, B4},

        (unsigned int[]){2, 3, A3, C4, C5},
        (unsigned int[]){2, 3, A3, C4, E5},
        (unsigned int[]){2, 2, E3,     G5},
        (unsigned int[]){2, 2, E3,     G4},

        (unsigned int[]){2, 3, F3, A3, A4},
        (unsigned int[]){2, 3, F3, A3, F4},
        (unsigned int[]){2, 3, C3,     E4},
        (unsigned int[]){2, 3, C3,     G4},

        (unsigned int[]){2, 3, F3, A3, F4},
        (unsigned int[]){2, 3, F3, A3, C5},
        (unsigned int[]){2, 3, G3, B3, B4},
        (unsigned int[]){2, 3, G3, B3, G4},

        (unsigned int[]){2, 3, C4, E4, C5},
        (unsigned int[]){1, 3, C4, E4, E5},
        (unsigned int[]){1, 3, C4, E4, G5},
        (unsigned int[]){1, 2, G3,     G5},
        (unsigned int[]){1, 2, G3,     A5},
        (unsigned int[]){1, 2, G3,     G5},
        (unsigned int[]){1, 2, G3,     F5},

        (unsigned int[]){3, 3, A3, C4, E5},
        (unsigned int[]){1, 3, A3, C4, E5},
        (unsigned int[]){1, 3, E3, G3, E5},
        (unsigned int[]){1, 3, E3, G3, F5},
        (unsigned int[]){1, 3, E3, G3, E5},
        (unsigned int[]){1, 3, E3, G3, D5},
    };
    f = fopen("canon.raw", "wb");
    for (i = 0; i < sizeof(ip) / sizeof(int*); ++i) {
        unsigned int *cur = ip[i];
        unsigned int total = samples_per_unit * cur[0];
        for (t = 0; t < total; ++t) {
            ampl = piano_sum(max_ampl, t, SAMPLE_FREQ, cur[1], &cur[2]);
            write_ampl(f, ampl);
        }
    }
    fclose(f);
    return EXIT_SUCCESS;
}

GitHub upstream.

Для YouTube я подготовил его так:

wget -O canon.png https://upload.wikimedia.org/wikipedia/commons/thumb/3/35/The_C_Programming_Language_logo.svg/564px-The_C_Programming_Language_logo.svg.png
ffmpeg -loop 1 -y -i canon.png -i canon.flac -shortest -acodec copy -vcodec vp9 canon.mkv

как объяснено на: https://superuser.com/questions/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572

Проверено на Ubuntu 18.04.

Физика

Аудио кодируется как одно число для каждого момента времени. Сравните это с видео, для которого нужны значения 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

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

  • без потерь: FLAC
  • с потерями: Vorbis

Биология

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

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

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

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

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

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

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

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

Быстрые способы генерации общих тонов из коробки

Удивительная библиотека FFmpeg охватывает несколько из них: Синусоидальный аудио генератор Linux

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

Я думаю, что хороший способ начать играть с аудио будет 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();
}

Ответ 7

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

Ответ 8

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

Ответ 9

В преобразование фактического аналогового аудио в цифровую форму выполняется 2 этапа.

  • Sampling
  • Квантование

Sampling

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

Квантование

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

Ответ 10

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

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