Введение в теорию звука
=======================

Я попробую на пальцах описать некоторые основные понятия, которые требуется знать при цифровой обработке звука. 
В этом разделе нет серьезной математики вроде быстрых преобразований Фурье и прочего - эти формулы не сложно найти в 
сети. Тут описывается только суть и смысл вещей, с которыми придется столкнуться.

Оцифровка, или Туда и обратно
-----------------------------

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

<img src="images/spectro.jpg" width="100%" alt="Рис. 1. Осциллограмма звука" />
*Рис. 1. Осциллограмма звука*

Это осциллограмма звука - так выглядит аудио сигнал. Думаю, каждый хоть раз в жизни видел подобные картинки. Для того чтобы понять, как устроен процесс преобразования аналогового сигнала в цифровой, нужно нарисовать осциллограмму звука на миллиметровой бумаге. Для каждой вертикальной линии найдем точку пересечения с осциллограммой и ближайшее целое значение по вертикальной шкале — набор таких значений и будет простейшей записью цифрового сигнала.

[<img src="images/demo.png" width="100%" alt="Рис. 2. Интерактивный пример сложения волн и оцифровки сигнала." />](https://www.desmos.com/calculator/aojmanpjrl)
*Рис. 2. Интерактивный пример сложения волн и оцифровки сигнала.
Источник: https://www.desmos.com/calculator/aojmanpjrl*

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

На [аппаратном уровне](https://en.wikipedia.org/wiki/Analog-to-digital_converter) это, разумеется, выглядит значительно сложнее, и в зависимости от аппаратуры сигнал может кодироваться совершенно разными способами. Самым распространенным из них является [импульсно-кодовая модуляция](https://en.wikipedia.org/wiki/Pulse-code_modulation), при которой записывается не конкретное значение уровня сигнала в каждый момент времени, а разница между текущим и предыдущим значением. Это позволяет снизить количество бит на каждый отсчет примерно на 25%. Этот способ кодирования применяется в наиболее распространенных аудио-форматах (WAV, MP3, WMA, OGG, FLAC, APE), которые используют контейнер [PCM WAV](http://wav-pcm.narod.ru/).

В реальности для создания стерео-эффекта при записи аудио чаще всего записывается не один, а сразу несколько каналов. В зависимости от используемого формата хранения они могут храниться независимо. Также уровни сигнала могут записываться как разница между уровнем основного канала и уровнем текущего.

Обратное преобразование из цифрового сигнала в аналоговый производится с помощью [цифро-аналоговых преобразователей](https://en.wikipedia.org/wiki/Digital-to-analog_converter), которые могут иметь различное устройство и принципы работы. Я опущу описание этих принципов в данной статье.

Дискретизация
-------------

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

<img src="images/discrete-signal.png" width="100%" alt="Рис. 3. Дискретизация сигнала." />
*Рис. 3. Дискретизация сигнала.
Источник: [https://en.wikipedia.org/wiki/Sampling_signal_processing](https://en.wikipedia.org/wiki/Sampling_signal_processing)*

[Частота дискретизации](https://en.wikipedia.org/wiki/Sampling_signal_processing#Sampling_rate) указывает на то, с какими интервалами по времени идут данные об уровне сигнала. Существует [теорема Котельникова](https://ru.wikipedia.org/wiki/Теорема_Котельникова) (в западной литературе ее упоминают как [теорему Найквиста - Шеннона](https://en.wikipedia.org/wiki/Nyquist–Shannon_sampling_theorem), хотя встречается и название Котельникова - Шеннона), которая утверждает: для возможности точного восстановления аналогового сигнала из дискретного требуется, чтобы частота дискретизации была минимум в два раза выше, чем максимальная частота в аналоговом сигнале. Если брать примерный диапазон воспринимаемых человеком частот звука 20 Гц - 20 кГц, то оптимальная частота дискретизации ([частота Найквиста](https://en.wikipedia.org/wiki/Nyquist_frequency)) должна быть в районе 40 кГц. У стандартных аудио-CD она составляет 44.1 кГц

<img src="images/quantized-signal.png" width="100%" alt="Рис. 4. Квантование сигнала." />
*Рис. 4. Квантование сигнала.
Источник: [https://ru.wikipedia.org/wiki/Квантование_(обработка сигналов)](https://ru.wikipedia.org/wiki/Квантование_обработка сигналов)*

[Глубина дискретизации](https://ru.wikipedia.org/wiki/Квантование_обработка_сигналов) по уровню описывает разрядность числа, которым описывается уровень сигнала. Эта характеристика накладывает ограничение на точность записи уровня сигнала и на его минимальное значение. Стоит специально отметить, что данная характеристика не имеет отношения к громкости - она отражает точность записи сигнала. Стандартная глубина дискретизации на audio-CD — 16 бит. При этом, если не использовать специальную студийную аппаратуру, разницу в звучании большинство перестает замечать уже в районе 10-12 бит. Однако большая глубина дискретизации позволяет избежать появления шумов при дальнейшей обработке звука.

Шумы
----

В цифровом звуке можно выделить три основных источника шумов.

### Джиттер
Это случайные отклонения сигнала, как правило, возникающие из-за нестабильности частоты задающего генератора или различной скорости распространения разных частотных составляющих одного сигнала. Данная проблема возникает на стадии оцифровки. Если описывать <s>«на пальцах»</s> «на миллиметровке», это происходит из-за немного разного расстояния между вертикальными линиями.

### Шум дробления
Он напрямую связан с глубиной дискретизации. Так как при оцифровке сигнала его реальные значения округляются с определенной точностью, возникают слабые шумы, связанные с ее потерей. Эти шумы могут появляться не только на стадии оцифровки, но и в процессе цифровой обработки (например, если сначала уровень сигнала сильно понижается, а затем — снова повышается).

### Алиасинг
При оцифровке возможна ситуация, при которой в цифровом сигнале могут появиться частотные составляющие, которых не было в оригинальном сигнале. Данная ошибка получила название [Aliasing](https://en.wikipedia.org/wiki/Aliasing). Этот эффект напрямую связан с частотой дискретизации, а точнее — с частотой Найквиста. Проще всего понять, как это происходит, рассмотрев картинку ниже:

<img src="images/alias.png" width="100%" alt="Рис. 5. Алиас." />
*Рис. 5. Алиас. Источник: https://ru.wikipedia.org/wiki/Алиасинг*

Зеленым показана частотная составляющая, частота которой выше частоты Найквиста. При оцифровке такой частотной составляющей не удается записать достаточно данных для ее корректного описания. В результате при воспроизведении получается совершенно другой сигнал - желтая кривая.

Уровень сигнала
---------------

Для начала стоит сразу понять, что когда речь идет о цифровом сигнале, то можно говорить только об относительном уровне сигнала. Абсолютный зависит в первую очередь от воспроизводящей аппаратуры и прямо пропорционален относительному. При расчетах относительных уровней сигнала принято использовать [децибелы](https://en.wikipedia.org/wiki/Decibel). При этом за точку отсчета берется сигнал с максимально возможной амплитудой при заданной глубине дискретизации. Этот уровень указывается как 0 dBFS (dB - децибел, FS = Full Scale - полная шкала). Более низкие уровни сигнала указываются как -1 dBFS, -2 dBFS и т.д. Вполне очевидно, что более высоких уровней просто не бывает (мы изначально берем максимально возможный уровень).

Поначалу бывает тяжело разобраться с тем, как соотносятся децибелы и реальный уровень сигнала. На самом деле все просто. Каждые ~6 dB (точнее 20 log(2) ~ 6.02 dB) указывают на изменение уровня сигнала в два раза. То есть, когда мы говорим о сигнале с уровнем -12 dBFS, понимаем, что это сигнал, уровень которого в четыре раза меньше максимального, а -18 dBFS - в восемь, и так далее. Если посмотреть на определение децибела, в нем указывается значение <img class="image__inline" src="https://tex.s2cms.ru/svg/10%20log(a%2Fa_0)" alt="10log(a/a0)" /> - тогда откуда берется 20? Все дело в том, что децибел - это логарифм отношения двух одноименных энергетических величин, умноженный на 10. Амплитуда же не является <b>энергетической</b> величиной, следовательно ее нужно перевести в подходящую величину. Мощность, которую переносят волны с разными амплитудами, пропорциональна квадрату амплитуды. Следовательно для амплитуды (если все прочие условия, кроме амплитуды принять неизменными) формулу можно записать как <img class="image__inline" src="https://tex.s2cms.ru/svg/10%20log(a%5E2%20%2F%20a_0%5E2)%20%3D>%2020%20log(a%2Fa_0)" alt="10log(a^2/a0^2) => 20log(a/a0)" />

**N.B.** Стоит упомянуть, что логарифм в данном случае берется десятичный, в то время как большинство библиотек под функцией с названием log подразумевает натуральный логарифм.

При различной глубине дискретизации уровень сигнала по этой шкале изменяться не будет. Сигнал с уровнем -6 dBFS останется сигналом с уровнем -6 dBFS. Но все же одна характеристика изменится - динамический диапазон. Динамический диапазон сигнала - это разница между его минимальным и максимальным значением. Он рассчитывается по формуле <img class="image__inline" src="https://tex.s2cms.ru/svg/n%20*%2020%20log(2)" alt="n * 20log(2)" />, где n - глубина дискретизации (для грубых оценок можно пользоваться более простой формулой: n * 6). Для 16 бит это ~96.33 dB, для 24 бит ~144.49 dB. Это означает, что самый большой перепад уровня, который можно описать с 24-битной глубиной дискретизации (144.49 dB), на 48.16 dB больше, чем самый большой перепад уровня с 16-битной глубиной (96.33 dB). Плюс к тому — шум дробления при 24 битах на 48 dB тише. 

Восприятие
----------

Когда мы говорим о восприятии звука человеком, следует сначала разобраться, каким образом люди воспринимают звук. Очевидно, что мы слышим с помощью [ушей](https://en.wikipedia.org/wiki/Ear). Звуковые волны взаимодействуют с барабанной перепонкой, смещая ее. Вибрации передаются во внутреннее ухо, где их улавливают рецепторы. То, насколько смещается барабанная перепонка, зависит от такой характеристики, как [звуковое давление](https://en.wikipedia.org/wiki/Sound_pressure). При этом [воспринимаемая громкость](https://en.wikipedia.org/wiki/Loudness) зависит от звукового давления не напрямую, а логарифмически. Поэтому при изменении громкости принято использовать относительную шкалу SPL (уровень звукового давления), значения которой указываются все в тех же децибелах. Стоит также заметить, что воспринимаемая громкость звука зависит не только от уровня звукового давления, но еще и от частоты звука:

<img src="images/fon.png" width="100%" alt="Рис. 6. Зависимость воспринимаемой громкости от частоты и амплитуды звука." />
*Рис. 6. Зависимость воспринимаемой громкости от частоты и амплитуды звука.
Источник: https://ru.wikipedia.org/wiki/Громкость_звука*

Громкость
---------

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

### Математика

Тут я, пожалуй, немного вернусь к математике, потому что реализация логарифмической шкалы оказывается не такой простой и очевидной вещью для многих, а найти в интернете данную формулу не так просто, как хотелось бы. Заодно покажу, как просто переводить значения громкости в dBFS и обратно. Для дальнейших объяснений это будет полезным.

```(javascript)
// Минимальное значение громкости - на этом уровне идет отключение звука
var EPSILON = 0.001;

// Коэффициент для преобразований в dBFS и обратно
var DBFS_COEF = 20 / Math.log(10);

// По положению на шкале вычисляет громкость
var volumeToExponent = function(value) {
	var volume = Math.pow(EPSILON, 1 - value);
	return volume > EPSILON ? volume : 0;
};

// По значению громкости вычисляет положение на шкале
var volumeFromExponent = function(volume) {
	return 1 - Math.log(Math.max(volume, EPSILON)) / Math.log(EPSILON);
};

// Перевод значения громкости в dBFS
var volumeToDBFS = function(volume) {
	return Math.log(volume) * DBFS_COEF;
};

// Перевод значения dBFS в громкость
var volumeFromDBFS = function(dbfs) {
	return Math.exp(dbfs / DBFS_COEF);
}
```

### Цифровая обработка

Теперь вернемся к тому, что мы имеем цифровой, а не аналоговый сигнал. У цифрового сигнала есть две особенности, которые стоит учитывать при работе с громкостью:

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

Из того, что уровень сигнала имеет ограничение точности, следует две вещи:

  - уровень шумов дробления возрастает при увеличении громкости. Для малых изменений обычно это не очень критично, так как изначальный уровень шума значительно тише ощутимого, и его можно безопасно поднимать в 4-8 раз (например, применять эквалайзер с ограничением шкалы в ±12dB);
  - не стоит сначала сильно понижать уровень сигнала, а затем сильно его повышать - при этом могут появиться новые шумы дробления, которых изначально не было.

Из того, что сигнал имеет верхнее ограничение уровня, следует, что нельзя безопасно увеличивать громкость выше единицы. При этом пики, которые окажутся выше границы, будут «срезаны» и произойдет потеря данных.

<img src="images/clipping.png" width="100%" alt="Рис. 7. Клиппинг." />
*Рис. 7. Клиппинг. 
Источник: [https://en.wikipedia.org/wiki/Clipping_audio](https://en.wikipedia.org/wiki/Clipping_audio)*

На практике все это означает, что стандартные для Audio-CD параметры дискретизации (16 бит, 44,1 кГц) не позволяют производить качественную обработку звука, потому что имеют очень малую избыточность. Для этих целей лучше использовать более избыточные форматы. Однако стоит учитывать, что общий размер файла пропорционален параметрам дискретизации, поэтому выдача таких файлов для онлайн воспроизведения - не лучшая идея.

### Измерение громкости

Для того чтобы сравнивать громкость двух разных сигналов, ее для начала нужно как-то измерить. Существует по меньшей мере три метрики для измерения громкости сигналов - максимальное пиковое значение, усредненное значение уровня сигнала и метрика ReplayGain.

Максимальное пиковое значение достаточно слабая метрика для оценки громкости. Она никак не учитывает общий уровень громкости - например, если записать грозу, то большую часть времени на записи будет тихо шелестеть дождь и лишь пару раз прогремит гром. Максимальное пиковое значение уровня сигнала у такой записи будет довольно высоким, но большая часть записи будет иметь весьма низкий уровень сигнала. Однако эта метрика все равно является полезной - она позволяет вычислить максимальное усиление, которое можно применить к записи, при котором не будет потерь данных из-за «обрезания» пиков.

Усредненное значение уровня сигнала — более полезная метрика и легко вычислимая, но все же имеет существенные недостатки, связанные с тем, как мы воспринимаем звук. Визг циркулярной пилы и рокот водопада, записанные с одинаковым средним уровнем сигнала, будут восприниматься совершенно по-разному.

[ReplayGain](https://en.wikipedia.org/wiki/ReplayGain) наиболее точно передает воспринимаемый уровень громкости записи и учитывает физиологические и психические особенности восприятия звука. Для промышленного выпуска записей многие звукозаписывающие студии используют именно ее, также она поддерживается большинством популярных медиа-плееров. ([Русская статья](https://ru.wikipedia.org/wiki/ReplayGain) на WIKI содержит много неточностей и фактически не корректно описывает саму суть технологии).

### Нормализация громкости

Если мы можем измерять громкость различных записей, мы можем ее нормализовать. Идея нормализации состоит в том, чтобы привести разные звуки к одинаковому уровню воспринимаемой громкости. Для этого используется несколько различных подходов. Как правило, громкость стараются максимизировать, но это не всегда возможно из-за ограничений максимального уровня сигнала. Поэтому обычно берется некоторое значение немного меньше максимума (например -14 dBFS), к которому пытаются привести все сигналы.

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

Также внутреннюю нормализацию порой производят, чтобы повысить общую громкость треков. Это называется нормализацией с компрессией. При этом подходе среднее значение уровня сигнала максимизируется за счет усиления всего сигнала на заданную величину. Те участки, которые должны были быть подвергнуты «обрезанию», из-за превышения максимального уровня усиливаются на меньшую величину, позволяя избежать этого. Этот способ увеличения громкости значительно снижает качество звучания трека, но, тем не менее, многие звукозаписывающие студии не брезгуют его применять.

[Цифровые фильтры сигнала](https://ru.wikipedia.org/wiki/Цифровой_фильтр)
-------------------------------------------------------------------------

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

### Характеристики фильтров

Как очевидно, при фильтрации сигнала меняется не только громкость данного сигнала, но и множество других характеристик. Стоит заметить, что изменение громкости при фильтрации почти всегда является побочным явлением, которое требуется компенсировать. Прежде чем рассматривать сами фильтры, стоит уделить немного внимания самим характеристикам этих фильтров.

Характеристики фильтров удобно рассматривать в виде графиков зависимости какой-то величины от частоты сигнала:

*Горизонтальная ось отображает частоту, по ней применяется логарифмический масштаб, вертикальная - магнитуду (желтый график) от 0 до 2, или фазовый сдвиг (зеленый график) от  -Pi до Pi. Частота фильтра отмечена красной чертой на графике*

<img src="images/lowpass.png" width="100%" alt="Рис. 8. Графики АЧХ и ФЧХ биквадратного фильтра нижних частот" />
*Рис. 8. Графики АЧХ и ФЧХ биквадратного фильтра нижних частот.*

#### [Амплитудно-частотная характеристика](https://ru.wikipedia.org/wiki/Амплитудно-частотная_характеристика) (АЧХ)

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

#### [Фазо-частотная характеристика](https://ru.wikipedia.org/wiki/Фазо-частотная_характеристика) (ФЧХ)
 
Данная характеристика описывает зависимость фазового сдвига выходного сигнала относительно входного в зависимости от частоты входного сигнала. В целом данная характеристика мало влияет на звучание, но очень важна при сложении сигналов. Если мы возьмем 2 одинаковых сигнала с одинаковой фазой и сложим их - получим сигнал в 2 раза громче. Но если второй сигнал будет иметь сдвиг по фазе Pi (противофаза), то результатом будет нулевой сигнал (кстати, на этом свойстве основана работа многих фильтров). Чтобы лучше понять, как различный фазовый сдвиг отдельных гармоник влияет на результирующий сигнал, можно поэкспериментировать на этой [демонстрации](https://www.desmos.com/calculator/aojmanpjrl).

#### [Групповая задержка](http://www.dsplib.ru/content/filters/linphase/linphase.html)

Групповая задержка определяет разницу во времени между появлением выходного сигнала относительно момента поступления входного сигнала. Стоит заметить, что групповая задержка и фазовый сдвиг прямо пропорциональны <img class="image__inline" src="https://tex.s2cms.ru/svg/_%5CDelta%20t%20%3D%20%5Ccfrac%7B_%5CDelta%5Comega%7D%7B2%5Cpi%5Cnu%7D" alt="t = w / (2 * Pi * v)" />. При этом стоит учитывать, что при фиксированной групповой задержке фазовый сдвиг будет различен для разных частот и наоброт.

#### [Импульсная характеристика](https://ru.wikipedia.org/wiki/Импульсная_переходная_функция)

Импульсной характеристикой системы называется ее реакция на единичный импульс при нулевых начальных условиях. ((c)тырено с Вики). Фактически это выходной сигнал системы, являющийся результатом единичного импульса, поданного на вход. Единичный импульс - это бесконечно малый по длительности и бесконечно большой по амплитуде импульс ([дельта-функция Дирака](https://ru.wikipedia.org/wiki/Дельта-функция)). В случае цифрового сигнала в качестве единичного импульса берется сигнал с единичной амплитудой и частотой, равной частоте дискретизации (т.е. один отсчет, равный 0 dBFS). Данная характеристика является более полным описанием системы, т.к. и АЧХ, и ФЧХ могут быть рассчитаны из данной характеристики с помощью преобразования Фурье, а линейная свертка входного сигнала и амплитудной характеристки позволяет получить выходной сигнал данной системы.

#### Порядок фильтра

Если посмотреть на АЧХ большинства фильтров, то заметно, что в полосе подавления или усиления мы имеем не резкий перепад графика, а плавный спуск или подъем, т.е. влияние фильтра проявляется постепенно в зависимости от частоты. Крутизну данного спуска или подъема в переходной зоне фильтра принято обозначать в децибелах на октаву. Порядок фильтра - это безразмерная величина, которая как раз характеризует крутизну графика в переходной зоне. Фильтр с порядком 1 имеет крутизну 6 дБ/окт, с порядком 2 - 12 дБ/окт, с порядком 3 - 18 дБ/окт и т.д. То есть фактически влияние фильтра первого порядка усиливается в 2 раза при изменении частоты в 2 раза, второго порядка - в 4 раза и т.д.

### Типы фильтров

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

#### [Фильтры с конечной импульсной характеристикой](https://ru.wikipedia.org/wiki/Фильтр_с_конечной_импульсной_характеристикой) (КИХ)

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

#### [Фильтры с бесконечной импульсной характеристикой](https://ru.wikipedia.org/wiki/Фильтр_с_бесконечной_импульсной_характеристикой) (БИХ)

Этот вид фильтров имеет бесконечную импульсную характеристику за счет использования обратной связи. На деле это означает, что один или несколько предыдущих отсчетов выходного сигнала влияют на текущий выходной сигнал. Данный вид фильтров выгодно отличается от КИХ фильтров тем, что обычно использует всего несколько отсчетов из входного сигнала и несколько отсчетов выходного сигнала (например, [биквадратный фильтр](https://en.wikipedia.org/wiki/Digital_biquad_filter) использует два отсчета входного сигнала и два выходного). За счет достаточного малого количества расчетов этот фильтр идеально подходит для обработки звука в реальном времени.

### Виды фильтров

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

#### [Фильтр низких частот](https://ru.wikipedia.org/wiki/Фильтр_нижних_частот)

*Горизонтальная ось отображает частоту, по ней применяется логарифмический масштаб, вертикальная - магнитуду от 0 до 2. Частота фильтра отмечена красной чертой на графике*

<img src="images/lowpass-filter.png" width="100%" alt="Рис. 9. Графики АЧХ фильтров нижних частот" />
*Рис. 9. Графики АЧХ фильтров нижних частот*

Фильтр низких частот - это фильтр, пропускающий частоты ниже заданной и подавляющий более высокие частоты. Данный фильтр является одним из самых важных в цифровой обработке звука. При оцифровке сигнала требуется отсекать частоты выше частоты Наквиста (иначе будут возникать алиасы) перед непосредственно оцифровкой - для этих целей используется фильтр нижних частот. Также данный фильтр используется при передискретизации на более низкую частоту с той же целью - чтобы устранить алиасы. Кроме этого, данный фильтр применяется перед низкочастотными динамиками и сабвуферами для улучшения качества звучания.

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

Фильтры нижних частот обычно используются в качестве прототипов при проектировании других видов фильтров, так что они имеют схожие АЧХ и ФЧХ.

#### [Фильтр верхних частот](https://ru.wikipedia.org/wiki/Фильтр_верхних_частот)

*Горизонтальная ось отображает частоту, по ней применяется логарифмический масштаб, вертикальная - магнитуду от 0 до 2. Частота фильтра отмечена красной чертой на графике*

<img src="images/highpass-filter.png" width="100%" alt="Рис. 10. Графики АЧХ фильтров верхних частот" />
*Рис. 10. Графики АЧХ фильтров верхних частот*

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

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

#### [Полосно-пропускающий фильтр](https://ru.wikipedia.org/wiki/Полосовой_фильтр)

*Горизонтальная ось отображает частоту, по ней применяется логарифмический масштаб, вертикальная - магнитуду от 0 до 2. Частоты фильтра отмечены красными чертами на графике*

<img src="images/bandpass-filter.png" width="100%" alt="Рис. 11. Графики АЧХ полосовых фильтров" />
*Рис. 11. Графики АЧХ полосовых фильтров*

Также его называют полосным фильтр. Он пропускает частоты в некой полосе пропускания и заглушает остальные частоты. Данный фильтр можно реализовать как последовательно подключенные фильтр нижних частот и фильтр верхних частот. Аналогично фильтру верхних частот данный фильтр часто применяют перед средне-частотными динамиками. Также данный фильтр используется для выделения голоса в системах распознования речи.

#### [Полосно-заграждающий фильтр](https://ru.wikipedia.org/wiki/Полосно-заграждающий_фильтр)

*Горизонтальная ось отображает частоту, по ней применяется логарифмический масштаб, вертикальная - магнитуду от 0 до 2. Частоты фильтра отмечены красными чертами на графике*

<img src="images/bandstop-filter.png" width="100%" alt="Рис. 12. Графики АЧХ полосно-заграждающих фильтров" />
*Рис. 12. Графики АЧХ полосно-заграждающих фильтров*

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

### Реализации

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

#### [Фильтр Бесселя](https://ru.wikipedia.org/wiki/Фильтр_Бесселя) ([демонтрация](https://www.desmos.com/calculator/6nz8ct2jfk))

Данный фильтр отличается максимально гладкой функцией групповой задержки и линейной ФЧХ, за счет чего форма выходного сигнала в полосе пропускания сохраняется практически неизменной.

#### [Фильтр Баттерворта](https://ru.wikipedia.org/wiki/Фильтр_Баттерворта)([демонстрация](https://www.desmos.com/calculator/wwgd2cqkkq))
 
Отличительной особенностью данного фильтра является максимально гладкая функция АЧХ. Однако он имеет достаточно большую нелинейную групповую задержку в полосе пропускания на высоких порядках.

#### [Фильтр Чебышева](https://ru.wikipedia.org/wiki/Фильтр_Чебышева) ([демонстрация](https://www.desmos.com/calculator/acy7dkipyy))

Данный фильтр имеет более крутой спад АЧХ (особенно фильтр II рода), но также имеет существенные пульсации АЧХ. В случае фильтра I рода эти пульсации находятся в полосе пропускания, а в случае фильтра II рода - в полосе подавления.

#### [Эллиптический фильтр](https://ru.wikipedia.org/wiki/Эллиптический_фильтр) ([демонстрация](https://www.desmos.com/calculator/mbtd8pwz1c))

Данный фильтр имеет очень крутой спад АЧХ и пульсации АЧХ в полосе пропускания и в полосе подавления. При этом величина пульсаций в этих полосах независима. Если отсутствуют пульсации в полосе пропускания, то фильтр вырождается в фильтр Чебышева 1 рода, если они отсутствуют в полосе подавления - в фильтр Чебышева 2 рода, если они отсутвуют в обоих полосах пропускания, то он вырождается в фильтр Баттерворта.

#### [Фильтр Лежандра](https://ru.wikipedia.org/wiki/Фильтр_Лежандра) ([демонстрация](https://www.desmos.com/calculator/hpu2mf11xn))

Имеет более крутой спад АЧХ, чем фильтр Баттерворта, но его АЧХ в полосе пропускания не такая гладкая. Является компромиссом между фильтром Баттерворта и фильтром Чебышева 1 рода.

Материалы
---------


  - [О понятии громкости в цифровом представлении звука и о методах ее повышения](http://audiophilesoft.ru/publ/my/digital_loudness/11-1-0-86)
  - [Звук](https://ru.wikipedia.org/wiki/Звук)
  - [Амплитуда](https://ru.wikipedia.org/wiki/Амплитуда)
  - [Частота](https://ru.wikipedia.org/wiki/Частота)
  - [Цифровой сигнал](https://ru.wikipedia.org/wiki/Цифровой_сигнал)
  - [Аналоговый сигнал](https://ru.wikipedia.org/wiki/Аналоговый_сигнал)
  - [Цифровая обработка сигналов](https://ru.wikipedia.org/wiki/Цифровая_обработка_сигналов)
  - [Интерактивный пример сложения волн и оцифровки сигнала](https://www.desmos.com/calculator/aojmanpjrl)
  - [Аналогово-цифровой преобразователь](https://ru.wikipedia.org/wiki/Аналого-цифровой_преобразователь)
  - [Цифро-аналоговый преобразователь](https://ru.wikipedia.org/wiki/Цифро-аналоговый_преобразователь)
  - [Импульсно-кодовая модуляция](https://ru.wikipedia.org/wiki/Импульсно-кодовая_модуляция)
  - [Формат PCM WAV](http://wav-pcm.narod.ru/)
  - [Сэмплирование (en)](https://en.wikipedia.org/wiki/Sampling_%28signal_processing%29)
  - [Частота дискретизации](https://ru.wikipedia.org/wiki/Частота_дискретизации)
  - [Теорема Котельникова](https://ru.wikipedia.org/wiki/Теорема_Котельникова)
  - [Частота Найквиста](https://ru.wikipedia.org/wiki/Частота_Найквиста)
  - [Глубина дискретизации](https://ru.wikipedia.org/wiki/Квантование_%28обработка_сигналов%29)
  - [Alias](https://ru.wikipedia.org/wiki/Алиасинг)
  - [Децибел](https://ru.wikipedia.org/wiki/Децибел)
  - [Строение уха](https://ru.wikipedia.org/wiki/Ухо)
  - [Звуковое давление](https://ru.wikipedia.org/wiki/Звуковое_давление)
  - [Воспринимаемая громкость](https://ru.wikipedia.org/wiki/Громкость_звука)
  - [Клиппинг](https://en.wikipedia.org/wiki/Clipping_%28audio%29)
  - [ReplayGain описание](https://en.wikipedia.org/wiki/ReplayGain)
  - [ReplayGain спецификация](http://wiki.hydrogenaud.io/index.php?title=ReplayGain_specification)  
  - [Амплитудо-частотная характеристика](https://ru.wikipedia.org/wiki/Амплитудно-частотная_характеристика)
  - [Фазо-частотная характеристика](https://ru.wikipedia.org/wiki/Фазо-частотная_характеристика)
  - [Групповая задержка](http://www.dsplib.ru/content/filters/linphase/linphase.html)
  - [Импульсная характеристика](https://ru.wikipedia.org/wiki/Импульсная_переходная_функция)
  - [Дельта-функция Дирака](https://ru.wikipedia.org/wiki/Дельта-функция)
  - [Преобразование Фурье](https://ru.wikipedia.org/wiki/Преобразование_Фурье)
  - [Цифровые фильтры](https://ru.wikipedia.org/wiki/Цифровой_фильтр)
  - [Фильтр с бесконечной импульсной характеристикой](https://ru.wikipedia.org/wiki/Фильтр_с_бесконечной_импульсной_характеристикой)
  - [Фильтр с конечной импульсной характеристикой](https://ru.wikipedia.org/wiki/Фильтр_с_конечной_импульсной_характеристикой)
  - [Биквадратный фильтр (en)](https://en.wikipedia.org/wiki/Digital_biquad_filter)
  - [Фильтр Бесселя](https://ru.wikipedia.org/wiki/Фильтр_Бесселя)
  - [Фильтр Баттерворта](https://ru.wikipedia.org/wiki/Фильтр_Баттерворта)
  - [Фильтр Чебышева](https://ru.wikipedia.org/wiki/Фильтр_Чебышева)
  - [Эллиптический фильтр](https://ru.wikipedia.org/wiki/Эллиптический_фильтр)
  - [Фильтр Лежандра](https://ru.wikipedia.org/wiki/Фильтр_Лежандра)

Полезные ссылки
---------------

  - [визуализация синусоид](http://toxicdump.org/stuff/FourierToy.swf)
  - [генерация звука с множеством параметров](http://www.bfxr.net/)
  - [языки программирования звука](https://en.wikipedia.org/wiki/List_of_audio_programming_languages)
  - алгоритмические генераторы звука: [wavepot.com](http://wavepot.com/), [studio.substack.net](http://studio.substack.net/), [wurstcaptures.untergrund.net](http://wurstcaptures.untergrund.net/music/)
  - [визуальный конструктор фильтров Web Audio API](http://webaudioplayground.appspot.com/)
  - [визуальная студия аудио-обработки](http://app.hya.io/) 

Благодарности
-------------

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

Отдельное спасибо 
  - Тарасу [@Audiophile](http://habrahabr.ru/users/audiophile/) Ковриженко за описание алгоритмов нормализации и максимизации громкости,
  - Сергею [@forgotten](http://habrahabr.ru/users/forgotten/) Константинову за большое количество пояснений и советов по данной статье, 
  - Денису [@deniskreshikhin](http://habrahabr.ru/users/deniskreshikhin/) Крешихину и Никите [@merlin-vrn](http://habrahabr.ru/users/merlin-vrn/) Киприянову за комментарии по работе цифровых фильтров.

Большое спасибо [@dtestyk](http://habrahabr.ru/users/dtestyk/) за список полезных ссылок.
