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.

TMS320F2808: f2808用定点做陷波器输出为0,

Part Number: TMS320F2808

我想在f2808芯片上做一个滤掉三次谐波的陷波器,如果用浮点进行运算则输出没有问题,如果用定点运算,输出就为0

#define lB0 16560587
#define lB1 -33075803
#define lB2 16560587
#define lA1 -33075803
#define lA2 16343958

long long lBalanceBRFXn;
long long lBalanceBRFYn;
long long lBalanceBRFXn_1;
long long lBalanceBRFXn_2;
long long lBalanceBRFYn_1;
long long lBalanceBRFYn_2;

lBalanceBRFYn = (lBalanceBRFXn * lB0)>>24 + (lBalanceBRFXn_1 * lB1)>>24 + (lBalanceBRFXn_2 * lB2)>>24
- (lBalanceBRFYn_1 *lA1)>>24 - (lBalanceBRFYn_2 * lA2)>>24;
//
lBalanceBRFYn_2 = lBalanceBRFYn_1;
lBalanceBRFYn_1 = lBalanceBRFYn;
lBalanceBRFXn_2 = lBalanceBRFXn_1;
lBalanceBRFXn_1 = lBalanceBRFXn;

  • 你好,F2808是定点芯片,正常情况下无法处理浮点运算,需要调用IQmath函数。我看你的程序中右移的操作是为了IQ转换吗?

  • 您好,是的,右移是为了IQ转换,宏定义中IB0等是进行了IQ24定标出来,这里我直接算出来了

  • 抱歉题目没看明白啊,是指程序中定义lBalanceBRFXn为浮点的时候程序可以正常运行,定义为定点的时候运行结果为0?

  • lBalanceBRFXn定义是long的整形,如果我定义成float进行浮点运算输出结果就没有问题,但是如果我用定点方式进行运算就输出为零,以上是我用定点的计算方式

  • 你好,这个问题我咨询了一下美国工程师,耗时有点久了。对方希望了解一下你的Q值的定点格式是什么?输入的值是否相同?是否考虑上溢/下溢?

  • 您好,感谢您的耐心解答,我的定点是Q24的,我的原值是 :

    lB0  = 0.987087899425535
    lB1 =  -1.97147149483059
    lB2 =  0.987087899425535
     lA1 =  -1.97147149483059
     lA2 =  0.974175798851069

    进行Q16定标后为

    lB0 =  16560587
    lB1 = -33075803
    lB2 =16560587
     lA1 = -33075803
     lA2 = 16343958

    我自己计算了一下,不会出现上下溢出,即便我使用更长的long long整形也没有溢出。这是一个能够滤掉150HZ的陷波器,如果我使用浮点运算,则可以正常输出,如我给一个100+50*sin(2*pi*150*t)的输出,则输出就是100,150HZ正弦波可以被滤掉,浮点代码如下:

    lBalanceBRFXn = 100+50*sin(2*pi*150*iCnt/18000);

     lBalanceBRFYn = lBalanceBRFXn * lB0 + lBalanceBRFXn_1 * lB1 + lBalanceBRFXn_2 * lB2
    - lBalanceBRFYn_1 * lA1- lBalanceBRFYn_2 * lA2;

    lBalanceBRFYn_2 = lBalanceBRFYn_1;
    lBalanceBRFYn_1 = lBalanceBRFYn;
    lBalanceBRFXn_2 = lBalanceBRFXn_1;
    lBalanceBRFXn_1 = lBalanceBRFXn;

    若改用定点,则输出为0,代码如下:

    lBalanceBRFXn = 100+50*sin(2*pi*150*iCnt/18000);

    lBalanceBRFYn = (lBalanceBRFXn * lB0)>>24 + (lBalanceBRFXn_1 * lB1)>>24 + (lBalanceBRFXn_2 * lB2)>>24
    - (lBalanceBRFYn_1 *lA1)>>24 - (lBalanceBRFYn_2 * lA2)>>24;
    /
    lBalanceBRFYn_2 = lBalanceBRFYn_1;
    lBalanceBRFYn_1 = lBalanceBRFYn;
    lBalanceBRFXn_2 = lBalanceBRFXn_1;
    lBalanceBRFXn_1 = lBalanceBRFXn;

  • 你好,你的两个问题我都有升级至英文E2E论坛咨询,但是一直都没收到回复,还请耐心等待一下

  • 你使用的是定点/IQMath 库吗?如果是的话确认一下你的CC设置中,库的设置是否使用正确。 

    在编译代码时是否使用了代码优化?如果是的话将其关闭后再尝试。 

    如果上面的答案还是不对,请分享两种情况(定点和浮点)的反汇编截图,以便我们进一步调试。