3

我对DSP很陌生。并且必须解决以下问题:对数据数组应用低搁架滤波器。原始数据显示在 fract16 (VisualDSP++) 中。我正在写如下内容,但不确定它是否正确。

  1. 以下代码是否有溢出问题?
  2. 如果1是真的,我应该怎么做才能防止它?
  3. 对这个问题有什么建议吗?
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;
}
4

1 回答 1

0

我不知道 fract16 的范围是多少,大约只有 -1 到 +1?

对我来说可能会产生溢出的部分是分配 org_data[j] ,但这取决于您对输入信号和滤波器系数的了解。如果您可以确保将 filter_paraA[2:0] 乘以带有值 tmp_A2..1 = [1,1,1] 的信号 < max(fract16) ,那么无论“B”侧如何,您都应该没问题。

我建议在您的代码中添加一些溢出检查。它不一定要修复它,但您将能够识别一个非常棘手的错误。除非您需要绝对的最大性能,否则我什至会保留检查代码,但输出较少或设置一个检查标志。

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);
}
于 2012-09-23T08:06:23.803 回答