|
|
  |
mp3 acc wma декодеры под cortex-m3 |
|
|
|
Jan 2 2010, 09:35
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(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'ов точно нет. Приведу проект в порядок - выложу. Интересные результаты  Имхо - без оптимизации не стоит компилировать вообще. Не подскажете, какую методику можно использовать для замера занятости процессора? Вот у вас - 70%... 30%... как это точно измерить? Цитата Пусть у всех в Новом Году будет хватать времени заниматься хобби. И ещё бы не переводились деньги на любимое занятие. Иногда это бывает весьма затратно
|
|
|
|
|
Jan 2 2010, 09:43
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861

|
Цитата(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 сек им считать нельзя.
--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
|
|
|
|
|
Jan 5 2010, 00:00
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861

|
Выкладываю текущее состояние моей поделки. Возникла непреодолимая проблема. Два кодека (mp3 и aac) не хотят компилироваться вместе. Ругаются на кучу redefine'ов. Может кто умный глянет? В текущем варианте включен mp3, чтобы добавить AAC надо глобально задефайнить ADD_AAC и включить в сборку ветку real-aac. Заранее спасибо.  Разобрался. Объектники от разных декодеров пересекались именами.
--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
|
|
|
|
|
Jul 26 2010, 07:09
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 10-01-07
Из: Вильнюс
Пользователь №: 24 290

|
Цитата(sergvks @ Dec 26 2009, 08:59)  После кое-какой правки исходников я пришёл к тому, что находится во вложении. Попробовал впихнуть данный декодер (RealNetworks) в свой STM32f103RB (RAM 20 KB), просто так не лезет, попробовал указать #define MAX_NCHAN 1 (для моей задачи подходит моно), всё влезло, но при декоде 6 фрейма вылетает в HardFault_Handler из PolyphaseMono(). Заметил, что как-то странно изменяется sbi->vindex. Вопрос, собственно, в следующем: Как заставить работать данный декодер с моно МП3?
|
|
|
|
|
Jul 26 2010, 19:13
|

Местный
  
Группа: Свой
Сообщений: 481
Регистрация: 1-08-05
Пользователь №: 7 267

|
Цитата(OVladimir @ Jul 26 2010, 11:09)  Попробовал впихнуть данный декодер (RealNetworks) в свой STM32f103RB (RAM 20 KB), просто так не лезет, попробовал указать #define MAX_NCHAN 1 (для моей задачи подходит моно), всё влезло, но при декоде 6 фрейма вылетает в HardFault_Handler из PolyphaseMono(). Заметил, что как-то странно изменяется sbi->vindex. Вопрос, собственно, в следующем: Как заставить работать данный декодер с моно МП3? Возникает резонный вопрос: А на кой ляд для МОНО MP3? Это явно не проигрыватель для прослушивания аудио. А для "рупора" хватит всяческих ADPCM. Да и лицензионные ограничения не заботят...
|
|
|
|
|
Jul 27 2010, 04:48
|

embedder
  
Группа: Свой
Сообщений: 264
Регистрация: 11-05-05
Из: Казань
Пользователь №: 4 911

|
Цитата(goodwin @ Jul 26 2010, 23:13)  Возникает резонный вопрос: А на кой ляд для МОНО MP3? Это явно не проигрыватель для прослушивания аудио. А для "рупора" хватит всяческих ADPCM. Да и лицензионные ограничения не заботят... Может человеку необходимо качество звука высокое и большое сжатие файлов.
--------------------
Мечты стареют куда быстрее мечтателей… Стивен Кинг. "Ловец снов"
|
|
|
|
|
Jul 27 2010, 05:05
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 10-01-07
Из: Вильнюс
Пользователь №: 24 290

|
Цитата(goodwin @ Jul 26 2010, 21:13)  Возникает резонный вопрос: А на кой ляд для МОНО MP3? Это явно не проигрыватель для прослушивания аудио. А для "рупора" хватит всяческих ADPCM. Да и лицензионные ограничения не заботят... Действительно, задача состоит в том, чтобы проигрывать голосовые сообщения, которые может записывать сам пользователь при помощи компъютера и нехитрых действий. Так же ограничена память для хранения голосовой информации (несколько мегабит флэш, никаких СД). Опыта в аудио кодеках у меня нет, поэтому, сразу подумал про МП3. Может, посоветуете конкретный ADPCM декодер (заодно и кодер, хотя, это было бы лучше вынести в отдельную тему)? И всё-таки хотелось бы прочитать ответ о моно МП3.
|
|
|
|
|
Jul 27 2010, 06:04
|

embedder
  
Группа: Свой
Сообщений: 264
Регистрация: 11-05-05
Из: Казань
Пользователь №: 4 911

|
Цитата(OVladimir @ Jul 27 2010, 09:05)  Действительно, задача состоит в том, чтобы проигрывать голосовые сообщения, которые может записывать сам пользователь при помощи компъютера и нехитрых действий. Так же ограничена память для хранения голосовой информации (несколько мегабит флэш, никаких СД). Опыта в аудио кодеках у меня нет, поэтому, сразу подумал про МП3. Может, посоветуете конкретный ADPCM декодер (заодно и кодер, хотя, это было бы лучше вынести в отдельную тему)? И всё-таки хотелось бы прочитать ответ о моно МП3. Если Вы собираетесь изготавливать коммерческое устройство, то за mp3 придется платить лицензию. Лично я, в своих подобных устройствах, а именно, транспортных автоинформаторах использовал внешний декодер mp3, такой как VS1001K фирмы vlsi. Флеш память сейчас очень подешевела, поэтому, имхо проще сделать ADPCM или какой-нибудь SPEEX или FLAC
--------------------
Мечты стареют куда быстрее мечтателей… Стивен Кинг. "Ловец снов"
|
|
|
|
|
Jul 27 2010, 07:29
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 10-01-07
Из: Вильнюс
Пользователь №: 24 290

|
Цитата(zksystem @ Jul 27 2010, 08:04)  Если Вы собираетесь изготавливать коммерческое устройство, то за mp3 придется платить лицензию. Лично я, в своих подобных устройствах, а именно, транспортных автоинформаторах использовал внешний декодер mp3, такой как VS1001K фирмы vlsi. Флеш память сейчас очень подешевела, поэтому, имхо проще сделать ADPCM или какой-нибудь SPEEX или FLAC С лицензией разберёмся, VS1001K ставить не хочется (дополнительные деньги и место на плате, которая, к слову сказать, уже спроектирована и собрана), хочется оставить всё как есть и впихнуть МП3 в 20 КБ посредством настройки декодера. Покачто мысль дошла только до того, чтобы уменьшить максимальное число каналов с 2 до 1, тогда всё помещается, но не работает. Отсюда и вопрос, стоит ли возиться с уменьшением требуемого кол-ва РАМ и вообще, реально ли это сделать и каким образом? В конце концов есть вариант поставить процессор из той же линейки с большим РАМ, но этого делать тоже не хочется пока, бо STM32F103RB и STM32F103R8 уже закуплены.
|
|
|
|
|
Jul 28 2010, 08:43
|
Местный
  
Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188

|
Цитата(OVladimir @ Jul 27 2010, 09:05)  ...Может, посоветуете конкретный ADPCM декодер... Их навалом в Инете... Я один такой прикрутил к проекту на LPC23, выход - через АЦП. Вроде ничего звучит. Памяти требует - 4kB на секунду звука, RAMa - совсем немного.
|
|
|
|
|
Sep 5 2010, 11:55
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(Dron_Gus @ Jan 5 2010, 04:00)  Выкладываю текущее состояние моей поделки. Глубоко пока в исходниках не копался, вот думаю - какие буферы в памяти для воспроизведения MP3 нужны? Надумал вот что. Нужны два сэмпловых буфера по 1152 сэмпла на канал - один для распаковки текущего фрейма декодером, второй - для вывода из него звука по DMA на ЦАП. Какой ширины сэмплы формирует декодер в Вашем проекте? Контроллер у меня будет LPC1768, его I2S не может работать с 24 битными словами. Тут или 16 бит - но тогда в одном 32 битном слове должны быть сразу оба канала. Или 32 бита на сэмпл для каждого канала. Ну и один буфер для подгрузки текущего файла. Размер нужен такой, чтобы в него (желательно) помещался один фрейм целиком. Для 320 килобит это приблизительно 1100 байт. Так ли это? Ну и пока что не смотрел, сколько ОЗУ хочет непосредственно декодер уже кроме упомянутых выше буферов?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|