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 に答える