1

我正在尝试在 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;  
}

不幸的是,我似乎刚刚创建了一个糟糕的随机数生成器,因为这段代码会产生大量垃圾填满我的输出缓冲区!如果有人能指出我可能出错的地方,或者他们有一个更好的实现想法,将不胜感激。

4

1 回答 1

1

代码实际上是正确的 - 但 T_c 等式的符号确实应该是正数而不是负数。它在本书的第一版中显示为负数,并且这张图片似乎是从本书的第二版中截取的,其中方程已被更正。如果 T_c 用负指数计算,振荡会增加,但如果它是正的,振荡会减少,这就是我们想要的。使 T_c 为负并在倒数第二行翻转减法的符号也可以。

于 2011-11-10T01:17:31.023 回答