nlothik (nlothik) wrote,
nlothik
nlothik

Categories:

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-шку, но сходу не знаю, как.

В-общем, практическое применение -- никакое, но зато я отлично повалял дурака и узнал много нового.
Tags: 73, diy, low-tech, программирование, техника
Subscribe

  • Умейте жаловаться

    Недавно “на нашем раёне” поселился мудак, какой-то ультрарелигиозный католик. По моему опыту, католики вообще-то обычно более вменяемы,…

  • Вив ла Франс

    По причине выхода из строя 25cm (10″) сковородки с антипригарным покрытием, приобрёл замену. Меня задолбало менять эти тефлонированные…

  • Мы играли, мы играли, наши пальчики устали

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

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 7 comments