[an error occurred while processing this directive]
|
Прошу сильно не ругать, если что не так, вот написал функцию фильтра, все вроде перепроверил, а включаю - ерунда какая-то получается.
Может у кого-нить есть подобное - посэмпловая обработка ?
Привожу код функции, может я что ни так делаю ?
Вх. параметры:
R0.H -> входное значение с кодека;
P0 -> указатель на структуру фильтра;
Структура фильтра:
Fir_XX_InVector Базовый адрес вх. вектора
Fir_XX_InTaps<<1 Длина вх. вектора x2 ( x2 удобнее, чтобы потом не умножать, не тратить время )
Fir_XX_InVector Указатель на текущее вх. значение ( абсолютный )
Fir_XX_OutVector Базовый адрес вых. вектора
Fir_XX_OutTaps Длина вых. вектора
Fir_XX_OutVector Указатель на текущее вых. значение ( абсолютный )
Fir_XX_Coeffs Указатель на вектор коэффициентов
// Структура фильтра Fir_02
.align 4;
.byte4 pFir_02[7] =
{
Fir_02_InVector,
Fir_02_InTaps<<1,
Fir_02_InVector,
Fir_02_OutVector,
Fir_02_OutTaps,
Fir_02_OutVector,
Fir_02_Coeffs
};
.section L1_code;
_fir:
P1 = [P0++]; //Читаем указатель на Fir_XX_InVector
B0 = P1;
P2 = [P0++]; //Читаем длину вх.вектора Fir_XX_InTaps, умноженную на 2
L0 = P2;
L2 = P2;
P1 = [P0++]; //Читаем указатель на текущее вх.значение
I0 = P1;
W[I0]=R0.H; //..и запишем его во вх.вектор
P1 = [P0++]; //Читаем указатель на Fir_XX_OutVector
B1 = P1;
P1 = [P0++]; //Читаем длину вых.вектора Fir_XX_OutTaps
P1 = P1+P1;
L1 = P1;
P1 = [P0++]; //Читаем указатель на текущее вых.значение
I1 = P1;
P1 = [P0--]; //Читаем указатель на вектор коэффициентов и...
I2 = P1; //..подготавливаем P0 к указателю на текущее вых.значение
A1=A0=0 || R0.H = W[I0++] || R2.L=W[I2++];
LSETUP(fir_loop, fir_loop) LC1=P2>>1;
fir_loop: R3.L=(A0+=R0.H*R2.L) || R2.L=W[I2++] || R0.H=W[I0++];
W[I1++]=R3.L; //Записываем результат в вых.вектор
R0 = I1; //Сохраняем указатель на текущее вых.значение
[P0] = R0;
R0 = I0; //Сохраняем указатель на текущее вх.значение
[P0-12] = R0;
R0 = PACK(R3.L, R1.L); //Результат в R0.H, R0.L=0, ( R1.L=0 до вызова ф-ции )
_fir.End:
rts;
E-mail: info@telesys.ru