This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28335:浮点表示

Guru**** 2588325 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1213946/tms320f28335-floating-point-representation

器件型号:TMS320F28335
主题中讨论的其他器件: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。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Henrique:

    您是否使用 C2000Ware 中的任何库作为筛选的一部分? 如果您单步执行代码、您能看到哪一行首先给出了错误的值吗? 您最初使用的任何值是否 未按预期存储在内存中? 在项目属性中、--fpu_support 编译器选项是否设为 fpu32?

    此致、

    Omer Amir

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好。

    ->"您是否在使用 C2000Ware 中的任何库作为过滤的一部分?"

    我正在使用:"Math.h"(原先来自 TI & Sun 2015)、"DSP2833x_Device.h"、"DSP2833x_examples.h"、"DSP2833x_Headers_nonBIOS.cmd"、"28335_RAM_lnk.cmd" 和"DSP2833x_CodeStartBranch.asm"。

    ->"如果你单步执行你的代码,你能看到哪一行给你一个错误的值吗?  您最初使用的任何值是否 未按预期存储在内存中?"

    误差是累积的。  似乎每个操作都有一个小错误。 我知道浮点表示具有有限的分辨率、可以产生一些误差。  但事情不是我所期望的。 虽然在截止频率和相位角方面并不需要很精确、但我需要非常接近1.0的静态增益。 为此、我微调了滤波器系数(浮点)、以便根据 IEEE-754、它们能够在存储器中完美呈现。

    例如、系数0.999979078769683837890625存储为"0010000000000000000000000000b" (0x20000000)
    但我认为该数字的正确值应为"101111110111111111111010100001b"(0xbf7ffea1)(根据 IEEE-754)。

    此外,我不知道为什么我不能正确地将这些系数声明为十六进制数,如: const float cfmed[4]={0x372f8000,0x372f8000, 0x3f800000, 0xbf7ffea1};

    ->"在您的项目属性中,-- fpu_support 编译器选项是否设置为 fpu32 ?"

    是的、确实如此

    谢谢  

    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Henrique:

    您能展示一下您是如何声明这些浮点值的吗? 您是否使用 float32_t 数据类型?

    此外,我不知道为什么我不能正确地将这些 coeffs 声明为十六进制数,因为:const float cfmed[4]={0x372f8000,0x372f8000, 0x3f800000, 0xbf7ffea1};

    您能否向我展示一下、如果它们未正确显示、它们是如何存储在内存中的?

    此外、如果您需要、可以在 C2000Ware 中使用 FIR/IIR 滤波器库。

    此致、

    Omer Amir