【问题标题】:Fixed-point digital ringing filter in CC中的定点数字振铃滤波器
【发布时间】:2011-11-08 06:57:35
【问题描述】:

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

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

【问题讨论】:

  • 移位 smultfix 的输出时,会丢失符号位。
  • @BrettHale 如果我将乘数和被乘数都视为有符号二进制分数,如果我将它们相乘,我会得到两个符号位,对吗?所以我必须删除一个,是吗?

标签: c signal-processing avr avr-gcc


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    相关资源
    最近更新 更多