基于DSP的信道译码算法优化
在进行上述调整后运行代码,进行测试发展,性能没有太大改善;用编译器反馈表(feedback)进行观察发现,循环并没有发生流水。这是为什么呢?原来在展开内部循环后导致C循环内代码尺寸太大,需要的寄存器数目大于C62XX的32个寄存器,所以不能进行软件流水。为了解决这问题,需要简化循环或将循环拆成几个小循环。在这里先将C循环内部的小循环展开,然后将其拆成分别完成度量计算和累计度量比较的两个循环,这样就减小了每个循环中的代码尺寸。限于篇幅这里只写出累计度量比较的循环代码。
/*完成累计度量比较的循环*/
accum00=accum_err_metric[0];accum10=accum_err_metric[1];
accum20=accum_err_metric[2];accum30=accum_err_metric[3];
for(c=0;c<n;c++)//n=24
{sh_ptr++;
add1=accum10+branch_metric_array[c][1];
add2=accum00+branch_metric_array[c][0];
add3=accum10+branch_metric_array[c][0];
add4=accum00+branch_metri
c_arrcy[c][1];
add5=accum30+branch_metric_array[c][2];
add6=accum20+branch_metric_array[c][3];
add7=accum30+branch_metric_array[c][3];
add8=accum20+branch_metric_array[c][2];
if(add1>add2){accum00=add2;state_history[0][sh_ptr]=0;}
else{accum00=add1;state_history[0][sh_ptr]=1;}
if(add3>add4){accum20=add4;state_history[2][sh_ptr]=0;}
else{accum20=add3;state_history[2][sh_ptr]=1;}
if(add5>add6){accum30=add6;state_history[3][sh_ptr]=2;}
else{accum30=add5;state_history[3][sh_ptr]=3;}
if(add7>add8){accum10=add8;state_history[1][sh_ptr]=2;}
else{accum10=add7;state_history[1][sh_ptr]=3;}
}
accum_err_metric[0]=accum00;accum_err_metic[1]=accum10;
accum_err_metric[2]=accum20;accum_err_metric[3]=accum30;
其中accum_err_metric[i]为状态i的累计度量值,branch_metric_array[][]为计算得到的各时刻量值,原来代码中的二维数码mextstate[j][i]被以实值代入。另外在编程考虑时要注意一点:程序中对数据的取命令(load)是非常耗时的,所以应
《基于DSP的信道译码算法优化(第3页)》