简单程序将int16_t数组转换为uint16_t

时间:2017-06-01 19:32:07

标签: c arrays types uint16

我使用WinFilter程序计算C代码的FIR滤波器,但是我遇到了一个问题:

程序只提供16位有符号数组,我需要将该向量作为无符号整数。所以我正在寻找一个简单的解决方案,将数组值重新定位到下一个"值"。

int16_t FIRCoef[Ntap] = {
    -1029,
    -1560,
    -1188,
        0,
     1405,
     2186,
     1718,
        0,
    -2210,
    -3647,
    -3095,
        0,
     5160,
    10947,
    15482,
    17197,
    15482,
    10947,
     5160,
        0,
    -3095,
    -3647,
    -2210,
        0,
     1718,
     2186,
     1405,
        0,
    -1188,
    -1560,
    -1029,
        0
};
uint16_t fir(uint16_t NewSample) {
    static uint16_t x[Ntap]; //input samples
    uint32_t y=0;            //output sample
    int n;

    //shift the old samples
    for(n=Ntap-1; n>0; n--)
       x[n] = x[n-1];

    //Calculate the new output
    x[0] = NewSample;
    for(n=0; n<Ntap; n++)
        y += FIRCoef[n] * x[n]; // calculo da convolucao na amostra
                                // Calculation of the convolution in the sample    
    return y / DCgain;
}

我认为一个解决方案应该是这样的:

uint16_t--------int16_t---------index
0               -32767            1
1               -32766            2
2               -32765            3
...              ...             ...
65535            32767            65535

任何提示?

1 个答案:

答案 0 :(得分:2)

int16_t的值范围是-32768到32767.您的问题在这一点上还不清楚,但似乎您只想将这些值移到uint16_t的范围内,0至于65535.这是合理的,因为两种类型的可表示值的数量是相同的;它可以通过将int16_t的最小可能值的倒数加到输入中来实现。

当然,魔鬼在细节中。当有符号的加法溢出时,会产生未定义的行为。当超出范围的值转换为有符号整数类型时,结果是实现定义的,并且可以是(实现定义的)异常。希望避免实现定义的行为,并且必须避免未定义的行为;在这种情况下可以通过一点点小心来完成:

uint16_t convert(int16_t in) {
    return (uint16_t) 32768 + (uint16_t) in;
}

在第一个提供uint16_tint16_t类型的任何符合要求的系统上,这是可靠的做法,因为转换和加法操作模1加上{{的最大值1}}。负输入值在uint16_t范围的上半部分转换为无符号值,然后加法旋转所有值,从范围的上半部分到下半部分。

至于整个数组,如果你只想依赖明确定义的C行为(即如果你想要一个严格符合标准的解决方案)那么你需要复制数据。您可以使用上述功能填充副本。