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