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.

[参考译文] 嵌入式滤波器

Guru**** 2595800 points
Other Parts Discussed in Thread: MSP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/844266/embedded-filter

主题中讨论的其他器件:MSP430FR5994

您好!

我尝试在  C/C++中复制 MATLAB 函数滤波器、但我遇到了一些问题。 此 MATLAB 函数是一组数学运算(主要是乘法)、如下所示。

函数[Y、z]=乳化 FILTER (b、a、X、z)
b = b ./ a (1);
A = A ./ A (1);
N =长度(A);
Z (n)= 0;
y =零(size (X));
对于 m = 1:length (Y)
XM = X (m);
y (m)= b (1)* xM + z (1);
YM = Y (m);%
对于 I = 2:n
z (i - 1)= b (i)* xM + z (i)- a (i)* ym;
结束
结束
z = z (1:n - 1);
结束 

我的 C/C++函数(计算滤波器的所有参数)为以下代码:

/*libraries*/
#include "msp430.h"
#include 

/










输入 uint32_t vector[450]={0、1、2、3、4、…、n};//示例输入//结果浮点 Y[450]={0};//过滤器参数浮点 A[5]={1.0000、-3.3366、4.2260、-31、258、056、372};//终端0
= 0.066_0364*、0.066*、0.066*

、0.066_064*、0.066_0=0; AUX2 = 0;
/*函数*/
//(
aux = 0;aux<4;aux++){的延迟计算
z_aux[aux]= zi[aux]*(float) vector[0];
}
//Filter 实现
(aux = 0;aux < 450;aux++){
xM =(浮点)向量[aux];
y[aux]=(b[0]* xM)+ z_aux[0];
YM = Y[辅助];
对于(AUX2 = 1;AUX2 < 5;AUX2++){
terminal1 = b[AUX2]* xM;
terminal2 = A[AUX2]* ym;
Z_aux[AUX2 - 1]= terminal1 + z_aux[AUX2]- terminal2;
}
}

数学运算的结果在 C/C++和 Matlab 中是不同的、我不理解为什么、因为数学是相同的。 是否有任何关于如何解决此问题的想法?

Tkanks

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

    不用详细介绍代码:我很确定 Matlab 能够以双精度方式执行所有操作、而该代码使用单精度。 您的结果远点还是稍微偏点?

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

    C/C++函数在程序开始时表现良好、但结果会迅速获得扩展、直到溢出发生。 这与理论不同、因为增长由术语2进行补偿。

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

    我看不到这个结果。 如果我设置矢量[]=[0至449]、即斜率为1的行、我得到 Y[]=[0至53.8]、斜率为~0.12的行(-ish)。 不知道滤波器的设计目的是什么、这似乎不可信。 我看不到任何溢出。

    由于您没有发布有效的 C 程序、我必须填充一些空白。 也许这种差异具有启发性。

    /*libraries*/
    #include "msp430.h"
    #include 
    
    /*变量*////输入
    
    uint32_t vector[450]={0、};//[0、449]填入以下 main ()
    //结果
    浮点 Y[450]={0};
    /*函数*/
    void filt (void)
    {
    //过滤器参数
    float A[5]={1.0000、-3.3366、4.2260、-2.4258、0.5372};
    float b[5]={0.0366、0.0、-0.0731、0.0、0.0366};
    float Zi[4]={-0.0366、-0.0366、0.0366、0.0366};
    float z_aux[5]={0.0};
    //部分结果
    float XM、Ym = 0;
    浮点端点1、端点2 = 0;
    //附加
    uint16_t aux、AUX2 = 0;
    //延迟计算
    对于(AUX = 0;AUX < 4;AUX++)
    {
    z_aux[aux]= zi[aux]*(float) vector[0];
    }
    //过滤器实现
    对于(aux = 0;aux < 450;aux++)
    {
    xM =(浮点)向量[aux];
    y[aux]=(b[0]* xM)+ z_aux[0];
    YM = Y[辅助];
    对于(AUX2 = 1;AUX2 < 5;AUX2++)
    {
    terminal1 = b[AUX2]* xM;
    terminal2 = A[AUX2]* ym;
    Z_aux[AUX2 - 1]= terminal1 + z_aux[AUX2]- terminal2;
    }
    }
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    PM5CTL0 &=~LOCKLPM5;
    uint16_t i;
    对于(i = 0;i < 450;+i) vector[i]= i;
    filt();
    while (1){LPM0;}
    /*NOTREACHED*/
    返回0;
    }
    

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

    哈维尔、您好!  

    溢出到底是什么?  您使用的是什么器件?   

    我还想指出的是、我们有一个用于 MSP430的 IQmath 库、可帮助将浮点算法移至定点环境中。 您可以在我们的 Resource Explorer 中找到该库和用户指南、网址为 :http://dev.ti.com/tirex/explore/node?node=AE1U0UzJJJX5NLsykSiJ3g__IOGqZri__LATEST 

    谢谢、

    JD  

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

    我要过滤的信号是以50Hz 采样的 PPG 信号。 滤波器必须消除不包含在0、5Hz 和4Hz (BPF)之间的噪声。 我尝试了不同的信号、这是我一直得到的结果。  

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

    我使用的器件是 MSP430FR5994。 我尝试 了 IQmath 库、但获得了相同的结果。 溢出发生(获得的值超过浮点型或其他类型可以达到的最大值、微控制器丢失程序的线程)。

    我认为我的问题在循环的某个索引或类似的任何内容中、但我看不到问题。

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

    作为纯粹的代码审阅、这将跳出:

    > for(aux = 0; aux<4; aux++){

    >  z_aux[aux] = zi[aux] * (float) vector[0];

    它不会分配 z_aux[4]、因此在中:

    >z_aux[AUX2 - 1]= terminal1 + z_aux[AUX2]- terminal2;

    该元件在置位前使用。 在您发布的代码中、vector[0]和 z_aux[4]被静态初始化为0.0、因此无关紧要。 如果您发布的代码不是您正在使用的代码、则可能很重要。

    我的程序是否在您的系统上失败? 这个答案将指向要执行的方向。

    [编辑:"失去程序的线程"是什么意思? 我上次看到过(好的、很久以前)溢出被悄悄忽略。]

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

    哈维尔、您好!

    您是否能够找到解决您的问题的解决方案或解决方法?

    谢谢、

    JD