我必须实现数字滤波器的微控制器不支持浮点运算。
给定以100 Hz的给定速率采样的模拟输入信号(可以取-1.65 V至1.65 V的值),我只能执行定点操作。所以我猜我必须先将输入转换为定点。还指出ADC的输出被量化为无符号的10位值。
我的问题是。
我知道固定点有一种Qm.n格式,包括一个符号位。在线参考文献都没有包括从带符号输入浮点到无符号定点的转换
我发现了这个代码:
int fixedValue = (int)Math.Round(floatValue*Scale);
double floatValue = (double)fixedValue/Scale;
问题: 1.如何选择缩放系数? 2.它是否取决于我的输入值范围和用于定点表示的位数? 3. Qm.n格式使用有符号位。定点表示可以是无符号的吗?
这一切都归结为选择比例因子和从有符号输入到无符号10位不动点的映射(将用于进一步计算求解差分方程,然后在输出处将其转换回加倍)
提前致谢。
答案 0 :(得分:2)
使用简单的2点插值。
class Object
def id
'bar'
end
def foo
end
end
describe '' do
it '' do
allow_any_instance_of(Object).to receive(:foo) { |o| "hello #{o.id}" }
puts Object.new.foo
end
end
OP报告“仅支持定点操作的微控制器”。但似乎正在使用(或想要使用)#define Value_MAX 1.65
#define Value_MIN (-1.65)
#define value10bit_MAX 1023
#define value10bit_MIN 0
#define slope ((value10bit_MAX - value10bit_MIN)/(Value_MAX - Value_MIN))
int value10bit = (int)Math.Round((floatValue - Value_MIN)*slope + value10bit_MIN);
。所以也许这适用于OP