硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4285|回复: 3
收起左侧

[有问必答] 求问下DSP库FIR的问题

[复制链接]

2

主题

8

回帖

2

积分

新手上路

积分
2
发表于 2016-7-18 10:12:26 | 显示全部楼层 |阅读模式
我现在在弄一个FIR滤波,输入信号为单片机ADC采集输入,满多少个数就存第二个buff去(第一个buff做滤波),先带阻再高通低通,滤波完通过蓝牙传输出去。可是因为滤波都有个延迟,延迟导致每个buff的开端都有一个低电平时间段,能有什么办法能把低电平弄掉,还有我发现两个buff头尾衔接不上,这是什么原因。
程序如下:
滤波程序
void fil()
{
arm_fir_f32_bs();
//    delay_ms(5);
arm_fir_f32_lp();
//    delay_ms(5);
arm_fir_f32_hp();
//    delay_ms(5);
}

带通
void arm_fir_f32_bs()
{
    uint32_t i;
    arm_fir_instance_f32 S;
    float32_t  *inputF32, *outputF32;
    
  if(sum==1)
    {
    inputF32=&adcbuff[0];
    }
  else if(num2==1)
    {
    inputF32 = &timebuff[0];
    }
    /* 初始化输入输出缓存指针 */
//    inputF32 = &INPUT[0];
    outputF32 = &BSOUT[0];

    /* 初始化结构体S */
    arm_fir_init_f32(&S, NUM_TAPS1, (float32_t *)&BS[0], &firStateF321[0], blockSize);

    /* 实现FIR滤波 */
    for(i=0; i < numBlocks; i++)
    {
        arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);
    }

    /* 打印滤波后结果 */
//    for(i=0; i<TEST_LENGTH_SAMPLES; i++)
//    {
//        LCD_ShowxNum(100,200,testOutput,7,16,0);
//        delay_ms(300);
//    }
}
低通
void arm_fir_f32_lp()
{
    uint32_t i;
    arm_fir_instance_f32 S;
    float32_t  *inputF32, *outputF32;


    /* 初始化输入输出缓存指针 */
    inputF32 = &BSOUT[0];
    outputF32 = &LPOUT[0];

    /* 初始化结构体S */
    arm_fir_init_f32(&S, NUM_TAPS1, (float32_t *)&LP[0], &firStateF321[0], blockSize);

    /* 实现FIR滤波 */
    for(i=0; i < numBlocks; i++)
    {
        arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);
    }

    /* 打印滤波后结果 */
//    for(i=0; i<TEST_LENGTH_SAMPLES; i++)
//    {
////        printf("%f\r\n", testOutput);
////        Dac1_Set_Vol(testOutput);
////        LCD_ShowxNum(100,100,testInput_f32_50Hz_200Hz,7,16,0);
//        LCD_ShowxNum(100,200,testOutput,7,16,0);
//        delay_ms(300);
//    }
}

高通
void arm_fir_f32_hp()
{
    uint32_t i;
    arm_fir_instance_f32 S;
    float32_t  *inputF32, *outputF32;
  
    /* 初始化输入输出缓存指针 */
    inputF32 = &LPOUT[0];
//    inputF32 = &testInput_f32_50Hz_200Hz[0];
    outputF32 = &HPOUT[0];

    /* 初始化结构体S */
    arm_fir_init_f32(&S, NUM_TAPS1, (float32_t *)&HP[0], &firStateF321[0], blockSize);

    /* 实现FIR滤波 */
    for(i=0; i < numBlocks; i++)
    {
        arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);
    }

//    /* 打印滤波后结果 */
//    for(i=0; i<TEST_LENGTH_SAMPLES; i++)
//    {
//    LCD_ShowxNum(100,200,testOutput,7,16,0);
//        delay_ms(300);
//    }
}

主循环
while(1)
    {

    //***********************************************************************************************************************
      if(sum==1)
        {
                   &#160Aout(8) = 1;
        //收集满了,开始发送数据
        
        if(num2==0)
         {
//            for(i=0;i<2400;i++)
//                {INPUT=(float)adcbuff;
////                LCD_DrawLine(120+INPUT[i-1]/25,(i)*2,120+INPUT/25,(i+1)*2);
//                }
              fil();

       for(j=0;j<2;j++)
             {
                for(i=0;i<160;i++)
                {            
                    
                USART_SendData(USART1,((s16)HPOUT[i+j*160])&0xFF);  //发送低8位
                    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
    //                delay_ms(1);
                USART_SendData(USART1,((s16)HPOUT[i+j*160])>>8);    //发送高8位
                    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);                    

                }
            }

         }
        else if(num2==1)
        {
              fil();
            for(j=0;j<2;j++)
             {
                for(i=0;i<160;i++)
                {            
                USART_SendData(USART1,((s16)HPOUT[i+j*160])&0xFF);  //发送低8位
                    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
    //                delay_ms(1);
                USART_SendData(USART1,((s16)HPOUT[i+j*160])>>8);    //发送高8位
                    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);                    
                    
                }
            }
        }
        sum=0;

PAout(8) =0;
    }
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2016-7-18 11:12:38 | 显示全部楼层
FIR是有个群延迟的,保证你的数据连续采集,分段连续往FIR 的API函数里面送就可以了。
回复

使用道具 举报

2

主题

8

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2016-7-18 12:34:45 | 显示全部楼层

回 eric2013 的帖子

eric2013:FIR是有个群延迟的,保证你的数据连续采集,分段连续往FIR 的API函数里面送就可以了。 (2016-07-18 11:12) 
那个群延迟是第一次调用有,还是每一次调用都是存在群延迟的呀?在串口发送前调用API吗
回复

使用道具 举报

2

主题

8

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2016-7-18 14:09:09 | 显示全部楼层

回 eric2013 的帖子

eric2013:FIR是有个群延迟的,保证你的数据连续采集,分段连续往FIR 的API函数里面送就可以了。 (2016-07-18 11:12) 
对于FIR的API的函数不太懂,没用过API,有没有具体的文件或者什么的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-13 17:05 , Processed in 0.209702 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表