Обсуждаем контроллеры компании Atmel.
Ответить

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

Пт сен 22, 2023 18:38:16

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

Добавлено after 16 minutes 56 seconds:
когда делал умный дом...
схема_PoE(5V2A).jpg
(192.74 KiB) Скачиваний: 30

в схеме использовал роутер и интернет модуль...
кабель (витуха) приходил от провайдера на роутер... а с роутера на интернет модуль.

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

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

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

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

Добавлено after 1 minute 50 seconds:
сейчас работаю по оптике...
схема_PoE(5V2A)_AVR.jpg
(178.13 KiB) Скачиваний: 26

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

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

Пт сен 22, 2023 18:42:05

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

Ваша схема умного дома на витых парах мне понравилась. Я у себя в квартире в каждую розетку вывел по 2 Ethernet кабеля на всякий случай. Предусмотрел такую разводку до ремонта. Теперь могу везде по проводному умному устройству вставлять.

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

Пт сен 22, 2023 19:40:43

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

разбирать ПЛК в принципе и не обязательно... можно прицепить внешний коммутатор на реле... на ту же DIN рейку... и управлять этой релюшкой удалённо по той же витухе... разницы нет))

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

Сб сен 23, 2023 19:18:13

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:

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

Пн сен 25, 2023 20:01:57

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

угу ))

1- через домашний роутер всё работает идеально)) звук идеальный )) 22050 семплов * 16 бит = 352.800 бит/с.
Screenshot_1.jpg
(108.83 KiB) Скачиваний: 31

2- надо проверить как работает по реальному интернету...
:roll:
зашёл в банк... там бесплатный Wi-Fi... ))
Screenshot_2.jpg
(116.83 KiB) Скачиваний: 30

По интернету работает идеально)) звук идеальный )) 22050 семплов * 16 бит = 352.800 бит/с.
только иногда проскакивают щелчки - это потеря пакетов...
видимо сигнал Wi-Fi был слабый...
надо ещё потестить... в разных условиях... на разных Wi-Fi...))
:tea:

Добавлено after 26 minutes 34 seconds:
а впереди у нас ещё самая сложная задача...
1- берём старый телефон
2- подключаем к ардуино
3- звоним по интернету ))
Screenshot_3.jpg
(55.15 KiB) Скачиваний: 38

:tea:

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

Пт сен 29, 2023 00:29:09

добавили видео...
https://developer.alexanderklimov.ru/an ... bitmap.php
видео.jpg
(117.53 KiB) Скачиваний: 39

на компе работает нормально...
на андроиде работает... но тормозит конкретно)) андроид работает в ~10 раз медленней компа))
мда...
:tea:

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

Чт янв 11, 2024 14:57:01

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

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

Чт янв 11, 2024 14:59:38

Так, к сведению (вдруг, не в курсе) - NB_IoT может оказаться предпочтительнее GPRS

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

Чт янв 11, 2024 15:22:15

Так, к сведению (вдруг, не в курсе) - NB_IoT может оказаться предпочтительнее GPRS
. В плане деталей этой технологии совсем не в курсе. СЧас прогуглил поверхностно, но пока даже не понял подойдет ли мой модем sim800.

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

Чт янв 11, 2024 16:12:41

какие нафиг NB_IoT
:facepalm:
товарищ не понимает что он вообще пишет))
лишь бы что-то написать... от балды))
Screenshot_1.jpg
(33.14 KiB) Скачиваний: 21

Screenshot_2.jpg
(86.12 KiB) Скачиваний: 20

и т.д.
:tea:

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

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

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

Добавлено after 1 minute 57 seconds:
c задержкой близкой к приемлемой delay(20) удается пропихнуть без потерь лишь первые 16 пакетов по 512 байт. Дальше , как я понял начинаются потери. С задержкой в 5 мс даже и эти 16 пакетов были получены с потерями.[/b]

твой GPRS модем SIM800 слишком долго думает))

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

Чт янв 11, 2024 16:43:02

olegue, если из старых, то точно не подойдёт.
И рассчитай требуемый канал. Романдотком хоть и дурачок, но отчасти прав. 10 мбит/с, конечно, нафиг не надо, это полнейший бред, а не неотъемлемое свойство потоковой передачи, но какое-то значение должно быть.

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

Чт янв 11, 2024 23:18:08

к сожалению добится 100% получения пакетов удалось лишь если делать задержку больше 100мс (delay(100)) и еще приходится делать задержку для комманды указания передачи и размера пакета AT+CIPSEND=512


получается,что для того что бы пропихнуть 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 KiB) Скачиваний: 17

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

Пт янв 12, 2024 17:22:43

olegue писал(а):Тем не менее хочу ппробовать протащить поток с сэплрейтом хотя бы 4кгц и потом уже успокоится.

ну ? уже успокоился ? )) или ещё нет ? ))
:tea:
хватит уже мучать GPRS
на изернет переходи... там 10 мбит/с... всё летает без проблем))
:tea:

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

Пт янв 12, 2024 23:38:31

ну ? уже успокоился ? )) или ещё нет ? ))
:tea:
хватит уже мучать GPRS
на изернет переходи... там 10 мбит/с... всё летает без проблем))
:tea:


скорее наоборот, вот допустим есть 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 тоже не писать. Надо пробовать.

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

Сб янв 13, 2024 01:55:59

как уже говорил выше... на ардуине сильно не разгонишься)) скорость маленькая...
врятли ты напишешь нормальный кодек))
хотя если взять пачку ардуин... то можно подумать))
: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:

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

Сб янв 13, 2024 11:30:59

лучше тогда уменьшить динамический диапазон... не писать старшие разряды...
я вместо 8 бит писал 7 бит... и даже 6 бит... на семпл )) получил pcm-128... pcm-64... pcm-32... соответственно.
звук как у рации - срезает громкие звуки.
но разобрать можно))
это ардуина может.
:tea:


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

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

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

Добавлено after 2 minutes 44 seconds:
Если это так, то получается что мне нужно будет лишь поприседать с "декодированием" получившегося кода, а для лучше юзабильности наверно стоит на выходе вернуть файлу 8битный формат, что бы можно было играть его на плейерах, а не майстерить свой

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

Сб янв 13, 2024 12:39:14

в передатчике
создаём массив 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:

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

Сб янв 13, 2024 13:09:32

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

Добавлено after 33 seconds:
и проиграть

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

Сб янв 13, 2024 13:35:38

в 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:

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

Сб янв 13, 2024 17:10:29

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


Ответить