C中的实时低通滤波器

时间:2014-12-14 10:03:38

标签: c++ c filter

我正在尝试实施嵌入式设计。 我从我的电路板接收u32数据,并希望在信号中添加LPF。由于我对C代码不是很熟悉,所以我现在卡住了。我按照教程获得了关于定点FIR的基础知识,它适用于静态数据。

现在我从输入设备中取样并分别处理样品。从u32到int32_t有一些演员表,但我不确定那里会发生什么。

任何可以指引我朝正确方向前进的人?

#define FILTER_LEN_LP 44
int16_t coeffsLPF[ FILTER_LEN_LP ] =
{
    87, 76, 106, 143, 185, 234, 289, 349,
    414, 483, 555, 628, 701, 773, 842, 907,
    966, 1017, 1060, 1093, 1115, 1126, 1126,
    1115, 1093, 1060, 1017, 966, 907, 842, 773,
    701, 628, 555, 483, 414, 349, 289, 234, 185,
    143, 106, 76, 87
};

void low_pass_filter(){
    u32 in_left;

    int k = 0;
    int filter_length = FILTER_LEN_LP;
    u32 acc; // accumulator for MACs
    u32 *coeffp; // pointer to coefficients

    u32 out_left;

    while (!XUartPs_IsReceiveData(UART_BASEADDR)) {

        in_left = Xil_In32(I2S_DATA_RX_L_REG);

        xil_printf("%d\n\r", in_left);

        out_left = 1 << 29;
        for ( k = 0; k < filter_length; k++ )
        {
            out_left += (int32_t)*coeffp++ * in_left;
        }

        // saturate the result
        if ( out_left > 0x3fffffff )
        {
           out_left = 0x3fffffff;
        } else if ( out_left < -0x40000000 ){
           out_left = -0x40000000;
        }

       xil_printf("%d\n\r", out_left);

        //in_right = Xil_In32(I2S_DATA_RX_R_REG);

        Xil_Out32(I2S_DATA_TX_L_REG, out_left);


        //Xil_Out32(I2S_DATA_TX_R_REG, in_right);

    }
    // break
    if(XUartPs_ReadReg(UART_BASEADDR, XUARTPS_FIFO_OFFSET) == 'q') menu();
    else low_pass_filter();
}

1 个答案:

答案 0 :(得分:1)

您的系数指针在读取之前尚未初始化,从而导致未定义的行为。在这种情况下,您的程序似乎正在读取系数的随机数据,但它可以任何

您需要在内循环开始之前重置指针。例如:

void low_pass_filter(){
    // ...
    u32 *coeffp; // pointer to coefficients
    // ...
    while (!XUartPs_IsReceiveData(UART_BASEADDR)) {
        // ...
        coeffp = coeffsLPF; // reset to coeffsLPF so that each sample input is multiplied by all of the coefficients 
        for ( k = 0; k < filter_length; k++ )
        {
            // ...