如何使用Visualdsp ++应用低架过滤器?

时间:2012-09-03 02:07:06

标签: c signal-processing fractions

我是DSP的新手。并且必须解决以下问题:对数据数组应用低搁架过滤器。原始数据显示在fract16(VisualDSP ++)中。 我写的东西如下,但不确定它是否正确。

  1. 以下代码是否有任何溢出问题?
  2. 如果1为真,我该如何防止呢?
  3. 关于这个问题的任何建议?
  4. 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;
    }
    

1 个答案:

答案 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);
}