?? fixed.c
字號:
/*******************************************************************************
; SJTU DSP Tech. Center
; Copyright (c) 2001 SJTU DSP Tech. Center. All Rights Reserved.
;
; Description:
; TMS320C54x Program for Students Experiment
;
; History:
; Date Authors Changes
; 2001/12/01 Zhu Min Created.
;******************************************************************************/
#include "stdio.h"
#include "math.h"
double coeff[8] =
{
2.00000000000000, 1.58740105196820, 1.25992104989487, 1.00000000000000,
0.79370052598410, 0.62996052494744, 0.50000000000000, 0.39685026299205
};
double data_x[8] =
{
0.25000000000, 0.50000000000, 0.12500000000, 0.06250000000,
0.03125000000, 0.01562500000, 0.00781250000, 0.00390625000
};
short coeff_f[8] = //2.14 format
{
32766, 26007, 20642, 16384,
13003, 10321, 8192, 6501
};
short data_x_f[8] = //1.15format
{
8192, 16384, 4096, 2048,
1024, 512, 256, 128
};
//===================================
// Limit the precision of float point array
//===================================
#define MAX_32 (Word32)0x7fffffffL
#define MIN_32 (Word32)0x80000000L
typedef long Word32;
typedef short Word16;
int Overflow;
Word32 L_mult(Word16 var1,Word16 var2)
{
Word32 L_var_out;
L_var_out = (Word32)var1 * (Word32)var2;
if (L_var_out != (Word32)0x40000000L) {
L_var_out *= 2L;//移出多余的符號位(左移一位)
}
else {
Overflow = 1;
L_var_out = MAX_32;
}
return(L_var_out);
}
Word32 L_add(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);
}
Word32 L_mac(Word32 L_var3, Word16 var1, Word16 var2)
{
Word32 L_var_out;
Word32 L_produit;
L_produit = L_mult(var1, var2);
L_var_out = L_add(L_var3, L_produit);
return(L_var_out);
}
//===================================
// Limit the precision of float point array
//===================================
void PrecisionLimit(double *x, int length, int Maxvalue, int Qxx)
{
int i;
double f_tmp;
for(i=0; i<length; i++)
{
//convert to Qxx format
f_tmp = x[i] * pow(2.0, Qxx);
//clip
if(f_tmp>Maxvalue-1)
f_tmp = Maxvalue;
else if(f_tmp<-Maxvalue)
f_tmp = -Maxvalue;
//convert back
x[i] = f_tmp/pow(2.0, Qxx);
}
return;
}
//===================================
// main function
//===================================
void main()
{
int i;
double sum1,sum2,sum3;
int sum3_tmp;
sum1 = 0;
sum2 = 0;
sum3_tmp = 0;
for(i=0; i<8; i++)
sum1 = sum1 + coeff[i] * data_x[i]; //the result of float program
PrecisionLimit(coeff,8, 32768,14); //short:-32768 ~ 32767
PrecisionLimit(data_x,8, 32768,15);
for(i=0; i<8; i++)
sum2 = sum2 + coeff[i] * data_x[i]; //the result of pseudofix
// for(i=0; i<8; i++)
// sum3_tmp = sum3_tmp + coeff_f[i] * data_x_f[i]; //3.29 format 2 signed bit
for(i=0; i<8; i++)
sum3_tmp = L_mac(sum3_tmp, coeff_f[i], data_x_f[i]); //2.30format 1 signed bit
sum3 = sum3_tmp/536870912.0/2.0; //the result of fix point
printf("the result of float point is sum1 = %f\n", sum1);
printf("the result of psedofix is sum2 = %f\n", sum2);
printf("the result of fix point is sum3 = %f\n", sum3);
return;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -