|
我现在在弄一个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)
        {
                    Aout(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;
    }
} |
|