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.

[参考译文] TMS320F280049:单精度浮点 CAN#39;t meet 可用于调制二阶数字低通滤波器

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/886163/tms320f280049-single-precision-floating-point-can-t-meet-to-caculate-2nd-order-digital-low-pass-filter

器件型号:TMS320F280049

尊敬的 C2000专家:

我正在尝试在代码中添加二阶数字低通滤波器、但我要解决的一个问题是、这个二阶数字滤波器无法正常工作、这是因为单精度浮点的限制。 我想请你就如何修复这些限制提出建议。

我使用了将二阶低通滤波器从连续模式转换为非连续模式的肠转换。 下面是我获得的结果。  

通过此转换、实现的代码如下所示:

void snd_order_low_pass 过滤器(second_order_data * v、second_order_param * k、float32_t 输入)

V->yn0 = v->yn1;
V->yn1 = v->yn2;
v->xn0 = v->xn1;
v->xn1 = v->xn2;
V->xn2=输入;

V->yn2=k->a2*v->xn2+k->a1*v->xn1+k->a0*v->xn0
-k->b1*v->yn1 - k->b0*v->yn0;

参数为:

A2 = 0.00003947346;
A1 = 0.000000007894691;
A0 = 0.00003947346;
B1 =-1.999748688378090;
B0 = 0.999748704167471;

我使用了双浮点和单浮点变量在 MATLAB 中进行仿真、并找到了下表所示的散射。 双浮点运算效果良好、但单浮点类型不能。 这可能与我在 DSP 中测试的内容相匹配。

在我的情况下、使用双浮点类型似乎需要很多时间、因此不能使用双精度。 您能否分享一些使用单个浮点类型正确计算二阶低通滤波器的建议?

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

    插孔、

    问题是分子和分母系数的相对大小。  在这种情况下、所有小项都位于分子中、这与输出上的缩放相同。  您可以将[a0 A1 A2]缩放在一起、使它们与分母系数处于相同的范围、然后在输出端应用单独的缩放(第一个的倒数)来校正增益。  在本例中、这将是一个很大的因素、比如10^6、但我认为这是可以的。  

    如果仍有问题、您可以通过以不同的方式对滤波器进行编码来改善问题。  您在此处编码的是直接形式1结构。  有一个直接形式2 (转置)结构、该结构接受相同的系数、但对它们的操作不同。  DF2对系数误差不太敏感、因此它可能更适合您。  DCL 提供了这两种模式的示例、因此您可以在那里查找代码和更多信息。

    希望这对您有所帮助。

    此致、

    Richard

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

    您好 Richard、

    感谢您提供此信息。 在本例中、我尝试使用直接形式2、我看到结果与直接形式1相同、双精度工作正常、但单精度不能。 我已经在 F280049中进行了测试并在 Simulink 中进行了仿真、结果向我显示没有差异。

    关于您的注释"scale [a0 A1 A2] toguas the nategus coefficients"、我用相同的比例(10^6)创建了分子和分母、结果向我显示输出将饱和。 我不确定我是否以正确的方式完成了该操作、并分享我在 MATLAB 代码中所做的操作、您能在此处分享您的评论吗?

    xn_1 = xn;
    Yn_1 = Yn;
    xn =单个(u);%获取输入
    YN =(b0*xn + vn)/换算;
    Vn = B1*xn + B2*xn_1 - A1*yn - A2*yn_1;

    以下是系数:

    换算=单(1000000.0);

    B0 =单通道(0.000000003947346*scale);
    b1 =单通道(0.000000007894691*scale);
    B2 =单通道(0.000000003947346*scale);
    A1 =单(-1.999748688378090*scale);
    A2 =单(0.999748704167471*刻度);

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

    插孔、

    自您的第一个帖子以来、您已经切换了系数符号。  在任一种情况下、您只需缩放分子系数、然后计算滤波器(其中一个)、然后将输出(yn)除以相同的缩放因子。

    此致、

    Richard

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

    您好 Richard、

    感谢您的支持。 根据我的理解、如果仅缩放分子、则应在添加输出之前对结果进行分频、因为其中还有其他2个分母系数。

    我尝试在第一个帖子结构中使用10^6来缩放分子系数(我认为什么符号结构无关紧要)、在本例中[A2 A1 a0]是分子、结果向我显示仍然无法正常工作。 如下所示的代码:

    void snd_order_low_pass 过滤器(second_order_data * v、second_order_param * k、float32_t 输入)

    V->yn0 = v->yn1;
    V->yn1 = v->yn2;
    v->xn0 = v->xn1;
    v->xn1 = v->xn2;
    V->xn2=输入;

    V->yn2=((k->a2*v->xn2+k->a1*v->xn1+k->a0*v->xn0)*k->比例)
           -k->b1*v->yn1 - k->b0*v->yn0;

    参数为:

    A2 = 0.003947345706761f;
    A1 = 0.007894691413523f;
    A0 = 0.003947345706761f;
    B1 =-1.999748688378090f;
    B0 = 0.999748704167471f;

    换算= 0.000001000000f;

    我还尝试先按比例缩放分子、然后以这种方式进行除法输出、但仍然无法正常工作。

    void snd_order_low_pass 过滤器(second_order_data * v、second_order_param * k、float32_t 输入)

    V->yn0 = v->yn1;
    V->yn1 = v->yn2;
    v->xn0 = v->xn1;
    v->xn1 = v->xn2;
    V->xn2=输入;

    V->yn2=((k->a2*v->xn2+k->a1*v->xn1+k->a0*v->xn0)
           -k->b1*v->yn1 - k->b0*v->yn0)*k->比例

    参数为:

    A2 = 0.003947345706761f;
    A1 = 0.007894691413523f;
    A0 = 0.003947345706761f;
    B1 =-1.999748688378090f;  
    B0 = 0.999748704167471f;

    换算= 0.000001000000f;

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

    插孔、

    你是对的。  这不起作用-我很抱歉误导您。

    您能不能告诉我您原始公式中的参数(zeta、wc、TS)?

    此致、

    Richard

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

    您好 Richard、

    zeta 是湿因子、值为1

    WC 是截止频率,值为2*pi*fc rad/s,其中 fc = 2Hz

    Ts 是计算或采样间隔、值为1/fs、其中 Fs = 100kHz

    使用这个二阶低通滤波器的目的是获得外部信号的直流偏移、并且外部信号频率在40Hz 至2kHz 之间变化。 如果使用一阶低通滤波器、则需要花费更多的时间、并且随着高精度要求的实现、时间将会更长。

    谢谢。。。

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

    插孔、

    谢谢。 您可能知道、小增益的原因是采样频率与预期截止频率之间的差异。 如果不进行双精度运算、我认为算法中无法缓解这种情况。 从滤波器设计的角度来看、您可以尝试一些操作。

    您能否通过抽取输入来降低采样频率? 将采样频率减半会使滤波器增益增加约五倍。 如果您可以将输入抽取8倍(即在12.5kHz 下采样)、最高可达64倍。   

    增大滤波器阶数对巴特沃斯型响应没有帮助、但可以使用不同的响应吗? 例如、椭圆滤波器具有更接近的系数、但您必须对阶跃响应进行增益调整。

    我认为、在上述所有情况下、您必须进行一些物理测试、以确保结果符合您的预期。 BTW、检查所有这一切的一种简单方法是在 Matlab 中使用 FDA 封装。 这样您就可以尝试不同的滤波器参数并快速查看结果。

    请告诉我这是否有任何帮助。

    此致、

    Richard

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

    您好 Richard、

    感谢您的建议。 是的、我之前尝试将采样频率降低到12.5kHz (实际上降低到6.25kHz)、但它仍然无法工作。

    我将尝试您的建议、您的示例中是否有椭圆滤波器?  

    感谢您在此提供的大力支持、尤其是这与 C2000控制器无关。  

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

    尊敬的 Jack:

    我没有进行任何编码、但有一点奇怪的是、从较慢采样率计算的系数不起作用、因为分子和分母系数在缩放方面更加接近。  您能否发布您获得的号码?

    无论如何、我已经附加了一个 FDA 文件、您应该能够在 Matlab 的 FilterDesigner 中加载该文件。  这是一个具有2Hz 截止频率的6阶椭圆滤波器。  您可以随意调整带宽并对其进行微调。  系数的比例类似、但有些系数的数值相似。  我不确定这将如何在单精度下工作。  您将需要级联三个2P2Z 级。

    希望这对您有所帮助。

    此致、

    Richard

    e2e.ti.com/.../2hz_5F00_lp_5F00_filter.fda

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

    您好 Richard、

    以下是我获得的频率、zeta = 1、fc = 2Hz、fs = 6.25kHz。

    B0 =单通道(0.000001008618523);
    B1 =单通道(0.000002017237047);
    B2 =单通道(0.000001008618523);
    A1 =单通道(-1.995982799933390);
    A2 =单通道(0.995986834407488);

    滤波器代码以6.25kHz 的频率运行。

    xn_1 = xn;
    Yn_1 = Yn;
    xn =单(u);%INPut
    YN =(b0*xn + vn);
    Vn = B1*xn + B2*xn_1 - A1*yn - A2*yn_1;

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

    插孔、

    是的、这些系数也接近我看到的值。  它们比以前要近得多、所以我本来希望会有差异。  您看到的结果是否与以前完全相同?

    此外、如果您有 Matlab 脚本、您是否会介意将其发送给我?  谢谢。

    此致、

    Richard

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

    尊敬的 Jack:

    这是一项有趣的活动。  请查看随附的脚本。  我已经尝试了各种采样率、并绘制了双精度系数和单精度系数的阶跃响应。  始终存在差异、随着采样频率和截止频率之间的差异减小、差异会减小。  这是由于单精度的分辨率。  因此、在您的情况下、我认为这是将滤波器速率抽取足够小的稳定状态误差的问题。

    此致、   

    Richard

    e2e.ti.com/.../scratch.m

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

    您好 Richard、

    感谢您的大力支持。