I2S read () - это какой канал?

Ссылка Arduino I2S описывает стандарт I2S и функции, доступные со стандартной библиотекой I2S, (странно, что она не ссылается на существующую функцию read (), которая используется в примерах, но это не имеет значения). Существует также библиотека ArduinoSound, однако у меня есть та же проблема с этим.

Я хотел бы записывать аудио от WM8731, подключенного к Arduino. Я использую часть SAMD arduino.

Но у меня огромная проблема с функцией I2S.read (). Функция I2S.read() возвращает только сингулярное значение, однако стандарт I2S по своей сути стерео.

Это особенно важно для моего проекта, так как меня интересует только ЛЕВЫЙ канал, так как ПРАВЫЙ канал отключен.

Я бы ожидал, что это либо:

  • возвращает пару значений (т. е. слева /справа) образцов для данного конкретного момента времени ИЛИ
  • верните сингулярный образец с дополнительной информацией, сообщающей мне, из какого канала это было извлечено.

Однако, похоже, это не так. (Github)

Я также предполагаю, что I2S буферизован, что делает невозможным простое считывание состояния WS pin, так как я, вероятно, буду извлекать образец из буфера, который был помещен в буфер в какой-то момент в прошлом.

Итак, можно ли узнать, какой канал был возвращен из функции I2S.read (), или это означает, что библиотека должна быть изменена?

Я больше заинтересован в использовании библиотеки samd, так как другие библиотеки, такие как AudioLibrary, ограничены 16-битным разрешением - мне нужно 32-битное разрешение.

, 👍0


1 ответ


Лучший ответ:

0

Насколько я понимаю, это просто извлечение последующих выборок из буфера DMA, а это означает, что вы будете попеременно получать левые и правые выборки из каждого чтения. Было бы более нормальным использовать вариант read(buffer, len) для одновременного чтения двух (или более) выборок.

int16_t pair[2]; // change to int32_t for 32 bit samples
I2S.read(pair, sizeof(pair));
,

Спасибо. Это помогает, однако при использовании этого метода не будет ли все еще существовать возможность того, что каналы могут быть заменены? Будет ли это гарантировать, что первый член пары всегда будет ЛЕВЫМ или ПРАВЫМ (например)? Я нахожу, что документация, библиотека и примеры Arduino в этом отношении крайне отсутствуют, и, к моему удивлению, похоже, не касаются большинства людей в сообществе, @pm101

Вы всегда имеете дело со всем буфером dma, поэтому он всегда должен быть одинаковым., @Majenko

Спасибо, я проверил это, однако время от времени я получаю все слева, а иногда и все в порядке на паре[0] в зависимости от того, когда я *начинаю* читать. в чем моя главная проблема, @pm101

Я думаю, что часть проблемы заключается в том, что вся методология библиотеки несовершенна. У вас есть буферы для пинг-понга, управляемые DMA, которые постоянно получают данные, и вы *должны* обрабатывать весь буфер за меньшее время, чем требуется для заполнения другого буфера. Возможно, вам будет лучше использовать обратный вызов "onReceive ()" для запуска функции в момент замены буферов, в этот момент вы должны прочитать весь буфер целиком, иначе он остановится (судя по всему)., @Majenko

спасибо за помощь - вы, безусловно, поняли проблему, и ее стоит записать (без каламбура), чтобы другие знали об этом. На данный момент, поскольку для моего проекта требуется только один канал, я могу просто разделить один канал как на левый, так и на правый, так что в этом случае это не имеет значения, и я всегда буду читать один и тот же канал, независимо от того, однако это просто клейкая пластырь., @pm101