[Libmaple] Adafruit Mp3 Нативное декодирование с F103XC/D/E/F/G MCU

victor_pv
Солнце 25 марта 2018 г., 4:27
Я сделал его снимок и изменил библиотеку MP3 Adafruit, чтобы запустить в MCU F1 с 48 КБ или более интерфейса RAM и I2S.
Оригинал использовал таймер для запуска ISR на требуемой частоте и загружает 1 значение A A Time в ЦАП.
Я изменил его, чтобы он использовал периферийную машину I2S и одновременно загружает блок данных для передачи с DMA.
Мне нужно отправить пиар с модификациями в библиотеку SDIO, но SPI с SDFATEX тоже должен быть достаточно быстрым.
В настоящее время требуется ~ 11 мс для декодирования кадра из файла Stereo 44100 256 кбит / с mp3. Это генерирует 1152 образца. При этой скорости периферийное устройство i2s занимает 13 млд.
С файлом 22 кГц 64 кбит / с, для их воспроизведения требуется около 5 мс и 26 мс, так что это оставило 80% времени процессора доступным для чего -то другого.
Кроме того.
Библиотека I2S имеет несколько новых функций, не входящих в API ARDUINO, чтобы позволить эскизу напрямую доступ к буферу, и уведомить функцию обратного вызовов о том, было ли прерывание для полного переноса, чтобы DMA мог работать в круговом режиме с Без перерывов и просто вызовите функцию обратного вызова в эскизе, когда воспроизводится верхняя или нижняя половина буфера, поэтому эта половина может быть перезагружена с помощью новых данных.

Вот как сейчас работает модифицированный код:
========================
SETUP () будет читать указатель на буфер I2S и размер (в байтах, поэтому должен быть /2, чтобы получить размер в int16_t, который размер выборки из библиотеки MP3).
Далее он установит функцию обратного вызова в библиотеку I2S, вызванная DMA HT или TC прерывает триггер.
После этого он запускает периферийное устройство I2S в круговой режиме, поэтому все, что осталось, - это перезагрузить буфер данных при вызванном ISR.
Затем вызывает функцию воспроизведения библиотеки MP3. Это изменено, поэтому он больше не использует таймер. Вместо этого теперь проверяет, когда два внутренних буфера имеют место для 1 кадра (1152 образцов), и если да, декодирует кадр в буфере. Библиотека MP3 неоднократно вызывается в Loop () и просто проверяет, есть ли у буфера место для образцов, если нет, возвращает, и какой -то другой код пользователя может работать после него.
Когда I2S DMA запускает ISR, функция Sketch ISR проверит, какая половина буфера пуста, а затем вызовет новую функцию в библиотеке MP3, чтобы копировать данные из буфера MP3 в буфер i2S, и обновите некоторые переменные, чтобы указать Когда буфер полностью опустошен, затем возвращается.

Цикл вызовов в MP3 продолжает называться достаточно часто, чтобы продолжать загружать новые данные из SDCARD, а затем декодировать их в один из буферов.
Я добавил несколько фрагментов кода из библиотеки Mptry Teensy, чтобы немного увеличить скорость декодирования.

Код здесь:
https: // github.com/vicepropv/adafruit_mp3

Дальнейшие возможные оптимизации:
  • Используйте только 1 буфер, а I2S DMA читает из того же буфера, который библиотека MP3 пишет. Это устранило бы некоторые накладные расходы, и некоторое время, проведенное на копирование из одного буфера в другой, но копия не займет так много времени, так что это не критично. Основным преимуществом было бы сэкономить немного оперативной памяти.
  • Добавьте поддержку, чтобы использовать DACS. В идеале напишите библиотеку с API, похожим на I2S One, поэтому наброски работают на обоих
  • Дальнейшая скорость оптимизации. С 44100 Гц стереофайлы он занимает почти все декодирование времени процессора.

Мадиас
Солнце 25 марта 2018 г., 19:36
Просто +1 и «вау» на данный момент....нужно проверить это в следующие дни!

Rogerclark
Солнце 25 марта 2018 г. 9:07 вечера
Мне было интересно, как заменить мой iPod, когда он наконец не удается. Таким образом, создание одного, используя STM32, теперь является вариантом ;-)

Шутить в сторону,,,

Я все еще использую несколько старых iPod, но все они медленно умирают, и, поскольку Apple решает прекратить делать нано (с дисплеем) несколько лет назад, есть несколько приличных альтернатив.
Я пробовал несколько дешевых MP3 -плееры с eBay, но у всех были крупные программные, аппаратные или механические проблемы :-(

victor_pv
Солнце 25 марта 2018 11:33
[Rogerclark - Солнце 25 марта 2018 г., 21:07] - Мне было интересно, как заменить мой iPod, когда он наконец не удается. Таким образом, создание одного, используя STM32, теперь является вариантом ;-)

Шутить в сторону,,,

Я все еще использую несколько старых iPod, но все они медленно умирают, и, поскольку Apple решает прекратить делать нано (с дисплеем) несколько лет назад, есть несколько приличных альтернатив.
Я пробовал несколько дешевых MP3 -плееры с eBay, но у всех были крупные программные, аппаратные или механические проблемы :-(
Я на самом деле удивлен, что F1 может поддерживать темп, чтобы декодировать файл 44100. Мне нужно получить файл 320 кбит / с, 44100 кГц или более, и посмотреть, нажату ли я лимит. Но, честно говоря, любая Cortex M3 или M4 более 100 МГц, кажется, более чем достаточно для довольно приличного MP3 -плеер, используя SDCARD для хранения.
Интересно, есть ли у кого -нибудь из дешевых MP3 -плееров из Китая есть Cortex MCU, и он может быть взломан для открытого программного обеспечения... это сделало бы для хорошего аппаратного обеспечения.

Rogerclark
Пн 26 марта 2018 г. 12:04
Я не могу вспомнить, если я даже сохранил MP3 -плееры, которые я купил на eBay (из Китая)

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

Но, вероятно, стоит посмотреть еще раз, чтобы увидеть, есть ли у них конкретно STM32

Мадиас
Пн 26 марта 2018 г., 6:11
[victor_pv - Солнце 25 марта 2018 11:33] - Интересно, есть ли у кого -нибудь из дешевых MP3 -плееров из Китая есть Cortex MCU, и он может быть взломан для открытого программного обеспечения... это сделало бы для хорошего аппаратного обеспечения.
К сожалению: негатив. Они используют специальные фишки.
Дешевые, не отображающие что -то вроде этого:
https: // www.aliexpress.com/item/new-arr ... 49748.HTML
А те, у кого есть в основном чип MediaTek (например, на умных часах) старшие "RockChip"

Rogerclark
Пн 26 марта 2018 г., 20:00
Я искал ebay и aliexpress, но я не мог найти ни одного MP3 -игрока, используя STM32.

Вероятно, выделенные чипы более экономически эффективны (дешевле и лучшая производительность)

Проблема, которую я нахожу с этими платами MP3 -плееры (модули), заключается в том, что они не предназначены для управления MCU.

Afik, ни у кого из них нет API и подключения через i2c или spi.

У меня есть несколько более старых модулей звукового игрока с простым управляющим API, но они не поддерживают MP3, они используют специальный формат файла.


Это звучит идеально для платы таблеток F4, так как у нее есть SD, и, возможно, у F4 есть ЦАП, который может быть не слишком плохо...

AG123
Ср 28 марта 2018 г. 9:09
+1 прохладный ! :)

Мадиас
Чт 29 марта 2018 г. 9:59 утра
Хорошо, я действительно застрял на SDIO с моими *ret6 (и/или *ветеринарами) (без слотов SD-карт на борту).
Виктор: Wich Board вы используете для этого примера? Вы использовали внешний слот SD-карты? (Я думаю, что в режиме SDIO любая длина кабеля может быть неоптимальной)

victor_pv
Чт 29 марта 2018 13:27
Я использую новый BluePillf4, разработанный Squonk. У него есть разъем SDIO внизу.
Я отправил PR для библиотеки SDIO, которая добавляет скорость и совместимость с большим количеством карт. Похоже, что использует SDIO в F1 на полной скорости, нам могут понадобиться подтягивающие резисторы во всех линиях, но плата, которую я использую.
Обновите библиотеку с моего последнего PR и должен работать лучше. Вы используете аппаратный интерфейс SDIO справа?

Мадиас
Чт 29 марта 2018 г. 14:05
Я видел много конструктивных схем для SDIO, но я уверен, что вам нужны как можно более короткие соединения - поэтому «внешний» слот SD -карты с кабелями перемычки был бы только для проблем (гораздо больше, чем в стандартном режиме).
Я протестировал код в режиме SDFAT - только заикание -> как и ожидалось.
У меня есть эта доска в приостановке:
https: // www.aliexpress.com/item/free-sh ... 84907.HTML
Так что я подожду, пока он не будет доставлен, может быть, F4-даже лучшее решение, так как нам нужно i2s для воспроизведения mp3 и Zet Boards не дешевле, чем этот F407 один.
Таким образом, Sunlusio: MP3 на STMF103 может быть возможным, но вам нужно, по крайней мере, RET-Vet и на борту SDIO SD-карт слот, но F407 со всем на борту имеет одинаковую цену, если не дешевле....

victor_pv
Чт 29 марта 2018 г. 14:42
Если вы попытаетесь использовать его с портом SPI, используйте класс SDFATEX, это, вероятно, единственный, который может не отставать от скорости в режиме SPI.

Для SDIO используйте файлы из этого PR:
https: // github.com/vicopropv/arduino_stm ... SDIOF1.CPP
Это самые последние, которые я использую.

В случае проблем вы можете изменить библиотеку, чтобы использовать 1 -бит вместо 4 битов, комментируя эти строки: if (!cardAcmd(m_rca, ACMD6_XFERTYP, 2)) { return sdError(SD_CARD_ERROR_ACMD6); } sdio_set_dbus_width(SDIO_CLKCR_WIDBUS_4BIT);

AG123
Чт 29 марта 2018 г., 17:13
К сожалению, у Arm Cortex-M3 нет таких причудливых вещей, как Neon & Симд, в противном случае, может быть, нам нужно только дать -O100, и у нас были бы очень векторизованные коды параллельной обработки :ржу не могу:
Я думаю, что нам может повезло больше повезло с STM32F4, поскольку в дополнение к тому, что он является корой-м4
Прежде всего, M4 имеет 2x аппаратный FPU в двигателе
И у него есть тот художественный ускоритель, который немного похвастался & что это действительно дает этой 500 мощности лошадей MFLOPS :ржу не могу:
ViewTopic.PHP?f = 3&t = 76&начало = 160#p26942
Мы бы просто использовали для нее единую точку точности (аппаратное)
Это, вероятно, означает, что F4 может дать воспроизведение MP3 High Fidelity, которое конкурирует с рекламными роликами в пределах верхних или верхних игроков
[YouTube]https: // youtu.be/0etyfmamfjy[/youtube]

С другой стороны, мне интересно, насколько сложно/легко оптимизировать коды для трубопровода M3
http: // Infocenter.рука.com/help/topic/co ... Gjicf.HTML
Как казалось, что если трубопровод может быть полностью использован, он может создать иллюзию способности выполнять одну инструкцию за цикл, который дает >= 72 MIP, если это вообще возможно, но я думаю, что это только частично возможно, учитывая очень ограниченную оперативную память (кэш?) и выполнение из Flash
я.эн. Некоторые короткие сегменты кодов могут дать 72 MIP, но вещи более сложные могут быть трудно оптимизировать

victor_pv
Чт 29 марта 2018 г., 19:11
На самом деле декодер спирали использует только целые числа, без FP, поэтому FPU и даже SIMD не будут иметь большого значения.
Я применил все оптимизации (в основном код ассемблера) из версии Teensy, а Teensy-это кора-м4. Все работает так же.
Аклератор Art и специально работающий на 100 МГц или более определенно позволит запасной процессор для кода пользователя.
Но как есть, я использую DMA как для SDCARD, так и для SDIO, и ЦП в значительной степени просто делает декодирование, и у него нет проблем с файлами 44 кГц со скоростью 256 КБ.
Есть еще несколько оптимизаций, которые я мог бы сделать, чтобы перемещать данные с DMA, и даже читать и писать в некоторые буферы, чтобы избежать перемещения данных, но перемещение 512bytes датируется лишь несколькими нами, так что не будет много разницы.

Как это сейчас, декодирование рамы при скорости 44 кГц 256 КБ занимает около 11 мс, а игра в одном и том же кадре занимает 13 мс, так что у вас есть 2 мс из каждых 13 мс, чтобы сделать что -то еще, что вы хотите.
Я планирую поместить все это в задачи для Freertos, тогда вы можете оставить задачу с низким приоритетом, чтобы запустить что -либо еще, не влияя на игру.