我正在尝试在 AVR 微控制器上编写数字振铃滤波器,但在定点算术中实现状态图时遇到了一些麻烦。这是我尝试为其编写代码的信号流图片:
编辑:(我相信上面 T_c 的等式应该是 e^[-1/(F_s*D)] )
这是我到目前为止所拥有的。我有一个名为 smultfix 的例程,它对两个 8 位有符号整数进行定点有符号乘法并返回一个 16 位有符号乘积。F_c 和 T_c 是 8 位有符号二进制小数。“输出”和 T_c 的输入与延迟元件 z1 连接处的中间步骤被视为 16 位二进制小数。所以我有:
(假设 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;
}
不幸的是,我似乎刚刚创建了一个糟糕的随机数生成器,因为这段代码会产生大量垃圾填满我的输出缓冲区!如果有人能指出我可能出错的地方,或者他们有一个更好的实现想法,将不胜感激。