Использование данных AudioRecord вне Android

Я пытаюсь передать аудиоданные, записанные на Android, на микроконтроллер для воспроизведения. звук записывается с использованием класса AudioRecord, а затем отправляется по протоколу UDP. на принимающей стороне микроконтроллер получает данные и воспроизводит их с помощью ШИМ. хотя есть пара проблем:

  • Я точно не знаю, какой формат использует класс AudioRecord. я использую ENCODING_PCM_16BIT, но даже не знаю, биполярный он или нет, и как преобразовать его в униполярный, если это так.
  • Из-за ограниченной пропускной способности я не могу отправить более 8 бит на образец. поскольку 8-битный PCM не поддерживается на моем телефоне, я использовал 16-битную версию, но для преобразования я использовал только старшие 8 бит. я не уверен, что это правильно.
  • Поскольку я использовал странный кварцевый осциллятор для своей схемы, звук должен быть сэмплирован на частоте 7,2 кГц. мой телефон поддерживает выборку 8 кГц, поэтому я просто использую ее и отправляю 90% записанных данных (используя цикл for с плавающей запятой в качестве переменной).
  • Я подключил динамик мощностью 2 Вт к выводу OC2 на моем ATmega32, используя резистор на 220 Ом и конденсатор на 100 нФ в качестве фильтра. (Схема), но опять же я не уверен, что это правильный способ сделать это.

Таким образом, все это вместе взятые не дает ничего, кроме шума на выходе. единственное, что меняется, когда я «шушу» рядом с микрофоном, — это громкость и характер выходного шума. шаблон не имеет никакого смысла, хотя и одинаков для человеческого голоса или музыки.

Это фрагмент кода, который я написал для преобразования данных перед их отправкой по UDP:

float divider = 8/7.2f;
int index=0;
recorder.read(record_buffer,0,buffer_size);
for(float i=0;i<buffer_size;i+=divider)
{
    send_buffer[index++]= (byte) (record_buffer[(int)i] >> 8);
}

Я не знаю, куда идти отсюда. любое предложение приветствуется.

Обновление: я последовал совету RussSchultz и отправил синусоидальную волну по UDP и подключил выход к моему дешевому O-Scope. вот что я получаю:

No Data : http://i.stack.imgur.com/1XYE6.png
No Data Close-up: http://i.stack.imgur.com/ip0ip.png
Sine : http://i.stack.imgur.com/rhtn0.png
Sine Close-up: http://i.stack.imgur.com/12JxZ.png

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


person M47    schedule 31.10.2015    source источник
comment
во-первых, разбить проблему на части. Убедитесь, что вы можете передать известный сигнал UDP на ваше устройство. Прямоугольная волна с 2 сэмплами в высоту, двумя сэмплами в низ, повторение до тошноты должно быть достаточно хорошим, чтобы доказать, что этот аспект работает правильно. Вы также можете записывать свои данные UDP на ПК в сети, записывать данные и отображать их в виде графика в Excel (или любом другом графическом инструменте, который у вас есть).   -  person Russ Schultz    schedule 01.11.2015
comment
ваше 16-8-битное решение должно подойти   -  person Russ Schultz    schedule 01.11.2015
comment
Чтобы решить проблему, убедитесь, что ваш ЦАП работает с синусоидой. Скомпилируйте синусоиду из 256 выборок и выведите ее. Убедитесь, что это звучит правильно (и правильно выглядит на O-Scope).   -  person Russ Schultz    schedule 01.11.2015
comment
@RussSchultz У меня есть (дерьмовый, но достаточно хороший) O-Scope, так что попробую. Спасибо. попытается отправить это .   -  person M47    schedule 01.11.2015
comment
@RussSchultz получил некоторое объяснение шума. установим флаг переполнения буфера и сообщим   -  person M47    schedule 01.11.2015


Ответы (1)


поэтому после работы над этим в течение месяца я получил его на работу.

  • Я точно не знаю, какой формат использует класс AudioRecord. я использую ENCODING_PCM_16BIT, но даже не знаю, биполярный он или нет, и как преобразовать его в униполярный, если это так.

  • Из-за ограниченной пропускной способности я не могу отправить более 8 бит на образец. поскольку 8-битный PCM не поддерживается на моем телефоне, я использовал 16-битную версию, но для преобразования я использовал только старшие 8 бит. я не уверен, что это правильно.

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

  • Поскольку я использовал странный кварцевый осциллятор для своей схемы, звук должен быть сэмплирован на частоте 7,2 кГц. мой телефон поддерживает выборку 8 кГц, поэтому я просто использую ее и отправляю 90% записанных данных (используя цикл for с плавающей запятой в качестве переменной).

хотя у меня есть небольшой сдвиг частоты, это все еще приемлемо.

  • Я подключил динамик мощностью 2 Вт к выводу OC2 на моем ATmega32, используя резистор на 220 Ом и конденсатор на 100 нФ в качестве фильтра. (Схема), но опять же я не уверен, что это правильный способ сделать это.

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

person M47    schedule 21.12.2015