Microsoft Excel как звуковой редактор

Меня всегда занимала мысль -- можно ли при помощи Ардуино записать звук? Оказалось, что можно. Но с оговорками. Вот про оговорки и пойдёт речь.

Записывал я с микрофона, впаянного на усилительную плату, вот такую, как тут:

https://www.adafruit.com/products/1063

При нулевом сигнале у неё на выходе -- 2.5 вольта.

Оцифровка звука -- это, понятно, работа АЦП. В стандартной Ардуине Уно аж шесть АЦП. По умолчанию, если не играться с предделителем, максимальная частота дискретизации составляет 9 600 герц. Это, вообще-то, неплохо, и вполне достаточно для разборчивой речи. Стандартная полоса телефонного разговора -- от 300 до 3 300 герц, и для передачи этого частоты дискретизации вполне хватит. АЦП на Ардуино -- 10-битный, т.е. описывает 1024 уровней сигнала. Это, опять же, неплохо -- примерно до 1996 года в компьютерных игрушках использовался 8-битный звук (256 уровней) и никто особо не жужжал.

НО. 9 600 герц это круто, но при 10 битах на сэмпл за одну секунду будет записано 12 килобайт -- в шесть раз больше, чем на Ардуине памяти :))) Ни о какой буферизации не может быть и речи -- эти данные необходимо куда-то сбрасывать не отходя от кассы. Наиболее высокоскоростной вариант без особо сильных заморочек -- скидывать на SD-карточку. Теоретически, оно может туда писать где-то 250 килобайт в секунду.

Но читателя SD-карточки у меня не было. Поэтому я попёр тупо, в лоб -- сбрасывать данные через USB, вернее, через эмулируемый серийный порт. При выставленной скорости в 230400 бод в теории я мог передать 23 тысячи сэмплов. Но это в теории и если фигарить сразу двоичные данные. Если же делать на скорую руку, и передавать всё текстом, разделённым запятыми, то максимум, которого я добился -- это 3 500 сэмплов в секунду. Это уже, конечно, откровенно херово, но ради интереса -- сделал.

Что круто? Круто, что звук -- в тексте, разделённом запятыми. Т.е. можно сунуть в тот же Эксель и, сделав график данных, получить картинку типичного звукового файла!




Более того -- если очень хочется, эти данные можно в Экселе же и обработать. Вот вы и не знали, что Эксель, оказывается -- звуковой редактор, а? :) Уж, во всяком случае, отрезать и склеивать можно сколько влезет. Но если хочется сильно извратиться, то можно, в принципе, сделать некий DSP :)

Мне, в принципе, надо было сделать только две вещи:

Звук на компьютере бывает 8, 16, 24-битный. Бывает ещё какой-то 32-битный, с сэмплами, описываемыми числами с плавающей запятой, но про него я вообще не знаю ничего. А выход с АЦП Ардуины -- 10 битный. Его можно было привести либо к 8 битам (с потерями, а зачем это нам), либо искусственно поднять до 16 бит (до 24 бит поднимать уже бессмысленно). Напомню, при отсутствии сигнала на выходе усилителя 2.5 вольта -- т.е. если выражаться в том, что читает АЦП это ~512. Далее надо домножить это на 64 (разница между 10 и 16 битами) и отнять 32 767. Ведь звук в стандартном WAV файле описывается знаковыми переменными int16, от -32 768 до 32 767.

Далее. 3 500 сэмплов в секунду это прекрасно, но компьютер не проиграет это. Минимально, что может проиграть компьютер -- это файл с 6 000 сэмплов в секунду. Что делаем? Интерполяцию, конечно! Берём два значения, втыкаем между ними арифметическое среднее. Повторить до тех пор, пока не кончится массив. Получаем массив в два раза больше исходного. А это уже частота дискретизации 7 килогерц -- такое прекрасно проигрывается.

Я не стал делать всё это в Экселе. Вместо этого я написал программу на Питоне, которая делает перевод данных в массив знаковых 16-битных int'ов и делает интерполяцию. Я также в очередной раз оценил богатейший инструментарий, который даёт язык программирования Питон человеку, любящему эксперименты. Чтобы записать массив в WAV файл, надо всего-лишь воспользоваться библиотеками NumPy и SciPi. В SciPi есть класс io.wavfile, который может записывать файл из массива типа NumPy.array.

Что получилось в результате? Ну, понять, что я там вякнул в микрофон, при желании, можно. Но это звук качества коротковолнового радио, передаваемого откуда-нибудь из Австралии. И очень шумный АЦП у Ардуины -- характерное такое фоновое жужжание есть.

Подвесил бы MP3-шку, но сходу не знаю, как.

В-общем, практическое применение -- никакое, но зато я отлично повалял дурака и узнал много нового.
смысл понял
и вот сижу и думаю: почему я, начинавший программировать еще на фокале, не пошел дальше?
наверное, с 89-го мог бы много добиться, тем более душа вроде лежит.
а не глотать пыль в металлургии...
как думаешь, не поздно еще начать?)
Ну, я как бы сам достаточно радикально сменил область деятельности 6 месяцев назад. О чём не жалею.

Другое дело, что эти самые перемены надо согласовывать с местным начальством, сиречь, женой :)

А начинать что-то учить новое никогда не поздно; фигня это, на мой взгляд, что "только молодые могут учиться". Если держать мозг активным, то никаких проблем.
супруга даже в своей папке найти ничего не может)
заказал ардуину, в ожидании сижу, читаю книги
сколько жэ я интересного в своей жизни пропустил..
Подобную штуку делал в 1992 году.
Точнее участвовал.
Делали речевой оповещатель, а я к нему редактор звуков приспосабливал.
Звук писался дельта-модуляцией, т.е. однобитное кодирование.
Получалось 1 кбит на 1 с. (ЕМНИП)
В общем в одну микросхему РФ2 помещалась программа и 8 сообщений по 1 с.
"Долей масла!" до сих пор в ушах звенит.
А звуковой редактор был переделан из программы программатора, т.е. кроме перестановки байтов в шестнадцатеричном виде было добавлено проигрывание выбранного фрагмента и редактирование битовой последовательности. При определённом навыке можно было по последовательности битов найти нужный звук и удалить или переставить.
Это почти, как использование для этой цели экселя.
Что любопытно основной разработчик сильно заикался в обычной жизни, но фразы в регистратор наговаривал очень чётко и внятно.
Прикольно! Но 1024 бит (128 байт) на 1 секунду записи дельта-модуляцией как-то откровенно мало. Так как там однобитное кодирование, частота дискретизации должна превышать необходимую по Найквисту-Котельникову раз эдак в пять-шесть.

Если допустить, что оцифровываем сигнал до 2 килогерц (более-менее разборчивую речь), получится минима 20 000 герц. Это 2.5 килобайта.
Немного подумал и вспомнил, что в конечном изделии процессора не было вообще, т.е. все два килобайта микросхемы памяти были заняты звуком и на каждое из 8 сообщений приходилось по 2 килобита.
Проигрывалось оно схемкой из микросхем малой интеграции (К561 вроде серии).
8 внешних контактов выбирали старшие три бита адреса, а младшие адреса перебирались счётчиком.
А записывалось/редактировалось оно на СМ1810.