1

AVRミクロンコントローラーでデジタルリンギングフィルターをコーディングしようとしていますが、固定小数点演算での状態図の実装に問題があります。これが私がコードを書き込もうとしている信号の流れの写真です:ここに画像の説明を入力してください

編集:(上記のT_cの式はe^[-1 /(F_s * D)]である必要があると思います)

これが私がこれまでに持っているものです。2つの8ビット符号付き整数に対して固定小数点符号付き乗算を実行し、16ビット符号付き積を返すsmultfixというルーチンがあります。F_cとT_cは、8ビットの符号付き2進小数部です。「出力」およびT_cの入力と遅延要素z1の接合部での中間ステップは、16ビットの2進小数部として扱われます。ので、私は持っています:

(F_cとT_cが他の場所で定義されていると仮定します)

int8_t generateSample()
{
    static int16_t z1 = 0x7FFF;  //initialize first delay element to max positive value
    static int16_t output;
    int8_t byteOutput = 0;
    int8_t bytez1 = 0;

    bytez1 = (z1 & 0xFF00)>>8; //make z1 into an eight bit signed binary fraction for    
                               //multiplication

    output = (smultfix(bytez1,F_c)<<1) + output; //calculate output, shift product
                                                 //left once to 
                                                 //remove double sign bit

    byteOutput = (output & 0xFF00)>>8;          //generate output byte

    z1 = (-(smultfix(byteOutput,F_c)<<1)) - \
            (smultfix(bytez1,T_c)<<1) //generate intermediate                
                                                             //product z1
    return byteOutput;  
}

残念ながら、このコードは出力バッファをいっぱいにする大量のガベージを生成するため、貧弱な乱数ジェネレータを作成したばかりのようです。誰かが私がどこで間違っているのかを指摘することができれば、または彼らがより良い実装のアイデアを持っているなら、それは大いにありがたいです。

4

1 に答える 1

1

コードは実際には正しいですが、T_c の式の符号は実際には負ではなく正でなければなりません。本の初版では負であると示されていますが、この画像は方程式が修正された本の第2版から取られているようです. T_c が負の指数で評価された場合、振動が増加しますが、正の場合、振動は減少します。これは私たちが望んでいることです。T_c を負にして、最後から 2 番目の行で減算の符号を反転することもできます。

于 2011-11-10T01:17:31.023 に答える