Цитата(vvs157 @ Apr 19 2005, 18:04)
Цитата(Dmitron @ Apr 19 2005, 16:56)
а формулой слабо? 12 кБайт под ногами не валяется.
Формулой и 2 байт и логарифм? А контроллер какой?
можно и формулой LogRatio = 10*log(Ey/Ex)
int LogRatio(int Exx, int Eyy)
{
int i, j;
int i1, i2, v1, v2;
// != 0
i1 = norm_l(Eyy+1);
i2 = norm_l(Exx+1);
j = i1 - i2;
v1 = L_shl(Eyy, i1);
v2 = L_shl(Exx, i2);
v1 = (v2-v1+(1<<12))>>13;
j = 3*j + (((v1>>1) + v1 + 0x02a3*j +(1<<15))>>16);
return j;
}
Вычисления здесь 32-разрядные, используется библиотека ETSI (можно найти внутри референсного кода любого вокодера, для DSP - norm_l и L_shl - 32 разрядные операции выполняемые одной инструкцией), максимальная ошибка 1 дб в диапазоне -40 - + 40 дб.
Но проще таблицей + интерполяцией. Хотя таблица + интерполяция при больших отношениях развалится и всё равно что-то нужно делать с двоичной экспонентой.