реклама на сайте
подробности

 
 
9 страниц V  « < 7 8 9  
Reply to this topicStart new topic
> STM32 mp3 playback
AHTOXA
сообщение Dec 17 2011, 16:04
Сообщение #121


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Ну что ж, очень радостно слышатьsm.gif
Надо будет попробовать...


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
skripach
сообщение Apr 8 2013, 14:21
Сообщение #122


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Приветствую!
Добавил к проекту Helix MP3 декодер, всё здорово работает, ресурсов хватает, но есть один неприятный момент когда останавливаю декодирование в призвольном месте и запускаю новый трек то вначеле воспроизведения слышны "остатки" предыдущего трека. Свои буферы я сбрасываю, - это где-то в самом декодере.
Как с этим бороться?


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
Jhonny.
сообщение Apr 13 2013, 14:13
Сообщение #123


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 23-11-08
Пользователь №: 41 876



Подскажите пожалуйста, как скачать код с helixcommunity.org?
Go to the top of the page
 
+Quote Post
kan35
сообщение Apr 14 2013, 15:11
Сообщение #124


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



skripach,
Я думаю самый надежный способ удалять созданный плеер каждый раз при прерывании звука, а перед запуском нового звука создавать снова.

Цитата(Jhonny. @ Apr 13 2013, 18:13) *
Подскажите пожалуйста, как скачать код с helixcommunity.org?

https://player.helixcommunity.org/2005/downloads/
Архивчики плеера в правой колонке. После скачивания найдете в папках и mp3 плеер и много чего еще.
Go to the top of the page
 
+Quote Post
Sergey_Aleksandr...
сообщение Sep 22 2013, 20:09
Сообщение #125


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



Здравствуйте. Пытаюсь в своём проекте реализовать воспроизведение mp3 на базе helix-декодера. Звук вывел уже на второй день работы, третью неделю не могу решить проблемы с производительностью. На 72 МГц всё процессорное время уходит на проигрывание 44,1 кГц стерео. Привожу время полного декодирования фрейма для разного битрейта на 44.1 кГц. Непосредственно функция MP3Decode() выполняется на 2..3 мс меньше. Для времени воспроизведения фрейма в 26,12 мс выходит, что кодек "тянет" только аудио с битрейтом 128 кбит/с. Файлы с более высоким битрейт вплоть до 320 играются с искажениями (на слух почти не уловимыми).
Контроллер STM32F105. AHB на 72 МГц (проверено), APB на 36 МГц. Тело mp3 хранится во встроенной Flash, декодирование и вывод через пинг-понг буфер, вывод через DMA в ЦАП. ОС не использую, суперлуп. Прерывания только от DMA ЦАП ,SysTIck и UART (отладочный порт).

Буфера для декодирования фрейма статические, динамическую память не использую, стек на время тестов раздул до 2 кБайт. Компилятор IAR ARM 6.50.
Что делал:
1. Задрал уровень оптимизации компилятора до максимального по скорости. Выиграл не более 10%. Отпадает.
2. Грешил на медленный доступ ко Flash, сократил число циклов ожидания доступа до 1 (такой оверклокинг). Производительность возросла ~5%. Мимо.
3. Исследовал функции из ассемблерного "asmmisc.s", время выполнения MULSHIFT32() и FASTABS() относительно сильно, но не так критически влияет на скорость работы. Мимо. Полифазный фильтр в "asmpoly_thumb2.s " взял как есть без переделок (правил только синтаксис с gcc на IAR), т.е. как у всех.
4. Явно указал на необходимость встраивания inline-функций через #pragma inline
5. mp3-файл менял на другой (думал, может кривой фрагмент попался). Не помогло.

Анализируя опыт разработчиков с этого и с других сторонних ресурсов, понимаю, что производительность должна быть в 2 раза выше. Буду благодарен за любую помощь и советы. Не хочется из-за собственной ошибки переходить на 20х семейство.

upd прикрепил два asm-файла (копирайт от RealNetworks удалил для экономии места), грешу всё-таки на них. Может кто сравнить со своими в IAR-проекте?
asmmisc.s
CODE


REQUIRE8
PRESERVE8

SECTION .text:CODE:NOROOT(2)
PUBLIC MULSHIFT32
THUMB
MULSHIFT32
smull r2, r0, r1, r0
//mov pc, lr // KJ changed to BX for Cortex
BX lr



SECTION .text:CODE:NOROOT(2)
PUBLIC FASTABS
THUMB
FASTABS
mov r1, r0
mov r0, #0x0
eor r0, r1, r1, asr # 31
sub r0, r0, r1, asr # 31
bx lr

END


asmpoly_thumb2.s
CODE


#define PCM r0
#define VB1 r1
#define COEF r2
; must push PCM ptr to stack during inner looop
#define VLO r0
; temp variable
#define VHI r3

#define SUM1LL r4
#define SUM1LH r5
#define SUM2LL r6
#define SUM2LH r7
#define SUM1RL r8
#define SUM1RH r9
#define SUM2RL r10
#define SUM2RH r11

#define CF1 r12
#define CF2 r14

; used for clipping - after discarding CF1
#define SIGN r12
; used for clipping - after discarding CF2
#define MAXPOS r14
; overlay loop counter with CF1, SIGN
#define I r12



#define RNDVAL (1 << ((32 - 12) + (6 - 1)))

/*; C64TOS - clip 64-bit accumulator to short (no rounding)
; xl, xh = value (lo 32, hi 32)
; input assumed to have 6 fraction bits
; sign = temp variable to use for sign
; maxPos = 0x00007fff (takes 2 instr. to generate - calculating
; once and using repeatedly saves if you do several CTOS in a row) */
C64TOS MACRO _xl, _xh, _sign, _maxPos
mov _xl, _xl, lsr #(20+6)
orr _xl, _xl, _xh, lsl #(12-6)
mov _sign, _xl, ASR #31
cmp _sign, _xl, ASR #15
it ne
eorne _xl, _sign, _maxPos
ENDM ; C64TOS

/* ; MC0S - process 2 taps, 1 sample per channel (sample 0) */
/* ; x = vb1 offset */
MC0S MACRO val_x
ldr CF1, [COEF], #4
ldr CF2, [COEF], #4
ldr VLO, [VB1, #(4*(val_x))]
ldr VHI, [VB1, #(4*(23 - val_x))]

smlal SUM1LL, SUM1LH, VLO, CF1
ldr VLO, [VB1, #(4*(32 + val_x))]
rsb CF2, CF2, #0
smlal SUM1LL, SUM1LH, VHI, CF2
ldr VHI, [VB1, #(4*(32 + 23 - val_x))]

smlal SUM1RL, SUM1RH, VLO, CF1
smlal SUM1RL, SUM1RH, VHI, CF2
ENDM ;MC0S

/* ; MC1S - process 2 taps, 1 sample per channel (sample 16)
; x = vb1 offset */
MC1S MACRO val_x
ldr CF1, [COEF], #4
ldr VLO, [VB1, #(4*(val_x))]
ldr VHI, [VB1, #(4*(32 + val_x))]
smlal SUM1LL, SUM1LH, VLO, CF1
smlal SUM1RL, SUM1RH, VHI, CF1
ENDM ;MC1S

/* ; MC2S - process 2 taps, 2 samples per channel
; x = vb1 offset */
MC2S MACRO val_x
/* ; load data as far as possible in advance of using it */
ldr CF1, [COEF], #4
ldr CF2, [COEF], #4
ldr VLO, [VB1, #(4*(val_x))]
ldr VHI, [VB1, #(4*(23 - val_x))]

smlal SUM1LL, SUM1LH, VLO, CF1
smlal SUM2LL, SUM2LH, VLO, CF2
rsb CF2, CF2, #0
smlal SUM2LL, SUM2LH, VHI, CF1
smlal SUM1LL, SUM1LH, VHI, CF2

ldr VHI, [VB1, #(4*(32 + 23 - val_x))]
ldr VLO, [VB1, #(4*(32 + val_x))]

smlal SUM1RL, SUM1RH, VHI, CF2
smlal SUM2RL, SUM2RH, VHI, CF1
rsb CF2, CF2, #0
smlal SUM1RL, SUM1RH, VLO, CF1
smlal SUM2RL, SUM2RH, VLO, CF2
ENDM ;MC2S








/* ; void PolyphaseStereo(short *pcm, int *vbuf, const int *coefBase) */
SECTION .text:CODE:NOROOT(2)
PUBLIC xmp3_PolyphaseStereo
THUMB
xmp3_PolyphaseStereo:

stmfd sp!, {r4-r11, r14}

/* ; clear out stack space for 2 local variables (4 bytes each) */
sub sp, sp, #8
str PCM , [sp, #4] /*; sp[1] = pcm pointer */

/* ; special case, output sample 0 */
mov SUM1LL, #RNDVAL /* ; load rndVal (low 32) */
mov SUM1RL, #RNDVAL /* ; load rndVal (low 32) */
mov SUM1LH, #0
mov SUM1RH, #0

MC0S 0
MC0S 1
MC0S 2
MC0S 3
MC0S 4
MC0S 5
MC0S 6
MC0S 7

ldr PCM, [sp, #4] /* ; load pcm pointer */
mov MAXPOS, #0x7f00
orr MAXPOS, MAXPOS, #0xff

C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS
C64TOS SUM1RL, SUM1RH, SIGN, MAXPOS

strh SUM1LL, [PCM, #(2*0)]
strh SUM1RL, [PCM, #(2*1)]

/* ; special case, output sample 16 */
add COEF, COEF, #(4*(256-16)) /* ; coef = coefBase + 256 (was coefBase + 16 after MC0S block) */
add VB1, VB1, #(4*1024) /* ; vb1 = vbuf + 64*16 */

mov SUM1LL, #RNDVAL /* ; load rndVal (low 32) */
mov SUM1RL, #RNDVAL /* ; load rndVal (low 32) */
mov SUM1LH, #0
mov SUM1RH, #0

MC1S 0
MC1S 1
MC1S 2
MC1S 3
MC1S 4
MC1S 5
MC1S 6
MC1S 7

ldr PCM, [sp, #4] /* load pcm pointer */
mov MAXPOS, #0x7f00
orr MAXPOS, MAXPOS, #0xff

C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS
C64TOS SUM1RL, SUM1RH, SIGN, MAXPOS

strh SUM1LL, [PCM, #(2*(2*16+0))]
strh SUM1RL, [PCM, #(2*(2*16+1))]

/*; main convolution loop: sum1L = samples 1, 2, 3, ... 15 sum2L = samples 31, 30, ... 17 */
sub COEF, COEF, #(4*(264-16)) /* ; coef = coefBase + 16 (was coefBase + 264 after MC1S block) */
sub VB1, VB1, #(4*(1024-64)) /* ; vb1 = vbuf + 64 (was vbuf + 64*16 after MC1S block) */
mov I, #15 /* ; loop counter, count down */
add PCM, PCM, #(2*2) /* ; pcm+=2 */

LoopPS:
str I, [sp, #0] /* ; sp[0] = i (loop counter) */
str PCM, [sp, #4] /* ; sp[1] = pcm (pointer to pcm buffer) */

mov SUM1LL, #RNDVAL /* ; load rndVal (low 32) */
mov SUM1RL, #RNDVAL /* ; load rndVal (low 32) */
mov SUM2LL, #RNDVAL /* ; load rndVal (low 32) */
mov SUM2RL, #RNDVAL /* ; load rndVal (low 32) */

mov SUM1LH, #0
mov SUM1RH, #0
mov SUM2LH, #0
mov SUM2RH, #0

MC2S 0
MC2S 1
MC2S 2
MC2S 3
MC2S 4
MC2S 5
MC2S 6
MC2S 7

add VB1, VB1, #(4*64) /*; vb1 += 64*/

ldr PCM, [sp, #4] /*; load pcm pointer*/
mov MAXPOS, #0x7f00
orr MAXPOS, MAXPOS, #0xff

C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS
C64TOS SUM1RL, SUM1RH, SIGN, MAXPOS
C64TOS SUM2LL, SUM2LH, SIGN, MAXPOS
C64TOS SUM2RL, SUM2RH, SIGN, MAXPOS

ldr I, [sp, #0] /*; load loop counter*/
add CF2, PCM, I, lsl #3 /*; CF2 = PCM + 4*i (short offset)*/
strh SUM2LL, [CF2], #2 /*; *(pcm + 2*2*i + 0)*/
strh SUM2RL, [CF2], #2 /*; *(pcm + 2*2*i + 1)*/

strh SUM1LL, [PCM], #2 /*; *(pcm + 0)*/
strh SUM1RL, [PCM], #2 /*; *(pcm + 1)*/

subs I, I, #1
bne LoopPS

/* ; restore stack pointer*/
add sp, sp, #8

ldmfd sp!, {r4-r11, pc}
/* ENDFUNC*/















/*;; MONO PROCESSING*/

/*; MC0M - process 2 taps, 1 sample (sample 0)*/
/*; x = vb1 offset*/
MC0M MACRO val_x
ldr CF1, [COEF], #4
ldr CF2, [COEF], #4
ldr VLO, [VB1, #(4*(val_x))]
ldr VHI, [VB1, #(4*(23 - val_x))]

rsb CF2, CF2, #0
smlal SUM1LL, SUM1LH, VLO, CF1
smlal SUM1LL, SUM1LH, VHI, CF2
ENDM ;MC0M


/*; MC1M - process 2 taps, 1 sample (sample 16)*/
/*; x = vb1 offset*/
MC1M MACRO val_x
ldr CF1, [COEF], #4
ldr VLO, [VB1, #(4*(val_x))]
smlal SUM1LL, SUM1LH, VLO, CF1
ENDM ;MC1M


/* ; MC2M - process 2 taps, 2 samples*/
/* ; x = vb1 offset*/
MC2M MACRO val_x
/* ; load data as far as possible in advance of using it*/
ldr CF1, [COEF], #4
ldr CF2, [COEF], #4
ldr VLO, [VB1, #(4*(val_x))]
ldr VHI, [VB1, #(4*(23 - val_x))]

smlal SUM1LL, SUM1LH, VLO, CF1
smlal SUM2LL, SUM2LH, VLO, CF2
rsb CF2, CF2, #0
smlal SUM1LL, SUM1LH, VHI, CF2
smlal SUM2LL, SUM2LH, VHI, CF1
ENDM ;MC2M



/*; void PolyphaseMono(short *pcm, int *vbuf, const int *coefBase)*/
SECTION .text:CODE:NOROOT(2)
PUBLIC xmp3_PolyphaseMono
THUMB
xmp3_PolyphaseMono:

stmfd sp!, {r4-r11, r14}

/*; clear out stack space for 4 local variables (4 bytes each)*/
sub sp, sp, #8
str PCM, [sp, #4] /*; sp[1] = pcm pointer*/

/* ; special case, output sample 0*/
mov SUM1LL, #RNDVAL /* ; load rndVal (low 32)*/
mov SUM1LH, #0

MC0M 0
MC0M 1
MC0M 2
MC0M 3
MC0M 4
MC0M 5
MC0M 6
MC0M 7

ldr PCM, [sp, #4] /*; load pcm pointer*/
mov MAXPOS, #0x7f00
orr MAXPOS, MAXPOS, #0xff

C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS
strh SUM1LL, [PCM, #(2*0)]

/* ; special case, output sample 16*/
add COEF, COEF, #(4*(256-16)) /* ; coef = coefBase + 256 (was coefBase + 16 after MC0M block)*/
add VB1, VB1, #(4*1024) /* ; vb1 = vbuf + 64*16*/

mov SUM1LL, #RNDVAL /* ; load rndVal (low 32)*/
mov SUM1LH, #0

MC1M 0
MC1M 1
MC1M 2
MC1M 3
MC1M 4
MC1M 5
MC1M 6
MC1M 7

ldr PCM, [sp, #4] /* ; load pcm pointer*/
mov MAXPOS, #0x7f00
orr MAXPOS, MAXPOS, #0xff

C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS

strh SUM1LL, [PCM, #(2*16)]

/* ; main convolution loop: sum1L = samples 1, 2, 3, ... 15 sum2L = samples 31, 30, ... 17*/
sub COEF, COEF, #(4*(264-16)) /* ; coef = coefBase + 16 (was coefBase + 264 after MC1M block)*/
sub VB1, VB1, #(4*(1024-64)) /* ; vb1 = vbuf + 64 (was vbuf + 64*16 after MC1M block)*/
mov I, #15 /* ; loop counter, count down*/
add PCM, PCM, #(2) /* ; pcm++*/

LoopPM:
str I, [sp, #0] /* ; sp[0] = i (loop counter)*/
str PCM, [sp, #4] /* ; sp[1] = pcm (pointer to pcm buffer)*/

mov SUM1LL, #RNDVAL /* ; load rndVal (low 32)*/
mov SUM2LL, #RNDVAL /* ; load rndVal (low 32)*/
mov SUM1LH, #0
mov SUM2LH, #0

MC2M 0
MC2M 1
MC2M 2
MC2M 3
MC2M 4
MC2M 5
MC2M 6
MC2M 7

add VB1, VB1, #(4*64) /*; vb1 += 64*/

ldr PCM, [sp, #4] /*; load pcm pointer*/
mov MAXPOS, #0x7f00
orr MAXPOS, MAXPOS, #0xff

C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS
C64TOS SUM2LL, SUM2LH, SIGN, MAXPOS

ldr I, [sp, #0] /*; load loop counter*/
add CF2, PCM, I, lsl #2 /*; CF2 = PCM + 2*i (short offset)*/
strh SUM2LL, [CF2], #2 ; /**(pcm + 2*i + 0)*/
strh SUM1LL, [PCM], #2 ; /**(pcm + 0) ; pcm++*/

subs I, I, #1
bne LoopPM
/* ; restore stack pointer*/
add sp, sp, #8
ldmfd sp!, {r4-r11, pc}


END

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
kan35
сообщение Sep 23 2013, 18:56
Сообщение #126


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Я делал эти функции в Сишном виде. Где то 40-50% ресурсов отъедал под FreeRTOS. Сделайте следующее: возьмите фрагмент и декодируйте его на скорость, без выдачи в ЦАП. Я думаю, у вас проблемы где то в процедурах выдачи звука.
Go to the top of the page
 
+Quote Post
Sergey_Aleksandr...
сообщение Sep 26 2013, 12:16
Сообщение #127


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



Цитата(kan35 @ Sep 23 2013, 22:56) *
Сделайте следующее: возьмите фрагмент и декодируйте его на скорость, без выдачи в ЦАП.

Сделал. На декодирование 177 фреймов 320 kbits стерео при medium оптимизации затрачено 4.712 с, т.е. в среднем 26.6 мс на фрейм. Сижу, ищу наиболее ресурсоотжирающий кусок алгоритма. Не в выводе дело.


Прикрепленное изображение

Функция MP3Decode() из "mp3dec.c". Один фрейм состоит из двух гранул.
Участок A 1,25 мс. Относительно быстро
CODE
for (ch = 0; ch < mp3DecInfo->nChans; ch++)
{
// unpack scale factors and compute size of scale factor block
prevBitOffset = bitOffset;
offset = UnpackScaleFactors(mp3DecInfo, mainPtr, &bitOffset, mainBits, gr, ch);

sfBlockBits = 8*offset - prevBitOffset + bitOffset;
huffBlockBits = mp3DecInfo->part23Length[gr][ch] - sfBlockBits;
mainPtr += offset;
mainBits -= sfBlockBits;

if (offset < 0 || mainBits < huffBlockBits)
{
MP3ClearBadFrame(mp3DecInfo, outbuf);
return ERR_MP3_INVALID_SCALEFACT;
}
// decode Huffman code words
prevBitOffset = bitOffset;
offset = DecodeHuffman(mp3DecInfo, mainPtr, &bitOffset, huffBlockBits, gr, ch);
if (offset < 0)
{
MP3ClearBadFrame(mp3DecInfo, outbuf);
return ERR_MP3_INVALID_HUFFCODES;
}
mainPtr += offset;
mainBits -= (8*offset - prevBitOffset + bitOffset);
}


Участок B 1,25 мс. Относительно быстро
Код
        if (Dequantize(mp3DecInfo, gr) < 0)
        {
            MP3ClearBadFrame(mp3DecInfo, outbuf);
            return ERR_MP3_INVALID_DEQUANTIZE;            
        }


Участок C 3,5 мс. Антиалайзинговый фильтр и пр. Относительно долго
Код
        for (ch = 0; ch < mp3DecInfo->nChans; ch++)
        {
            if (IMDCT(mp3DecInfo, gr, ch) < 0)
            {
                MP3ClearBadFrame(mp3DecInfo, outbuf);
                return ERR_MP3_INVALID_IMDCT;            
            }
        }


Участок D 6,25 мс. Самый долгий участок алгоритма. Как раз он использует ассемблерный модуль asmpoly_thumb2.s
Код
        if (Subband(mp3DecInfo, outbuf + gr*mp3DecInfo->nGranSamps*mp3DecInfo->nChans) < 0)
        {
            MP3ClearBadFrame(mp3DecInfo, outbuf);
            return ERR_MP3_INVALID_SUBBAND;            
        }



Получается, что либо число гранул должно быть 1 вместо двух, либо время выполнения каждого из приведённых выше участков декодера должно быть в раза меньше.
Go to the top of the page
 
+Quote Post
kan35
сообщение Sep 26 2013, 15:19
Сообщение #128


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Уберите из проекта асемблерный файл,так как вероятно в нем проблема(Откуда он? в пакете руддшч с оффиц. сайта я не наблюдал). И подключите другой с Сишными с теми же функциями:
CODE

static inline int MULSHIFT32(int x, int y)
{
return (((long long)x)*((long long)y))>>32;
}

static inline int FASTABS(int x)
{
int sign;

sign = x >> (sizeof(int) * 8 - 1);
x ^= sign;
x -= sign;

return x;
}

static inline int CLZ(int x)
{
int numZeros;

if (!x)
return (sizeof(int) * 8);

numZeros = 0;
while (!(x & 0x80000000)) {
numZeros++;
x <<= 1;
}

return numZeros;
}

static inline Word64 MADD64(Word64 sum, int x, int y)
{
return (sum + ((Word64)x * y));
}

static inline Word64 SAR64(Word64 sum, int x)
{
return (sum >> x);
}


И еще, точно ли у вас работает контролер на 72МГц?
Go to the top of the page
 
+Quote Post
Sergey_Aleksandr...
сообщение Sep 27 2013, 13:18
Сообщение #129


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



kan35, спасибо большое Вам, что оказываете мне поддержку. Очень признателен.

1. Частота AHB точно 72 МГц. Сигнал выведен на MCO, смотрю его осциллографом.
2. Ассемблерные файлы брал из проекта CircleOS http://www.stm32circle.com/projects/project.php?id=82. Правил синтаксис под IAR. Этот проект частенько на страницах форума фигурирует. Однако пишут, что производительность на 320 кбит/с у него не очень
Цитата
The implementation makes it possible to listen to most common variants of MP3. 320kbit files can have small problems due to speed of the microcontroller.

3. Убрал ассемблерные файлы, подключил "polyphase.c", использовал Ваши встроенные функции (указал на принудительное встраивание через #pragma inline=forced). Время декодирования фрейма (выполнения ф-ции MP3Decode() ) возросло на 30% с 26 до 33 мс. Я в замешательстве.

По helix'у на stm32 очень противоречивые сведения. У кого-то работает, как например у Вас или вот здесь http://we.easyelectronics.ru/STM32/program...kaem-zvuki.html (фрейм 320 кбит/с декодируется чуть-ли не за 13 мс, проект под CooCox IDE).
Здесь http://electronix.ru/forum/lofiversion/index.php/t74280.html aaarrr пишет: "Хорошо, другой пример. Cortex-M3 @ 72MHz, близкая к 100% загрузка при 320кБит/с."

Может быть у меня mp3 файл кривой? Могу я попросить Вас проиграть его на плеере с Вашей реализацией и сообщить результат?
Прикрепленные файлы
Прикрепленный файл  Robot_rock_Sample_320_44100.mp3 ( 333.78 килобайт ) Кол-во скачиваний: 23
 
Go to the top of the page
 
+Quote Post
alexandermas
сообщение Sep 27 2013, 15:10
Сообщение #130


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 13-07-10
Пользователь №: 58 429



Оптимизируйте декодер. У меня на 120 мгц мп3 декодируется при загрузке камня 10-15%, а flac при 7-10%, при условии что файл забирается с ftp. При 204мгц уже тянет flac 384кгц, и 70% загрузке камня. Загрузку считаю по времяни нахождения в idle ф-ции ртоса. так что пилите гирю, она золотая...
Go to the top of the page
 
+Quote Post
Sergey_Aleksandr...
сообщение Oct 4 2013, 12:15
Сообщение #131


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



Цитата(kan35 @ Sep 26 2013, 19:19) *
И еще, точно ли у вас работает контролер на 72МГц?

Таки да, ядро работало на 36 МГц. Контролировал частоту на выводе MCO, на который подавалась не тактовая с AHB, а системная SysCLK. Поэтому задействованный делитель х2 я и не заметил. Две недели коту под хвост(
Go to the top of the page
 
+Quote Post
zheka
сообщение Oct 25 2013, 18:02
Сообщение #132


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



у кого -нибудь есть проект под KEIL?
Go to the top of the page
 
+Quote Post

9 страниц V  « < 7 8 9
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 04:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01508 секунд с 7
ELECTRONIX ©2004-2016