• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP32 wi-fi микрофон

Передача голоса по нажатию кнопки, воспроизведение после отпускания.Частота дискретизации 8kHz. Сейчас используется один буфер по максимуму.Использование двойного буфера и передача по заполнении первого приводит к тому, что на этапе передачи первого буфера пока второй заполняется данными с АЦП.Первый не успевает улететь по wi'fi и в лутшем случае данные перезатираются.
Использовалось два буфера по 16 кило.Есть вариант использовать кодек G711 это уменьшит количество передаваемых данных в 2 раза.Кольцевой буфер тоже не помог.Но как насчет потоковой передачи?Не хочется использовать PSRAM. Вроде поток данных для wi-fi не очень большой.Wi'fi камера на esp32 выдает картинку около 15кило при 800x600 10fps.Может работа АЦП с прерываниями 8000 рас в секунду тормозят передачу по wi'fi?
 
Код:
 void IRAM_ATTR onTimer() {
    portENTER_CRITICAL_ISR(&timerMux);
    adc_Buffer[bufN][bufferPointer++] = (adc1_get_raw(ADC1_CHANNEL_0)-1400)*6;
    bufferPointer &= ADC_BUF_MASK;
    if(bufferPointer == 0) bufN = bufN ? 0:1;
    portEXIT_CRITICAL_ISR(&timerMux);
   }

Далее примерно так но пишет error, eсли передавать весь размер буфера.Если половину успевает, но выпадают слова :

Код:
void loop() {
     ready_buf = bufN ? 0:1;
     int button_state = digitalRead(BUTTON);
     if (ready_buf != sent_buf and button_state == LOW){
        if (end_of_pac_flag == 0){
           portENTER_CRITICAL_ISR(&timerMux);
          bufferPointer = 0;
          portEXIT_CRITICAL_ISR(&timerMux);
        }
        end_of_pac_flag = 1;
        uint8_t *buf = (uint8_t*)adc_Buffer[ready_buf];
        size_t size = sizeof(adc_Buffer[ready_buf]);
        bytecounter += size;
        size_t offset = 0;
        size_t ret = 0;
        Serial.println("start send buf");
        while (1)
       {
          if(bufN==ready_buf)Serial.println("error");
           ret = client.write(buf + offset, size);
           offset += ret;
           size -= ret;
           if (ADC_BUF_SIZE == offset)
           {
              break;
           }  
       }
        sent_buf = ready_buf;
     }
     
    if(end_of_pac_flag == 1 and button_state == HIGH){
       client.print("\r\n\r\n");//end of message
       end_of_pac_flag = 0;
    }
     
}
 

enjoynering

Well-known member
На сколько мне известно на Wi'fi камере как раз и стоит PSRAM для железного кольцевого буфера.
 
Да должно и без нее успевать работать.8kHz 16 бит 1 семпл АЦП - это поток 128 килобит это смешной поток чтобы не успевать его передавать.Думаю работа АЦП с прерываниями сильно тормозит работу.Нужно замерить скорость передачи с АЦП и без все станет на свои места.
 
Сверху Снизу