vasilius 1 20 марта Опубликовано 20 марта · Жалоба 1 час назад, repstosw сказал: Стр. 16 Но у меня работает. Возможно, свежая ревизия чипов, уже исправили эту несправедливость. Потому что частота семплирования 24 кГц более логична, чем 44.1 кГц, и тем более 88.2. И вообще всё кратное 8 - это хорошо! 24кГц это если перделку-свистелку делать... для стандартного аудио 20Гц-20кГц не подходит. Частота Найтквиста, теорема Котельникова в помощь... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 20 марта Опубликовано 20 марта · Жалоба 6 minutes ago, vasilius said: перделку-свистелку Именно это и создаётся. 🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 34 20 марта Опубликовано 20 марта · Жалоба 3 часа назад, vasilius сказал: 24кГц это если перделку-свистелку делать... Для голосового канала вполне пойдет, 11кГц на сколь помню там был верх... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 20 марта Опубликовано 20 марта · Жалоба 24кГц это если перделку-свистелку делать... для стандартного аудио 20Гц-20кГц не подходит... Для голосового канала вполне пойдет, 11кГц на сколь помню там был верх... 0.3 .. 3.4 кГц - телефонный канал. Так что 3-кратный оверсэмплинг - оч. хорошо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 21 марта Опубликовано 21 марта (изменено) · Жалоба Для речевого сигнала частота семплирования 24 кГц - это шикардос. Полосы 0..12 кГц хватает, чтобы слышать не "бу-бу-бу...", а вполне идентифицированный голос. Кодек CELT, мода 24 кбит/c, 50 байтов на сжатый семпл. Даже музыка удовлетворительно прослушиватся. P.S. В MELP2400 вообще Fs=8 кГц, и ничего, живут с этим. Зато сжатие колоссальное выходит. P.P.S. А вот всякие потрескивания и попискивания в аудиотракте из-за мгновенных просадок питающего напряжения и паразитного детектирования ВЧ-полей - я НЕ прощаю. Изменено 21 марта пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 22 марта Опубликовано 22 марта (изменено) · Жалоба Вопрос к гуру олвиннеро-строительства. Внешнее прерывание через GPIO. Нужно отлавливать прерывания по фронту и спаду (rising & falling edges). Сам обработчик прерывания работает исправно. Вопрос вот в чём: можно ли понять какое именно прерывание произошло: по фронту или спаду? Не нашёл такого регистра в GPIO. Может регистр GIC поможет? P.S. Вариант опроса по ножке GPIO_DAT не предлагать - он не работает, когда функция порта выбрана EINT. Изменено 22 марта пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 34 22 марта Опубликовано 22 марта (изменено) · Жалоба 1 час назад, repstosw сказал: Может регистр GIC поможет? Как он может помочь? Его задача отреагировать на сигнал запроса прерывания и все. Это функционал флагов портов, если их нет, то увы и ах... 1 час назад, repstosw сказал: Вариант опроса по ножке GPIO_DAT не предлагать - он не работает, когда функция порта выбрана EINT. В обработчике кратковременно снимать статус EINT, читать, потом восстанавливать снова, либо потратить еще одну ногу в параллель и с нее читать... Изменено 22 марта пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 22 марта Опубликовано 22 марта (изменено) · Жалоба 1 hour ago, repstosw said: P.S. Вариант опроса по ножке GPIO_DAT не предлагать - он не работает, когда функция порта выбрана EINT И снова здрасьте. Гляньте у меня. В проекте обслуживается оптический валкодер, прерывания по двум фронтам и получение состояния для грей декодера через чтение DAT работает. Без перепрограсмирований на лету и прочего кошмара. Для механики решил оставить опрос. Изменено 22 марта пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 34 22 марта Опубликовано 22 марта (изменено) · Жалоба 6 минут назад, GenaSPB сказал: чтение DAT работает. Согласен, тоже странным показалось, что не читает... Единственное, что может запрещать, это сигнал En_in, но тогда он и прерывания запретит. Изменено 22 марта пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 22 марта Опубликовано 22 марта (изменено) · Жалоба 6 hours ago, GenaSPB said: Гляньте у меня. В проекте обслуживается оптический валкодер, прерывания по двум фронтам и получение состояния для грей декодера через чтение DAT работает. Без перепрограсмирований на лету и прочего кошмара. Попробую. Результат напишу. Подключил микрофон ICS‐43434 к I2S от T113-s3. В итоге сделал Full-Duplex I2S: одновременно работает микрофон ICS‐43434 и усилитель MAX98357A. Несмотря на то, что устройства разные, работает идеально. Используются 2 DMA канала и 4 источника прерывания - Half/Full buffer для микрофона и усилителя. Порт I2S использую один - I2S1. Второй свободен (I2S0). У микрофона высокий динамический диапазон: Полностью избавился от аналога. Теперь не нужно никаких LDO ставить вообще! Изменено 22 марта пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 22 марта Опубликовано 22 марта (изменено) · Жалоба Чисто поворчать: прерывание на половине буфера и полное подсказывают, что речь о zero copy не идёт вообще. Попробуйте double buffer в виде двух закольцованных друг на друга дескрипторов и прерывание по концу пакета. В отработавшем дескрипторе подменять адрес буфера. Изменено 22 марта пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 24 марта Опубликовано 24 марта (изменено) · Жалоба On 3/23/2024 at 9:26 AM, GenaSPB said: прерывание на половине буфера и полное подсказывают, что речь о zero copy не идёт вообще. Zero copy было в самом начале. Действительно, не нужно ничего никуда копировать процессором , если DMA перебрасывает семплы с микрофона в буфер и сразу же с буфера в УНЧ. Но впоследствии понадобилось усиление (Digital Gain) + клиппинг , и пришлось делать это ручками в обработчике прерывания: #define SBS (32000/10) s16 IBuffer[SBS*2] __attribute__ ((aligned (64))); s16 OBuffer[SBS*2] __attribute__ ((aligned (64))); #define GAIN 4 s32 DMA_IRQ_Handler(void *arg) { #if DMA_I2SI_CHANNEL < 8 u32 s=DMA_IRQ_PEND_REG0; DMA_IRQ_PEND_REG0=s; #else u32 s=DMA_IRQ_PEND_REG1; DMA_IRQ_PEND_REG1=s; #endif s32 f; static u8 z=0; z|=s; if(z==0x11)f=0; else if(z==0x22)f=SBS; else f=-1; if(f!=-1) { cache_inv_range((u32)&IBuffer[f],((u32)&IBuffer[f])+(SBS*sizeof(TYPE))); for(int i=0;i<sizeof(OBuffer)/sizeof(s16)/2;i++)OBuffer[f+i]=__SSAT(((s32)IBuffer[f+i])*GAIN,16); cache_flush_range((u32)&OBuffer[f],((u32)&OBuffer[f])+(SBS*sizeof(TYPE))); z=0; } UART_putc(s+'0'); return 0; } On 3/23/2024 at 9:26 AM, GenaSPB said: Попробуйте double buffer в виде двух закольцованных друг на друга дескрипторов и прерывание по концу пакета. В отработавшем дескрипторе подменять адрес буфера. Такое тоже делал, работает. Мне без разницы какой метод использовать - два дескриптора + full buffer прерывание, или один дескриптор + два прерывания: half и full buffer. P.S. Вспомнил, в V3s когда буфер был в SRAM - работало только прерывание Full buffer. там и нужны были 2 дескриптора. С DDR работали оба прерывания(half/full). И здесь я уже об этом писал несколько лет назад в этой теме... Изменено 24 марта пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 24 марта Опубликовано 24 марта (изменено) · Жалоба Вопрос про DMA. Есть регистр TX_FIFO - он 32-битный, тип IO для DMA (адрес не инкрементируется). Есть буфер семплов в памяти - они 16-битные s16 Buffer[N]. Если сделать размер семпла I2S 16 бит, то DMA-транзакции с 16-битным шагом приращения источника и приёмника работают правильно. Если сделать размер семпла I2S 32 бит, то DMA-транзакции с 32-битным шагом приращения источника и приёмника работают правильно. Но если сделать размер семпла 32 бита, а DMA-транзакции с 16-битным шагом приращения источника и приемника, то работает неправильно - я слышу голос с цифровым хрустом, потому что в TX_FIFO попадает 2 записи с буфера - одна в его младшую часть, другая в старшую. Проверяется это путём зануления всех четных байт в буфере семплов. Собственно вопрос: можно ли сделать так, чтобы при копировании DMA, запись с буфера семплов шла только в младшую шасть регистра TX_FIFO, а старшая часть регистра игнорировалась? Это нужно для того, чтобы сделать I2S семплы 32-битными(или 24-битными), шина общая. Микрофон поддерживает 24- и 32-битные семплы, а усилитель - 16 битные семплы. Чтобы сэкономить память на усилитель (16-битные семплы), а память на микрофон была 32 битной (для поднятия усиления, младшие биты сдвинутся влево в старншие, без потери точности при усилении). Изменено 24 марта пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 24 марта Опубликовано 24 марта · Жалоба Вообще-то в i2s размеп фрейма может быть больше чем используемре кроичкство бит. Попроьбкйте скормить усиоителю больше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 24 марта Опубликовано 24 марта (изменено) · Жалоба 35 minutes ago, GenaSPB said: Вообще-то в i2s размеп фрейма может быть больше чем используемре кроичкство бит. Попроьбкйте скормить усиоителю больше. Вообще-то я так и сделал. Теперь стоит задача подрезать буфер до 16 бит на семпл, чтобы сэкономить память, при этом сохранив семплы, оставив их 32 битными из-за микрофона. Важно, не то, что я кормлю усилителю, а то, как это хранится в памяти: я хочу чтобы это были 16-битные семплы без лишнего старшего полу-слова с нулями. Увы, I2S не может делать разрядность семпла приёма и передачи разными - только одинаковые. Я хочу, чтобы семплы для усилителя брались с младших 16 бит TX_FIFO, а с микрофона записывались 32-битные семплы из RX_FIFO. Таким образом, иметь 16-битный буфер для усилителя и 32-битный буфер с микрофона. MAX98357A в действии. Вместе с 2-ваттной мини-колонкой 8 Ом: Изменено 24 марта пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться