Александр Иванов – Цифровая обработка сигналов на Python. От инженера к разработчику. (страница 2)
Теперь мы пойдём на оружейный завод. Мы разберёмся, как устроены патроны, порох и ствол. Мы поймём физику выстрела и баллистику пули. И в результате мы сможем не только стрелять — мы сможем создавать оружие под себя.
Эта книга — о цифровой обработке сигналов. Не пугайтесь названия. Цифровая обработка сигналов — это просто набор идей о том, как работать с числами, которые представляют звук. Никакой магии. Никаких недоступных простому смертному тайн. Всё, что делают профессиональные программы для обработки звука, можно понять, написать на Python и запустить на своём компьютере. И вы это сделаете.
Для кого эта книга
Эта книга для вас, если вы прочитали первую книгу и хотите идти дальше. Если вы уже умеете применять готовые функции и теперь хотите понимать, что у них внутри. Если вы чувствуете, что стандартных инструментов вам не хватает и вы хотите создавать свои.
Эта книга для вас, если вы не читали первую книгу, но уже немного знакомы с Python. Вы знаете, что такое переменная, функция и массив. Вы можете написать простой цикл. Вам не нужно быть профессиональным программистом — достаточно базовых навыков. Всё остальное я объясню.
Эта книга для вас, если вы интересуетесь обработкой звука не как пользователь, а как исследователь. Если вам мало нажать кнопку — вы хотите знать, что происходит после нажатия. Если вас раздражает, когда что-то работает, а вы не понимаете почему. Если вы из тех людей, которые в детстве разбирали игрушки, чтобы посмотреть, что внутри.
Эта книга для вас, если вы студент технической специальности и вам нужно освоить цифровую обработку сигналов, но учебники написаны сухим математическим языком и вызывают только желание закрыть их и никогда не открывать. Я пишу не учебник. Я пишу книгу, которую интересно читать и по которой можно учиться.
Почему существующие книги не решают проблему
Существует множество книг по цифровой обработке сигналов. Почти все они делятся на две категории. Первая — академические учебники. Они полны формул, интегралов, доказательств теорем. Они строги, точны и абсолютно непригодны для самостоятельного изучения обычным человеком. Если вы не сидите в университетской аудитории с профессором, который объясняет каждый шаг, вы застрянете на третьей странице. Я знаю это, потому что сам застревал. Я инженер, я люблю математику, но академические учебники по ЦОС вызывали у меня желание биться головой о стол.
Вторая категория — практические руководства. Они говорят: «Вот библиотека, вот функция, вызовите её с такими-то параметрами, получите результат». Они не объясняют, что внутри функции. Они не дают понимания. Они дают рецепты. И когда рецепт перестаёт работать в ваших условиях — а он обязательно перестанет, потому что универсальных рецептов не бывает, — вы остаётесь беспомощны. Вы не можете адаптировать рецепт, потому что не понимаете, как он устроен.
Эта книга идёт по третьему пути. Она объясняет теорию — но не через формулы и доказательства, а через метафоры, визуализации и код. Она даёт практические навыки — но не через готовые рецепты, а через написание алгоритмов с нуля. Вы будете не просто читать о быстром преобразовании Фурье — вы напишете его сами. Вы будете не просто знать, что такое КИХ-фильтр — вы создадите свой фильтр и проверите его на реальном звуке. Теория и практика идут рука об руку, и ни одна не забегает вперёд.
Как устроена эта книга
Книга состоит из девяти глав, каждая из которых посвящена одному фундаментальному концепту цифровой обработки сигналов. Мы начинаем с самых основ — что такое сигнал, как он оцифровывается, почему частота дискретизации именно такая. Затем мы знакомимся с преобразованием Фурье — главным инструментом анализа звука. Мы проходим путь от наивной реализации, которая работает медленно, до быстрого алгоритма, который изменил мир. Мы изучаем фильтры, свёртку, адаптивные алгоритмы и синтез звука.
Каждая глава построена по одному принципу. Сначала я показываю проблему — зачем вообще нужен этот алгоритм, какую реальную задачу он решает. Затем я даю интуицию — метафору или аналогию, которая делает идею понятной на человеческом уровне, до всяких формул. После этого мы погружаемся в теорию — но не как в лекцию, а как в диалог. Каждый новый концепт выводится из предыдущего шаг за шагом. Как только теория изложена, мы тут же проверяем её кодом. Мы пишем реализацию алгоритма с нуля, строчку за строчкой, и смотрим, работает ли она. Затем мы визуализируем результат — строим графики, спектрограммы, диаграммы, которые подтверждают или опровергают наши ожидания. После основного материала идёт раздел «За кулисами» — исторический контекст, связь с другими областями, неочевидные детали. Затем «Лаборатория ошибок» — что может пойти не так, почему и как это исправить. И наконец «Творческое задание» — эксперименты, которые выводят за пределы главы и побуждают исследовать самостоятельно. Каждая глава завершается чек-листом — списком того, что вы должны уметь после её прочтения.
Главы можно читать последовательно — каждая следующая опирается на предыдущие. Но можно и выборочно — если вас интересуют конкретно фильтры или конкретно синтез звука, открывайте нужную главу. Я постарался сделать изложение максимально связным, но при этом каждую главу можно изучать как самостоятельный модуль.
Что вам понадобится
Для работы с книгой вам нужен компьютер с установленным Python. Если вы читали первую книгу, всё уже установлено. Если нет — не переживайте, я проведу вас через установку в первой главе.
Вам понадобится базовое знакомство с Python. Вы должны знать, что такое переменная, функция, список, цикл for, условный оператор if. Если вы этого не знаете — прочитайте первые две главы нашей первой книги, там это объяснено с нуля. Этого достаточно.
Вам понадобится желание разбираться. Эта книга сложнее первой. В ней есть формулы. Не много, но есть. Я не оставляю их без объяснения — каждую формулу я перевожу на русский язык и проверяю кодом. Но вам придётся думать. Это не развлекательное чтение на ночь. Это учебник, написанный в развлекательном стиле. Разница существенна: вам будет интересно, но вам придётся работать головой.
Вам понадобится привычка экспериментировать. Код в этой книге — не священное писание. Это приглашение к игре. Меняйте параметры. Ломайте алгоритмы. Смотрите, что получается. Лучший способ понять, как что-то работает — это сломать это и посмотреть, что изменилось. Я даю вам безопасную среду для поломок: вы всегда можете вернуться к исходному коду из книги.
Чего в этой книге нет
В этой книге нет строгих математических доказательств. Я не доказываю теорему Найквиста — я показываю, что будет, если её нарушить. Я не вывожу формулы из аксиом — я объясняю их смысл и проверяю их работу.
В этой книге нет полного охвата цифровой обработки сигналов. Это не энциклопедия и не университетский курс. Я выбрал те темы, которые наиболее важны для практической работы со звуком, и разобрал их глубоко. За пределами книги остались многие интересные вещи: нелинейная обработка, сжатие аудио, психоакустические модели, современные нейросетевые методы. Это темы для следующих книг.
В этой книге нет привязки к конкретным программам или плагинам. Мы работаем только с Python и бесплатными библиотеками. Всё, что вы узнаете, применимо в любом контексте — потому что вы понимаете принципы, а не запоминаете кнопки.
Краткое содержание глав
В первой главе мы начнём с фундамента. Что такое сигнал и как он становится цифровым. Мы разберём дискретизацию и квантование — процессы, которые превращают непрерывный звук в массив чисел. Мы напишем код, который симулирует эти процессы, и увидим, что происходит, когда частота дискретизации слишком низкая. Мы познакомимся с алиасингом — коварным эффектом, который возникает при нарушении теоремы Найквиста, и научимся его избегать.
Во второй главе мы познакомимся с преобразованием Фурье — главным инструментом анализа звука. Я расскажу, почему любой звук можно разложить на сумму синусоид, и мы проверим это утверждение кодом. Мы напишем наивную реализацию дискретного преобразования Фурье — она будет работать правильно, но очень медленно. Мы поймём, почему она медленная, и это понимание подготовит нас к следующей главе.
В третьей главе мы ускорим преобразование Фурье в сотни раз. Мы разберём идею быстрого преобразования Фурье — алгоритм Кули-Тьюки, который изменил мир цифровой обработки сигналов. Мы напишем рекурсивную реализацию и сравним её скорость с наивной версией. Мы познакомимся с оконными функциями и поймём, почему простое FFT даёт утечку спектра.
В четвёртой главе мы перейдём к анализу меняющихся во времени сигналов. Мы изучим кратковременное преобразование Фурье — технику, которая лежит в основе спектрограмм и большинства алгоритмов обработки звука. Мы напишем свою реализацию STFT и сравним её с библиотечной.
В пятой главе мы займёмся цифровыми фильтрами. Мы поймём, что фильтр — это просто формула, которая превращает входной сигнал в выходной. Мы напишем несколько фильтров с нуля: скользящее среднее, разностный фильтр, фильтр нижних частот. Мы научимся строить частотную характеристику фильтра и понимать, что она говорит о его поведении.