отправка аудио через bluetooth a2dp источник esp32

Я пытаюсь отправить измеренный аналоговый сигнал i2s (например, с микрофона) на приемное устройство через Bluetooth вместо шума по умолчанию. В настоящее время я пытаюсь изменить bt_app_a2d_data_cb()

static int32_t bt_app_a2d_data_cb(uint8_t *data, int32_t i2s_read_len)
{
    if (i2s_read_len < 0 || data == NULL) {
        return 0;
    }

    char* i2s_read_buff = (char*) calloc(i2s_read_len, sizeof(char));

    bytes_read = 0;
    i2s_adc_enable(I2S_NUM_0);
    while(bytes_read == 0)
    {
    i2s_read(I2S_NUM_0,  i2s_read_buff, i2s_read_len,&bytes_read, portMAX_DELAY);
    }
    i2s_adc_disable(I2S_NUM_0);

// taking care of the watchdog//
    TIMERG0.wdt_wprotect=TIMG_WDT_WKEY_VALUE;
    TIMERG0.wdt_feed=1;
    TIMERG0.wdt_wprotect=0;

    uint32_t j = 0;
    uint16_t dac_value = 0;

// change 16bit input signal to 8bit 
    for (int i = 0; i < i2s_read_len; i += 2) {
        dac_value = ((((uint16_t) (i2s_read_buff[i + 1] & 0xf) << 8) | ((i2s_read_buff[i + 0]))));
        data[j] = (uint8_t) dac_value * 256 / 4096;
        j++;
    }

// testing for loop
    //uint8_t da = 0;
        //for (int i = 0; i < i2s_read_len; i++) {
        //  data[i] = (uint8_t) (i2s_read_buff[i] >> 8);//  & 0xff;
            //   da++;
           //  if(da>254) da=0;
        //}

    free(i2s_read_buff);
    i2s_read_buff = NULL;


    return i2s_read_len;
}

Я слышу звук пилообразного сигнала от устройства приемника. Есть идеи что делать?

Всего 1 ответ


ваши данные могут быть массивом некоторых чисел с плавающей запятой, представляющих аналоговые сигналы или вариации аналоговых сигналов, например, звуковой сигнал 32 кГц содержит 320000 чисел с плавающей запятой для определения захвата звука на каждую секунду. если ожидается, что ваши данные будут передаваться в автономном режиме, вы можете подготовить исходящие данные в виде буфера плюс знак терминатора, а затем отправить буфер через модуль Bluetooth устройства-отправителя, которое подключено к соответствующему микроконтроллеру. для принимающего устройства, если вы получили символ-терминатор, такой как " r", вы можете обработать входящий буфер, например, для моего случая, мне пришлось отправить массив строк, но я часто получал не более одного или двух неизвестных символов, и чтобы избежать этого, я отклонить его при выполнении получения контейнера.

как обрезать неизвестные первые символы строки в кодовом видении

если вы хотите это в режиме онлайн, т.е. ваши данные должны передаваться и воспроизводиться одновременно. Вы должны учитывать задержки и разумное время для обработки всех микроконтроллеров и устройств, таких как Bluetooth, EEprom iCs и ...


Есть идеи?

10000