我是DSP的新手。并且必须解决以下问题:对数据数组应用低搁架过滤器。原始数据显示在fract16(VisualDSP ++)中。 我写的东西如下,但不确定它是否正确。
fract16 org_data[256]; //original data
float16 ArrayA[],ArrayB[];
long tmp_A0, tmp_A1, tmp_A2, tmp_B1, tmp_B2;
float filter_paraA[3], filter_paraB[3]; // correctness: 0.xxxxx
// For equalizing
// Low-Shelving filter
for ( i=0; i<2; i++)
{
tmp_A1 = ArrayA[i*2];
tmp_A2 = ArrayA[i*2+1];
tmp_B1 = ArrayB[i*2];
tmp_B2 = ArrayB[i*2+1];
for(j=0;j<256;j++){
tmp_A0 = org_data[j];
org_data[j] = filter_paraA[0] * tmp_A0
+ filter_paraA[1] * tmp_A1
+ filter_paraA[2] * tmp_A2
- filter_paraB[1] * tmp_B1
- filter_paraB[2] * tmp_B2;
tmp_A2 = tmp_A1;
tmp_B2 = tmp_B1;
tmp_A1 = tmp_A0;
tmp_B1 = org_data[j];
}
ArrayA[i*2] = tmp_A1;
ArrayA[i*2+1] = tmp_A2;
ArrayB[i*2] = tmp_B1;
ArrayB[i*2+1] = tmp_B2;
}
答案 0 :(得分:0)
我不知道fract16的范围是什么,只是-1到+1?
对我来说可能产生溢出的部分是指定org_data [j],但取决于你对输入信号和滤波器系数的了解。如果你能确保将filter_paraA [2:0]乘以信号,其值为tmp_A2..1 = [1,1,1]&lt; max(fract16)你应该没事,不管B&#39; B&#39;侧。
我建议在代码中添加一些溢出检查。它不一定要修复它,但你可以识别一个非常棘手的bug。除非你需要绝对最大性能,否则我甚至会保留检查代码,但输出较少或设置一个被检查的标志。
macA = filter_paraA[0] * tmp_A0 + filter_paraA[1] * tmp_A1 \
+ filter_paraA[2] * tmp_A2;
macB = filter_paraB[1] * tmp_B1 - filter_paraB[2] * tmp_B2;
if((macA-macB)>1){
printf("ERROR! Overflow detected!\n");
printf("tmp_A[] = [%f, %f, %f]\n",tmp_A2,tmp_A1,tmp_A0);
printf("tmp_B[] = [%f, %f]\n",tmp_B1,tmp_B0);
printf(" i = %i, j = %i\n",i,j);
}