Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: mp3 acc wma декодеры под cortex-m3
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2
Dron_Gus
Начал мучить железяку на LPC1768. Захотелось мне сделать плеер. Чтобы с периферией разобраться да и производительность оценить. Столкнулся с тем, что все основные декодеры того же mp3 имеют достаточно объемные вставки на асме. Все что нашел имеют порты пока что только под ARM7 (ARMv4) в режиме ARM. Естественно оно не собирается под ARMv7. Кто-нить знает, какой открытый проект уже портанулл свое произведение на Cortex?
Doka
а какая производительность декодирования у вас получается без портирования asm в thumb2, используя функциональные си-заглушки?
Dron_Gus
Написать бы эти заглушки. Я не настолько силен в алгоритмах и/или армовском ассемблере, чтобы их написать.
Doka
я так полагаю что под "основные декодеры того же mp3" понимается как - минимум libMAD - для РС-реализации разве в нём нету этих си-функций?
Dron_Gus
Спасибо. smile.gif Что-то я не подумал.
Пока нашел real-network'вский декодер, у него всего пара инлайн-функций. Они нормально компилятся и под cortex.

А вообще я нашел следующие декодеры: libmad, mpg123, ffmpeg, RealNetworks'овский.
Doka
так вроде у RealNetworkово тоже всё складненько:

Код
* polyphase.c - final stage of subband transform (polyphase synthesis filter)
* Look in the appropriate subdirectories for optimized asm implementations
*   (e.g. arm/asmpoly.s)

там же тоже можно собрать консольное Win32 приложение изпод ВижалСтудио

В любом случае, результат мне тоже интересен rolleyes.gif
AHTOXA
Цитата(Doka @ Nov 15 2009, 15:55) *
В любом случае, результат мне тоже интересен rolleyes.gif


+1. Ждём отчёта smile.gif
sadat
Есть на stm32 проектик, может, поможет....
http://www.stm32circle.com/projects/project.php?id=82
Dron_Gus
Спасибо!

Не хотят они меня регистрировать. А иначе файл не скачать. Он у Вас есть. На мыло не вышлете? dron_gusсобакамэилру
AHTOXA
Цитата(Dron_Gus @ Nov 21 2009, 01:28) *
файл не скачать


Нажмите на ссылку правой мышой и выберите "сохранить как" :-)
Dron_Gus
спасибо!

Однако. Давно я такой защиты не встречал. smile.gif
sonycman
Цитата(sadat @ Nov 20 2009, 23:10) *
Есть на stm32 проектик, может, поможет....
http://www.stm32circle.com/projects/project.php?id=82

Написано, что есть проблемы с битрейтом 320 kbps.
Чёрт, STMка не справляется.
Может, у LPC получится без "заиканий"?
defunct
Цитата(AHTOXA @ Nov 20 2009, 23:25) *
Нажмите на ссылку правой мышой и выберите "сохранить как" :-)

Чёй-то оно не того. сохраняет download.htm если так сделать. браузер - IE-7.
или уже прикрыли лавочку..
Может кто-нить зальет на ftp?
Dron_Gus
Цитата(sonycman @ Nov 21 2009, 01:50) *
Написано, что есть проблемы с битрейтом 320 kbps.
Чёрт, STMка не справляется.
Может, у LPC получится без "заиканий"?

Странно это. SAM7 справлялся с 320 кбит. А тут и попугаев больше и частота выше. Мне все никак не победить CrossStudio и не проверить толком.

Цитата(defunct @ Nov 21 2009, 02:57) *
Может кто-нить зальет на ftp?

Залил /upload/MCs/ARM/stm32/mp3/
sonycman
Цитата(Dron_Gus @ Nov 21 2009, 04:56) *
Странно это. SAM7 справлялся с 320 кбит. А тут и попугаев больше и частота выше. Мне все никак не победить CrossStudio и не проверить толком.

Значит, оптимизация кода плохая.

Вообще удивляет стремление людей во всякую мало мальскую поделку всовывать OS.
Чтобы потом возиться с её проблемами... sad.gif
defunct
Цитата(Dron_Gus @ Nov 21 2009, 02:56) *
Залил

спасибо beer.gif
VslavX
Цитата(sonycman @ Nov 21 2009, 11:45) *
Значит, оптимизация кода плохая.

Гм, похоже, что Cortex-M3 не имеет нормального аппаратного умножения - 32x32 возвращает только младший 32-битный огрызок. В MP3 самая ресурсоемкая часть - это выходное преобразование, а там умножений - "мама не горюй", и сейчас специально посмотрел - MAD старшими битами результата пользуется, также "в работе" умножение с накоплением. Поэтому добиться скорости сравнимой с ARM7 будет сложновато, ИМХО. Или я ошибаюсь и нормальное умножение есть и я его просто не нашел?
Dron_Gus
Судя по этому http://infocenter.arm.com/help/topic/com.a...QRC0001_UAL.pdf есть.
И по этому http://infocenter.arm.com/help/index.jsp?t...e/Chdbhfja.html .
Код
Multiply with 64-bit result    32    UMULL, SMULL, UMLAL, and SMLAL.
unsigned accumulate long UMLAL{S} RdLo, RdHi, Rm, Rs N Z C* V* RdHi,RdLo := unsigned(RdHi,RdLo + Rm * Rs)

Но это Thumb-2. CrossWork 1.* такой не умеет генерить. sad.gif
VslavX
Цитата(Dron_Gus @ Nov 24 2009, 22:20) *
Код
Multiply with 64-bit result    32    UMULL, SMULL, UMLAL, and SMLAL.
unsigned accumulate long UMLAL{S} RdLo, RdHi, Rm, Rs N Z C* V* RdHi,RdLo := unsigned(RdHi,RdLo + Rm * Rs)

Но это Thumb-2. CrossWork 1.* такой не умеет генерить. sad.gif

О, спасибо, а то я чего-то сразу в описании ARMv7 этого не нашел. Помню, что в обычном thumb-е нормального умножения не было, и расстроился что и на Cortex будет грустно, но как оказалось - все OK.
sonycman
А вообще какой смысл делать декодер силами контроллера?
Того же кортекса, к примеру?

Всё равно все ставят внешний чип - ЦАП?
В чём экономия по сравнению с внешним декодером?

А если воспользоваться родными ЦАПами кортекса?

Но всё равно было бы интересно запустить рабочий софтовый декодер. Правда, только если он ничем не будет уступать тому же VS1011 в плане поддержки битрейтов и качества звука...

ЗЫ: эх, вот если бы контроллеры класса кортексов имели на борту хоть какой нибудь DSP smile.gif
blackfin
Цитата(sonycman @ Nov 25 2009, 11:07) *
ЗЫ: эх, вот если бы контроллеры класса кортексов имели на борту хоть какой нибудь DSP smile.gif

"Какой-нибудь DSP": bf527c.. biggrin.gif
Dron_Gus
Цитата(sonycman @ Nov 25 2009, 11:07) *
А вообще какой смысл делать декодер силами контроллера?
Того же кортекса, к примеру?

Всё равно все ставят внешний чип - ЦАП?
В чём экономия по сравнению с внешним декодером?

А если воспользоваться родными ЦАПами кортекса?

Но всё равно было бы интересно запустить рабочий софтовый декодер. Правда, только если он ничем не будет уступать тому же VS1011 в плане поддержки битрейтов и качества звука...

Много вопросов. smile.gif

Свою цель я обозначил в начале топика. В сравнении с готовыми декодерами - большая гибкость и апгрейдо-пригодность. Я, например, хочу добавить flac. ЦАПы у этого Cortex'а, боюсь, отдыхают в сравнении с тем же tlv320aic23
sonycman
Цитата(blackfin @ Nov 25 2009, 12:17) *
"Какой-нибудь DSP": bf527c.. biggrin.gif

Ага, в 289 mini-BGA. Нафиг, нафиг biggrin.gif

Цитата(Dron_Gus @ Nov 25 2009, 12:28) *
Свою цель я обозначил в начале топика.

Ну и как, есть какие нибудь успехи в портировании софта?
Dron_Gus
Угу. Декодеры AAC и MP3 cобираются без проблем. ФС работает. Но вот при декодировании и того и того вылет в HardFault. Грешу на инициализацию дополнительных блоков памяти.
sonycman
Цитата(Dron_Gus @ Nov 25 2009, 14:03) *
Угу. Декодеры AAC и MP3 cобираются без проблем. ФС работает. Но вот при декодировании и того и того вылет в HardFault. Грешу на инициализацию дополнительных блоков памяти.

А декодер взяли от проекта на основе STM32?
Dron_Gus
И да и нет. smile.gif Декодер там RealNetworks'овский. Его еще немцы в своем плеере на sam7 использовали. Обертку я взял от немцев - удобная она.
sonycman
Цитата(Dron_Gus @ Nov 25 2009, 15:10) *
И да и нет. smile.gif Декодер там RealNetworks'овский. Его еще немцы в своем плеере на sam7 использовали. Обертку я взял от немцев - удобная она.

Ну а вставки в Thumb2 присутствуют?
Dron_Gus
Присутствуют, но не компилятся, кажется. Проект дома. Не помню уже. Кажется я заменил большуший исходник на асме аналогом на Си. smile.gif
Dron_Gus
Посмотрел. Компилятся. Надо бы проверить как они компилятся.
sonycman
То есть нормальных вставок в родном THUMB2 не получилось найти, или руки пока не дошли собрать?

Тоже интересно, что получится в результате.

А ось в проекте не присутствует случайно, как у немцев?
Dron_Gus
Цитата(sonycman @ Nov 25 2009, 23:00) *
То есть нормальных вставок в родном THUMB2 не получилось найти, или руки пока не дошли собрать?

Тоже интересно, что получится в результате.

А ось в проекте не присутствует случайно, как у немцев?

Вставки заменены сишными аналогами. Но самая ресурсоемкая процедура как раз в thimb2 - asmpoly_thumb2.s, взята из проекта от stm32. Вот ее надо проверить. Т.к. CS 1.7 вроде как не умеет thumb-2 и что там в итоге выходит - х.з., может он arm код генерирует.

Я пока не могу уделять этому занятию много времени, поэтому не знаю, когда будут результаты. Всем желающим могу отдать проект в его текущем состоянии (нерабочем smile.gif ).

Про ось запутался, про какой проект вы говорите. У stm'шников какая-то CircleOS. У немцев с sam7 (http://embdev.net/articles/ARM_MP3/AAC_Player) оси нет. Я вначале прикрутил freertos, потом открутил нафиг. smile.gif

З.Ы. а для CrossStudio 2.* клизмы еще нет?
zksystem
Цитата(Dron_Gus @ Nov 25 2009, 11:28) *
Свою цель я обозначил в начале топика. В сравнении с готовыми декодерами - большая гибкость и апгрейдо-пригодность. Я, например, хочу добавить flac. ЦАПы у этого Cortex'а, боюсь, отдыхают в сравнении с тем же tlv320aic23


Посмотрите на VS1053B:

Decodes multiple formats
Ogg Vorbis
MP3 = MPEG 1 & 2 audio layer III (CBR+VBR+ABR)
MP1 & MP2 = MPEG 1 & 2 audio layers I & II optional
MPEG4 / 2 AAC-LC(+PNS), HE-AAC v2 (Level 3) (SBR + PS)
WMA4.0/4.1/7/8/9 all profiles (5-384 kbps)
FLAC lossless audio with software plugin (upto 24 bits, 48 kHz)
WAV (PCM + IMA ADPCM)
General MIDI 1 / SP-MIDI format 0

Encodes three different formats from mic/line in mono or stereo
Ogg Vorbis with software plugin
IMA ADPCM
16-bit PCM
sonycman
Пока сделал декодер на чипе VLSI, но потом хочется собрать софтовый декодер.

Какие ЦАПы посоветуете использовать, кроме tlv320aic23?
Требования к качеству звука не шибко высокие, тем более, раз речь идёт об mp3.

Нет ли в природе буферизованных ЦАПов или кодеков, которые бы сами генерировали нужную частоту сэмплирования?

И что-то я не особо впечатлён возможностями генератора клока для I2S в STM32 (кроме новых чипов с отдельным PLL).
Тупой целочисленный делитель, необходимо подгонять кварц для более менее точного Fs.
Не сравнить с дробным делителем LPC17хх smile.gif
Dron_Gus
По второму вопросу tlv320aic23 умеет быть мастером. Думаю, Вы в курсе smile.gif Самый популярный вариант. Все остальные, которые знаю, клок генерировать не умеют.

Про I2C у STM'ов, а Вы их SPI пробовали? Тоже то еще. Видно захотели сильно универсальный модуль сделать да не вышло SPI master/SPI slave/I2S/и еще что-то однопроводное.
sonycman
Цитата(Dron_Gus @ Dec 23 2009, 23:55) *
По второму вопросу tlv320aic23 умеет быть мастером. Думаю, Вы в курсе smile.gif Самый популярный вариант. Все остальные, которые знаю, клок генерировать не умеют.

Про I2C у STM'ов, а Вы их SPI пробовали? Тоже то еще. Видно захотели сильно универсальный модуль сделать да не вышло SPI master/SPI slave/I2S/и еще что-то однопроводное.

Думаю поработать с tlv320dac23, он без ненужного мне АЦП, но мастером быть тоже умеет (есть у TI и более простые ЦАПы с таким режимом).

Но что-то особой пользы от мастера я не увидел. Внешний-то клок - MCLK - всё равно надо подавать снаружи, и подавать разный для разных частот сэмплирования (например, для Fs = 44.1 кГц- 11.289 МГц, а для Fs = 48 кГц - уже 12.288 МГц).
Имхо, проще будет сразу все частоты формировать контроллером... sad.gif

К SPI у меня претензий нет. Ну, кроме такого же "тупого" делителя (2^x) для SCLK. Но это и у конкурентов так.

А вот I2C у STM отвратительный. Громоздкий, да ещё и еррата кусается...
Dron_Gus
Цитата(sonycman @ Dec 23 2009, 23:43) *
Но что-то особой пользы от мастера я не увидел. Внешний-то клок - MCLK - всё равно надо подавать снаружи, и подавать разный для разных частот сэмплирования (например, для Fs = 44.1 кГц- 11.289 МГц, а для Fs = 48 кГц - уже 12.288 МГц).
Имхо, проще будет сразу все частоты формировать контроллером... sad.gif

К SPI у меня претензий нет. Ну, кроме такого же "тупого" делителя (2^x) для SCLK. Но это и у конкурентов так.

А вот I2C у STM отвратительный. Громоздкий, да ещё и еррата кусается...


А погрешности при 12 МГц кварце (usb mode) не устраивают?

SPI мне не понравился тем, что не умеет дергать CS (SS) после каждого байта. Да и после окончания передачи блока не дергает. Короче, как на sam7 приходится дергать руками.

На I2C я вообще забил. Проще ногами дергать, чем адекватно управлять их модулем.
adnega
Хм..
По I2C подключил дисплей TIC-154, на SPI SD/MMC-карта (правда, CS ручками дергаю), делал и развертку VGA-сигнала (640x480) через SPI на stm32f103t4 - из-за недостатка памяти только текстовый режим (а ля, просмотр отладочных сообщение через RS232/TTL).
Во всех реализациях проблем не имел - хотелось бы узнать какие есть проблемы (страшно ведь...)?
Dron_Gus
Цитата(adnega @ Dec 24 2009, 15:27) *
Хм..
По I2C подключил дисплей TIC-154, на SPI SD/MMC-карта (правда, CS ручками дергаю), делал и развертку VGA-сигнала (640x480) через SPI на stm32f103t4 - из-за недостатка памяти только текстовый режим (а ля, просмотр отладочных сообщение через RS232/TTL).
Во всех реализациях проблем не имел - хотелось бы узнать какие есть проблемы (страшно ведь...)?


Читайте еррату и апноты. По I2C нельзя послать 1 байт. Достатоно криво реализуется обработка исключительных ситуаций. У меня устройство с возможностью горячего подключения/отключения, так что для меня было критично.
По СПИ, кроме перечисленного, только 8/16 бит. ИМХО неудобно иногда.

З.Ы. раз у Вас все работает, переживать не стоит. smile.gif
З.З.Ы. мне все же привычней реализации этих модулей от Atmel & NXP.
sonycman
Цитата(Dron_Gus @ Dec 24 2009, 17:24) *
По I2C нельзя послать 1 байт.

Можно всё, по крайней мере на medium density девайсах.
Просто для 100% надёжности необходима реализация I2C через прерывания или DMA.

Цитата(Dron_Gus @ Nov 26 2009, 10:20) *
Я пока не могу уделять этому занятию много времени, поэтому не знаю, когда будут результаты. Всем желающим могу отдать проект в его текущем состоянии (нерабочем smile.gif ).

Ну а как прогресс с софтовым декодером? Есть результаты? wink.gif
Dron_Gus
Цитата(sonycman @ Dec 25 2009, 08:28) *
Ну а как прогресс с софтовым декодером? Есть результаты? wink.gif


Нет пока. Меня в командировку на севера на НГ хотят отправить, не до того. smile.gif
sergvks
Цитата(Dron_Gus @ Nov 25 2009, 14:10) *
Декодер там RealNetworks'овский. Его еще немцы в своем плеере на sam7 использовали.


Собирал этот декодер в кейле, для нормального декодирования на stm32 больших битрейтов приходилось разгонять проц до 96МГц ибо у STM32 дюже флеш тормознутый.
sonycman
Цитата(sergvks @ Dec 25 2009, 23:52) *
Собирал этот декодер в кейле, для нормального декодирования на stm32 больших битрейтов приходилось разгонять проц до 96МГц ибо у STM32 дюже флеш тормознутый.

Больших битрейтов - это каких?
А в декодере вставки на асме есть?
Наиболее юзабельные функции располагать в RAM пробовали?

Просто, после сообщений о том, что даже на тормозном SAM7S 320 kbps не лагает - слышать о проблемах на STM странновато...
sergvks
После кое-какой правки исходников я пришёл к тому, что находится во вложении.
sonycman
Спасибо!
Разбираться буду, когда начну след. проект, уже на LPC1768 smile.gif
Dron_Gus
Добил. Декодирование mp3 @ 256 на lpc1768 @ 100 MHz - 74..78%. CrossStudio 1.7, без оптимизации, thumb. Данные грузятся с sd-карты результат выпихивается через dma на tlv320.

Оптимизация O3 - mp3 @ 320 на lpc1768 @ 100 MHz - 28..30%. Либо я что-то не правильно мерю. Но underun'ов точно нет. Приведу проект в порядок - выложу.

Всех с наступившим Новым Годом. smile.gif Пусть у всех в Новом Году будет хватать времени заниматься хобби.
sonycman
Цитата(Dron_Gus @ Jan 2 2010, 03:16) *
Добил. Декодирование mp3 @ 256 на lpc1768 @ 100 MHz - 74..78%. CrossStudio 1.7, без оптимизации, thumb. Данные грузятся с sd-карты результат выпихивается через dma на tlv320.

Оптимизация O3 - mp3 @ 320 на lpc1768 @ 100 MHz - 28..30%. Либо я что-то не правильно мерю. Но underun'ов точно нет. Приведу проект в порядок - выложу.

Интересные результаты smile.gif
Имхо - без оптимизации не стоит компилировать вообще.

Не подскажете, какую методику можно использовать для замера занятости процессора?
Вот у вас - 70%... 30%... как это точно измерить?

Цитата
Пусть у всех в Новом Году будет хватать времени заниматься хобби.

И ещё бы не переводились деньги на любимое занятие.
Иногда это бывает весьма затратно biggrin.gif
Dron_Gus
Цитата(sonycman @ Jan 2 2010, 12:35) *
Не подскажете, какую методику можно использовать для замера занятости процессора?
Вот у вас - 70%... 30%... как это точно измерить?


Я использовал Repetitive Interrupt Timer. Перед началом воспроизведения сбрасываю и запускаю. Перед каждым вызовом декодирования запоминаю текущее значение таймера, после выхода из декодирования считаю количество затраченных тактов. Всё это суммирую и в конце делю на текущее значение таймера. Да, собсно, что рассказывать:
Код
void decode_start(void)
{
   d_start = RIT->RICOUNTER;
}

void decode_end(void)
{
   d_tot += RIT->RICOUNTER - d_start;
}

void play_start(void)
{
   //reset tottal decode time counter
   d_tot = 0;
   //reset
   RIT->RICOUNTER = 0;
   //start
   RIT->RICTRL = (1 << 0) |  //clear int flag
                 (0 << 1) |  //don't clear timer on equal
                 (1 << 2) |  //debug mode - halted on cpu halt
                 (1 << 3) |  //enable
                 (0);
}

void play_stop(void)
{
   unsigned int tot;
   //
   tot = RIT->RICOUNTER;
   //
   RIT->RICTRL &= ~(1 << 3); //stop counter
   //
   printf("Total ticks  = %d\r\n", tot);
   printf("Decode ticks = %d\r\n", d_tot);
   printf("Average load = %d %%\r\n", ((long long)d_tot * 100) / (long long)tot);
}

и
Код
    decode_start();
     err = MP3Decode(hMP3Decoder, &read_ptr, &bytes_left, dac_buffer[writeable_buffer], 0);
     decode_end();


Единственное, таймер лопатит на CCLK, поэтому болье 42 сек им считать нельзя. smile.gif
sonycman
Понятно, спасибо.

Лишь бы такая схема не считала "холостые" заходы в функцию, когда тратятся всего десятки тактов, но так как вызовы идут подряд из главного цикла, то суммирование этих тактов даст весомую погрешность, имхо...

А чем вы прошиваете/дебажите 1768?

Тоже вот заказал отладку с ним, и вот думаю, не поменять ли устаревший МТ-Линк v5 на что-либо получше.
Dron_Gus
Все эти измерения примерные. Но ложных входов быть не должно, т.к. данные готовятся до того и функция вызывается только когда есть место в выходном буфере.

Я дебажу МТ-Линком. Вполне устраивает. На работе с stm32 работаю u-link'ом для кортексов. Никаких преимуществ не заметил. Разве что второй умеет работать по 2 проводам, но пока дефицита ног не ощущаю. smile.gif Если отладка от отечественного производителя - то там точно полный j-tag разведен.
Dron_Gus
Выкладываю текущее состояние моей поделки.

Возникла непреодолимая проблема. Два кодека (mp3 и aac) не хотят компилироваться вместе. Ругаются на кучу redefine'ов. Может кто умный глянет? В текущем варианте включен mp3, чтобы добавить AAC надо глобально задефайнить ADD_AAC и включить в сборку ветку real-aac.

Заранее спасибо. smile.gif

Разобрался. Объектники от разных декодеров пересекались именами.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.