【发布时间】: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