|
发表于 2018-5-10 22:43:41
|
显示全部楼层
matlab浮点算法转定点C步骤
matlab的浮点定点化是信号处理中常遇到的问题,在这里贴出方法,便于大家学习。
matlab浮点算法转定点C步骤
1. 用matlab设计浮点算法。
2. 将浮点算法中的变量用matlab的fi object重新定义(定点定标),比较matlab浮点与 定点算法的误差,
调整fi object定标直到误差可接受。
3. 将ETSI 定点C基本运算函数编译成DLL,供matlab调用。
4. 将2中的matlab定点代码用3中的基本函数重新实现。
5. 将4中的matlab定点代码转化成定点C代码。4与5的算法输出结果应该比特一致。
6. 根据性能需求优化5中的C代码。
浮点数(x)转换为定点数(xq):xq=(int)x* 2Q
定点数(xq)转换为浮点数(x):x=(float)xq*2-Q
function y = qfilter(h,x);
h = fix(h);
x = fix(x);
y = zeros(size(x));
for i = 1:length(x)
for k = 1:i
y(i) = fix( y(i) + fix( x(i-k+1)*h(k) ) );
end
end
////////转化成定点函数///////
double fix(double x,int Q)
{
long int y;
double z;
y=(int)(x*pow(2,Q));
z=y/pow(2,Q);
return z;
}
//////转化成定点函数////////////
//////乘法运算////////////////////
double multi(double x,double y,int Q)
{
double z;
z=fix(x*y,Q);
return z;
}
//////乘法运算////////////////////
//////除法运算////////////////////
double div(double x,double y,int Q)
{
double z;
z=fix(x/y,Q);
return z;
}
//////除法运算////////////////////
/////加法运算///////////////////
double add(double x,double y,int Q)
{
double z;
z=fix(x+y,Q);
return z;
}
/////加法运算///////////////////
double minus(double x,double y,int Q)
{
double z;
z=fix(x-y,Q);
return z;
} |
|