Ардуино - запись звука

Обсуждаем контроллеры компании Atmel.
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

я ничего не коллекционирую)) я делаю полезные устройства...
щас доделываю приложения для звонков по интернету... точнее по бесплатному Wi-Fi... экономя деньги))
приложение уже работает...
переходим к натурным испытаниям))
:roll:

Добавлено after 16 minutes 56 seconds:
когда делал умный дом...
схема_PoE(5V2A).jpg
(192.74 КБ) 63 скачивания
в схеме использовал роутер и интернет модуль...
кабель (витуха) приходил от провайдера на роутер... а с роутера на интернет модуль.

если роутер зависал то МК автоматом переключал кабель (витуха) от провайдера напрямую на интернет модуль...
при этом роутер исключался из общей схемы...
1.jpg
(85.35 КБ) 71 скачивание
для переключения кабеля (витуха) я использовал обычную релюшку... можно поляризованную...
:)

аналогично можно сделать с ПЛК... да и любым другим устройством с интернет.
:roll:
например есть куча ПЛК включённых последовательно...
все ПК мониторят дург друга... как в самолёте... 5 бортовых компьютеров мониторят друг друга))
в случае отказа одного из ПЛК соседний ПЛК выкидывает отказавший ПЛК из схемы... с помощью простой релюшки...
питание релюшки можно сделать по той же витухе... как в PoE.
всё очень просто и надёжно.))
:tea:

вместо реле можно использовать диодный коммутатор... будет ещё надёжней))
кой какие опыты уже делались с диодным коммутатором... над диодным коммутатором надо ещё поработать...
:tea:

Добавлено after 1 minute 50 seconds:
сейчас работаю по оптике...
схема_PoE(5V2A)_AVR.jpg
(178.13 КБ) 56 скачиваний
как автоматом переключать оптику... я пока не придумал))
нужен другой коммутатор)) или типа сплиттер... потом подумаем))
:tea:
Аватара пользователя
uni
Встал на лапы
Сообщения: 137
Зарегистрирован: Пт дек 07, 2007 11:17:40
Откуда: г. Екатеринбург
Контактная информация:

Re: Ардуино - запись звука

Сообщение uni »

Да, про реле я думал, просто не знал практические реализации. ПЛК с Ethernet пока не разбирал.

Ваша схема умного дома на витых парах мне понравилась. Я у себя в квартире в каждую розетку вывел по 2 Ethernet кабеля на всякий случай. Предусмотрел такую разводку до ремонта. Теперь могу везде по проводному умному устройству вставлять.
Россия навсегда!
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

все нормальные люди закладывают витуху на этапе ремонта... кроме меня)) потому я ремонт ещё не делал))

разбирать ПЛК в принципе и не обязательно... можно прицепить внешний коммутатор на реле... на ту же DIN рейку... и управлять этой релюшкой удалённо по той же витухе... разницы нет))
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

roman.com писал(а):первое что приходит на ум... добавить в программу сканер IP ))
т.к. количество IP у провайдера ограничено... то передрать все IP провайдера и найти свой... не займёт много времени))
159.194.0.2
159.194.0.3
159.194.0.4
...
159.194.255.254
правда там несколько пулов ))
27.24.0.2
27.24.0.3
27.24.0.4
...
27.24.255.254
и т.д. ))

пипец... озадачили))
добавить в программу сканер IP ))
теперь найти свой IP... можно в один клик )) 1 минута по времени))
:tea:
не знаю как отнесётся провайдер к тому что кто-то постоянно сканирует все его IP адреса...))
а платить 150 рублей за статический IP... жаба душит))
:))
ну и ладно...
:tea:
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

roman.com писал(а):переходим к натурным испытаниям))
угу ))

1- через домашний роутер всё работает идеально)) звук идеальный )) 22050 семплов * 16 бит = 352.800 бит/с.
Screenshot_1.jpg
(108.83 КБ) 69 скачиваний
2- надо проверить как работает по реальному интернету...
:roll:
зашёл в банк... там бесплатный Wi-Fi... ))
Screenshot_2.jpg
(116.83 КБ) 73 скачивания
По интернету работает идеально)) звук идеальный )) 22050 семплов * 16 бит = 352.800 бит/с.
только иногда проскакивают щелчки - это потеря пакетов...
видимо сигнал Wi-Fi был слабый...
надо ещё потестить... в разных условиях... на разных Wi-Fi...))
:tea:

Добавлено after 26 minutes 34 seconds:
а впереди у нас ещё самая сложная задача...
1- берём старый телефон
2- подключаем к ардуино
3- звоним по интернету ))
Screenshot_3.jpg
(55.15 КБ) 80 скачиваний
:tea:
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

добавили видео...
https://developer.alexanderklimov.ru/an ... bitmap.php
видео.jpg
(117.53 КБ) 86 скачиваний
на компе работает нормально...
на андроиде работает... но тормозит конкретно)) андроид работает в ~10 раз медленней компа))
мда...
:tea:
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

Решил таки я еще раз , после значительного перерыва попробовать пропихнуть звук 8кгц 8бит через GPRS модем SIM800.
вернулся к тестированию канала и пропускной способности.
Первый делом вывел звук через сериал ардуины (115200) и получил отличный результат. Выводил в лог программы putty. Т.е 115200 достаточная скорость порта,что собственно неудивительно.
Потом я решил заново протестить пропускную способность модема. Заполнил массив разного размера 256, 512, 1024байт данными от 0 до 9 и стал толкать этот массив в порт модема и в java программе Романа смотреть сколько удается получить.

Добавлено after 1 minute 31 second:
На ардуине при начале отправке зажигаю pin13, при окончании отправки заданного количества пакетов гашу.

Добавлено after 42 minutes 33 seconds:

Код: Выделить всё

 for (int i = 0; i < 512; i++) {
    buf00[i] = i % 10; // остаток от деления на 10 даёт числа от 0 до 9
  }
  digitalWrite(ledStart, HIGH);
  
  for (int j=0; j<512; j++) {
  sendATCommand("AT+CIPSEND=512", false);
  delay(20);
  GSMport.write(buf00, sizeof(buf00));
  //Serial.write(buf00,sizeof(buf00));
  delay(100);
}
  digitalWrite(ledStart, LOW);
Добавлено after 14 minutes 24 seconds:
к сожалению добится 100% получения пакетов удалось лишь если делать задержку больше 100мс (delay(100)) и еще приходится делать задержку для комманды указания передачи и размера пакета AT+CIPSEND=512
В этом случает отсылая 512 пакетов по 512 байт мне удалсь получить файл 262 144 байт (512*512)
при уменьшении задержки между пакетами до 50мс приходит файл размером 250 880 байт
при уменьшении задержки между пакетами до 20мс приходит файл размером 203 264 байт

c задержкой близкой к приемлемой delay(20) удается пропихнуть без потерь лишь первые 16 пакетов по 512 байт. Дальше , как я понял начинаются потери. С задержкой в 5 мс даже и эти 16 пакетов были получены с потерями.
Последний раз редактировалось olegue Чт янв 11, 2024 15:28:34, всего редактировалось 1 раз.
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Ардуино - запись звука

Сообщение Martian »

Так, к сведению (вдруг, не в курсе) - NB_IoT может оказаться предпочтительнее GPRS
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

[uquote="Martian",url="/forum/viewtopic.php?p=4529383#p4529383"]Так, к сведению (вдруг, не в курсе) - NB_IoT может оказаться предпочтительнее GPRS[/uquote]. В плане деталей этой технологии совсем не в курсе. СЧас прогуглил поверхностно, но пока даже не понял подойдет ли мой модем sim800.
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

какие нафиг NB_IoT
:facepalm:
товарищ не понимает что он вообще пишет))
лишь бы что-то написать... от балды))
Screenshot_1.jpg
(33.14 КБ) 65 скачиваний
Screenshot_2.jpg
(86.12 КБ) 56 скачиваний
и т.д.
:tea:

у тебя ПОТОКОВАЯ передача !
требования к потоковой передачи:
-высокая скорость (в идеале от 10 Мбит/с и выше).
-минимальные задержки (в идеале < 1 мс).
-стабильный пинг.
:tea:

опять ты пытаешься впихнуть невпихуемое))
сам GPRS модем SIM800 не предназначен для таких экспериментов)).

тут надо или Wi-Fi или LTE или 5G ))
а лучше всё вместе))
:tea:

Добавлено after 1 minute 57 seconds:
[uquote="olegue",url="/forum/viewtopic.php?p=4529353#p4529353"]c задержкой близкой к приемлемой delay(20) удается пропихнуть без потерь лишь первые 16 пакетов по 512 байт. Дальше , как я понял начинаются потери. С задержкой в 5 мс даже и эти 16 пакетов были получены с потерями.[/b][/uquote]
твой GPRS модем SIM800 слишком долго думает))
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Ардуино - запись звука

Сообщение Martian »

olegue, если из старых, то точно не подойдёт.
И рассчитай требуемый канал. Романдотком хоть и дурачок, но отчасти прав. 10 мбит/с, конечно, нафиг не надо, это полнейший бред, а не неотъемлемое свойство потоковой передачи, но какое-то значение должно быть.
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

[uquote="olegue",url="/forum/viewtopic.php?p=4529353#p4529353"]к сожалению добится 100% получения пакетов удалось лишь если делать задержку больше 100мс (delay(100)) и еще приходится делать задержку для комманды указания передачи и размера пакета AT+CIPSEND=512[/uquote]

получается,что для того что бы пропихнуть 512байт я должен подождать 100мс, а это пропускная способность равная 5120б/с или 41000 bps, а мне по минимуму надо 8кб/c. Тем не менее хочу ппробовать протащить поток с сэплрейтом хотя бы 4кгц и потом уже успокоится.

Добавлено after 16 minutes 11 seconds:
Да, все получилось. Так как у меня ардуинка была на LGT8f328 , то поставил в IDE делитель на 2 и в впрограмме оцифровки больше ничего не менял. Полученный файл завел в Sound Force и уменьшил битрейт до 4кгц внизу в панельи. Получил в итоге звук качества 4кгц. Приложу файл, там спектакл на бел. языке поэтому разборчивость так себе. Ну эт неважно. Важно что разобрался

Добавлено after 6 minutes 27 seconds:
Еще важный момент , модем перевел в прозрачный режим
myGsm.println("AT+CIPMODE=1");

Код: Выделить всё

void loop() { 
    if (bufByteCount == 32 && bufWrite == 1)
  {
    myGsm.write(buf01, sizeof(buf01)); 
   }
   if (bufByteCount == 32 && bufWrite == 0)
  {
       myGsm.write(buf00,sizeof(buf00));  
   }
   
} //loop
и отправлял мелкими пакетами по 32байта, но это не имеет особого значения потому как в прозрачном режиме модем исходят из особеннстей подлкючения определяет какими пакетами отправлять, а то что ему даешь собирает в буфер.

Добавлено after 1 minute 27 seconds:
задержки delay() тоже все убрал. С ними только хуже было

Добавлено after 5 minutes 20 seconds:
нужно теперь в заголовке файла показать что 4кгц и будет нормально
Вложения
Jv20240111_2256.zip
(146.37 КБ) 58 скачиваний
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

olegue писал(а):Тем не менее хочу ппробовать протащить поток с сэплрейтом хотя бы 4кгц и потом уже успокоится.
ну ? уже успокоился ? )) или ещё нет ? ))
:tea:
хватит уже мучать GPRS
на изернет переходи... там 10 мбит/с... всё летает без проблем))
:tea:
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

[uquote="roman.com",url="/forum/viewtopic.php?p=4529761#p4529761"]ну ? уже успокоился ? )) или ещё нет ? ))
:tea:
хватит уже мучать GPRS
на изернет переходи... там 10 мбит/с... всё летает без проблем))
:tea:[/uquote]

скорее наоборот, вот допустим есть 8кгц pcm, что если сжать его на лету пускай потерями,но оптимизировав для уха и отправить уже 4кгц звук, вот такая затея.

Добавлено after 2 minutes 7 seconds:
например убрать паузы

Добавлено after 14 seconds:
или сделать их короче

Добавлено after 14 minutes 29 seconds:
ерунда, конечно, но это так, лишь начало рассуждений

Добавлено after 1 hour 19 minutes 1 second:
Короче, буду пытаться вернуться к 8кгц, но уберу повторяющиеся сэмплы, не буду писать их в буфер. Потом попробую +-1 тоже не писать. Надо пробовать.
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

как уже говорил выше... на ардуине сильно не разгонишься)) скорость маленькая...
врятли ты напишешь нормальный кодек))
хотя если взять пачку ардуин... то можно подумать))
:tea:
ну можно немного поколдовать... ))

1.
если не писать +-1 то будет искажение типа "ступенька".
лучше тогда уменьшить динамический диапазон... не писать старшие разряды...
я вместо 8 бит писал 7 бит... и даже 6 бит... на семпл )) получил pcm-128... pcm-64... pcm-32... соответственно.
звук как у рации - срезает громкие звуки.
но разобрать можно))
это ардуина может.
:tea:
2.
ещё можно писать не абсолютные значения... а относительные...
+1+2-1-3+2...
это ардуина может.
но посчитав внимательно... заметного выигрыша не получается)) хотя если снизить частоту на входе... короче надо посчитать))
или сделать как в IP-камере... там сначала передаётся опорный кадр... а потом передаются только те пиксели которые изменились в следующем кадре...
:tea:
3.
убрать паузы тоже можно... будет опять же как в рации VOX...
пока говоришь в микрофон - идёт передача...
не говоришь - нет передачи))
это ардуина может.
:tea:
4.
что ещё ардуина может ?
сделать БПФ (быстрое преобразование Фурье) и разложить звук на спектры ... и отфильтровать не нужные гармоники...(как в телефоне GSM)...
это ардуина не может.
хотя если взять пачку ардуин... то можно подумать))
:))
5.
и т.д.
:tea:
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

[uquote="roman.com",url="/forum/viewtopic.php?p=4529887#p4529887"]лучше тогда уменьшить динамический диапазон... не писать старшие разряды...
я вместо 8 бит писал 7 бит... и даже 6 бит... на семпл )) получил pcm-128... pcm-64... pcm-32... соответственно.
звук как у рации - срезает громкие звуки.
но разобрать можно))
это ардуина может.
:tea:[/uquote]

зацепился за эту фишку.

допустим я обьявил массив для накопления сэплов
buf00[32]
если я буду сохранять только 7 битные сэмплы:
buf01[bufByteCount] = ADCH & 0x7F;

значит ли это что размерр массива перед отправкой будет не 32 байта (32*8=256 бит), а 32*7=224 бита ?

Добавлено after 2 minutes 44 seconds:
Если это так, то получается что мне нужно будет лишь поприседать с "декодированием" получившегося кода, а для лучше юзабильности наверно стоит на выходе вернуть файлу 8битный формат, что бы можно было играть его на плейерах, а не майстерить свой
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

в передатчике
создаём массив 32 байт
buf00[32]

записываем в массив 8 бит
buf00[0] = ADCH;
buf00[1] = ADCH;
...
buf00[31] = ADCH;

сдвигаем весь массив на 1 бит
buf00[0] = (buf00[0]<<1);
buf00[1] = (buf00[1]<<1);
...
buf00[28] = (buf00[31]<<1);

получаем массив 28 байт
buf00[28]

передаём массив 28 байт по GPRS модем SIM800.


в приёмнике делаем обратный процесс...
создаём массив 32 байт
buf00[32]

записываем в массив 7 бит
buf00[0] = buf00[0];
buf00[1] = buf00[1];
...
buf00[28] = buf00[28];

сдвигаем весь массив на 1 бит
buf00[0] = (buf00[0]>>1);
buf00[1] = (buf00[1]>>1);
...
buf00[31] = (buf00[28]>>1);

получаем массив 32 байт по 8 бит
buf00[32]

вернули файл в 8 битный формат
:tea:

экономия трафика 12,5 % (100/8=12,5)

недостаток - динамический диапазон уменьшился в 2 раза (!).
:tea:

Вопрос:
имеет ли смысл уменьшать динамический диапазон в 2 раза (!) ради экономия трафика 12,5 %... ???
:dont_know:

для себя я ответил на этот вопрос уже давно - нет, не имеет))
потому что у меня всё работает по бесплатному Wi-Fi... ))
у тебя всё работает по платному GPRS модем SIM800.
:tea:
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

в Вашей java программе можно 7 битный звук получить?

Добавлено after 33 seconds:
и проиграть
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Ардуино - запись звука

Сообщение roman.com »

в java программе получить 7 битный звук можно...
выше написал как...
:tea:
в java программе проиграть 7 битный звук можно... если перевести 7 битный звук в стандартный формат...
выше написал как...
:tea:

подробнее...

java использует стандартные библиотеки для записи и воспроизведения...

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.TargetDataLine;

для воспроизведения в java надо перевести 7 битный звук в стандартный формат...

sampleRate = 8000,11025,16000,22050,44100 кгц
sampleSizeInBits = 8,16 бит

:tea:

зато в java заголовок WAV файла не нужен))
заголовок WAV файла можно не передавать... тем самым экономя трафик))
:tea:
Аватара пользователя
olegue
Собутыльник Кота
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Re: Ардуино - запись звука

Сообщение olegue »

попробовал удалять паузы квадратичным методом. Если энергия буфера меньше Тресхолда, то не отправляют его.
Поигрался с этим значением, толку мало. Вырезание всех пауз, даже там где они формируют речь, это тоже не дело.
Попрбую 7 бит. По крайней мере есть с чем сравнить.

Код: Выделить всё

const int THRESHOLD = 24500;  // Пороговое значение энергии


// Функция для определения энергии в заданном буфере
int calculateEnergy(const uint8_t* buffer, int size) {
    int energy = 0;
    for (int i = 0; i < size; ++i) {
        energy += buffer[i] * buffer[i];
    }
    return energy;
}


void loop() { 
  if (digitalRead(btnStart) == LOW){
    digitalWrite(ledStart, HIGH);
   if (bufByteCount == 32 && bufWrite == 1)  {
    int energy = calculateEnergy(buf01, sizeof(buf01));
     //Serial.print (energy);Serial.print ("THRESHOLD");Serial.println (THRESHOLD);
      if (energy > THRESHOLD) {
        // Если энергия выше порога, отправляем пакет
        myGsm.write(buf01,sizeof(buf01)); 
    }}
   if (bufByteCount == 32 && bufWrite == 0)  {
     int energy = calculateEnergy(buf00, sizeof(buf00));
     //Serial.print (energy);Serial.print ("THRESHOLD");Serial.println (THRESHOLD);
      if (energy > THRESHOLD) {
        // Если энергия выше порога, отправляем пакет
        myGsm.write(buf00,sizeof(buf00));
    }}
       
    }
  
   else
   {digitalWrite(ledStart, LOW);}
} //loop


Ответить

Вернуться в «AVR»