⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fixed.c

📁 TMS320C54系列在CCS3.1 下实验教程
💻 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"

float coeff[8] = 
{
	2.00000000000000, 1.58740105196820, 1.25992104989487, 1.00000000000000, 
	0.79370052598410, 0.62996052494744, 0.50000000000000, 0.39685026299205
};
float 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(float *x, int length, int Maxvalue, int Qxx)
{
	int i;
	float 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;
	float sum1,sum2,sum3;
	long sum3_tmp;
	
	asm("	stm		#0, SWWSR");
	asm("	stm		#0x0080, PMST");
	
	sum1 = 0;
	sum2 = 0;
	sum3 = 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, 32767,14);		//short:-32768 ~ 32767
	PrecisionLimit(data_x,8, 32767,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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -