[an error occurred while processing this directive]
Вот вам вырезка из G.723.1
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено SM 04 февраля 2003 г. 21:03
В ответ на: Насчет деления 16бит на 16 бит. отправлено Summer2003 04 февраля 2003 г. 19:52

несмотря на немеренную с виду навороченность реализуется в ДСП в несколько команд.


/*___________________________________________________________________________
| |
| Function Name : div_s |
| |
| Purpose : |
| |
| Produces a result which is the fractional integer division of var1 by |
| var2; var1 and var2 must be positive and var2 must be greater or equal |
| to var1; the result is positive (leading bit equal to 0) and truncated |
| to 16 bits. |
| If var1 = var2 then div(var1,var2) = 32767. |
| |
| Complexity weight : 18 |
| |
| Inputs : |
| |
| var1 |
| 16 bit short signed integer (Word16) whose value falls in the |
| range : 0x0000 0000 <= var1 <= var2 and var2 != 0. |
| |
| var2 |
| 16 bit short signed integer (Word16) whose value falls in the |
| range : var1 <= var2 <= 0x0000 7fff and var2 != 0. |
| |
| Outputs : |
| |
| none |
| |
| Return Value : |
| |
| var_out |
| 16 bit short signed integer (Word16) whose value falls in the |
| range : 0x0000 0000 <= var_out <= 0x0000 7fff. |
| It's a Q15 value (point between b15 and b14). |
|___________________________________________________________________________|
*/

Word16 div_s(Word16 var1, Word16 var2)
{
Word16 var_out = (Word16)0;
Word16 iteration;
Word32 L_num;
Word32 L_denom;

if ((var1 > var2) || (var1 < (Word16)0) || (var2 < (Word16)0)) {
printf("Division Error\n");
exit(0);
}

if (var2 == (Word16)0) {
printf("Division by 0, Fatal error \n");
exit(0);
}

if (var1 == (Word16)0) {
var_out = (Word16)0;
}
else {
if (var1 == var2) {
var_out = MAX_16;
}
else {
L_num = L_deposit_l(var1);
L_denom = L_deposit_l(var2);

for(iteration=(Word16)0; iteration< (Word16)15;iteration++) {
var_out <<=1;
L_num <<= 1;

if (L_num >= L_denom) {
L_num = L_sub(L_num,L_denom);
var_out = add(var_out, (Word16)1);
}
}
}
}

return(var_out);
}

Word32 L_deposit_l(Word16 var1)
{
Word32 L_var_out;

L_var_out = (Word32) var1;
return(L_var_out);
}

Word32 L_sub(Word32 L_var1, Word32 L_var2)
{
Word32 L_var_out;

L_var_out = L_var1 - L_var2;

if (((L_var1 ^ L_var2) & MIN_32) != 0L) {
if ((L_var_out ^ L_var1) & MIN_32) {
L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
Overflow = 1;
}
}
return(L_var_out);
}

Word16 add(Word16 var1,Word16 var2)
{
Word16 var_out;
Word32 L_somme;

L_somme = (Word32) var1 + (Word32) var2;
var_out = sature(L_somme);
return(var_out);
}

Word16 sature(Word32 L_var1)
{
Word16 var_out;

if (L_var1 > 0X00007fffL) {
Overflow = 1;
var_out = MAX_16;
}
else {
if (L_var1 < (Word32)0xffff8000L) {
Overflow = 1;
var_out = MIN_16;
}
else {
Overflow = 0;
var_out = extract_l(L_var1);
}
}
return(var_out);
}

Word16 extract_l(Word32 L_var1)
{
Word16 var_out;

var_out = (Word16) L_var1;
return(var_out);
}



Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru