主题中讨论的其他器件:C2000WARE
大家好
我正在实施一阶低通滤波器(fcut =~0、1Hz / fsample = 30kHz):
-> G (z)=(1.046 (...) e-05 z + 1.046 (...) e-05)/(z-0.999 (...))
->系数声明如下:
const float cfmed [4]={1.046061580810546775e-5、1.046061580810546775e-5、1.0、-0.9979078769683837890625};
-> 30 kHz 环路为:
out_k_1 =输出;
out = in* cfmed [0]+ in_k_1 * cfmed [1]- out_k_1 * cfmed [3];
IN_k_1 = IN;
->输入(输入)和输出(输出)被声明为浮点。
问题是我有无法接受的静态增益误差。
例如、如果我使用常数输入来测试滤波器、例如:300.0;300.5和299.2
我得到: 分别是299.760712、299.760712和298.302002。
如果我将所有变量和滤波器系数更改为"long double"、我会得到更好的结果。
但我也遇到了内存和计时方面的问题(实际上、整个应用程序包含大量的滤波器和其他东西)。 因此、我需要使用 float。
令我感兴趣的是、如果我暂停执行并检查 cfmed [4]、 系数"1.046061515808105468775e-5"编码为"000000000000000000000000b "/(0x00000000) 、系数"0.9979078769683837890625"编码为"00000000000000000000000000000b" (0x20000000000000000000b)。
我认为这 不符合 IEEE-754。 这些数字应编码为"00110111001011111000000000000000b"(0x372f8000)和"101111110111111010100001b"(0xbf7ffea1)。
我认为它是我的静态增益误差的根。
因此、我尝试 替换声明: const float cfmed[4]={1.046061580810546775e-5、1.046061580810546775e-5、1.0、-0.9979078769683837890625};
对于: const float cfmed[4]={0x372f84、0x372f8000、0x3f800000、0xbf7ffea1};
现在、滤波器仅提供+/- INF 输出值!
我做错了什么? 为什么编译器似乎没有将浮点值编码为 IEEE-754?
我使用的是 F28335、CCS V 8.3.1.00004 和编译器 V18.1.4。