Записывал я с микрофона, впаянного на усилительную плату, вот такую, как тут:
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-шку, но сходу не знаю, как.
В-общем, практическое применение -- никакое, но зато я отлично повалял дурака и узнал много нового.