#include "IIR.h" #include "arm_math.h" #include "arm_const_structs.h" //Log需要引用的头文件 #include "nrf_log.h" #include "nrf_log_ctrl.h" #include "nrf_log_default_backends.h" #define bp_numStages 1 /* 2阶IIR滤波的个数 */ #define bs_numStages 2 /* 2阶IIR滤波的个数 */ #define BLOCK_SIZE 1 /* 调用一次arm_biquad_cascade_df1_f32处理的采样点个数 */ uint32_t blockSize = BLOCK_SIZE; static float32_t IIRStateF32_bp[4*bp_numStages]; /* 带通滤波器状态缓存 */ static float32_t IIRStateF32_bs[4*bs_numStages]; /* 带阻滤波器状态缓存 */ arm_biquad_casd_df1_inst_f32 S_BS; arm_biquad_casd_df1_inst_f32 S_BP; float32_t bpScaleValue; float32_t bsScaleValue; /* Elliptic带通滤波器系数20Hz 500Hz*/ const float32_t IIRCoeffs32BP[5*bp_numStages] = { 1.0f, 0, -1.0f, 0.638776097661321373699649939226219430566f, 0.339488565819422882796629892254713922739f }; /* 巴特沃斯带阻滤波器系数48Hz 52Hz*/ const float32_t IIRCoeffs32BS[5*bs_numStages] = { 1.0f, -1.975854434025588135526163569011259824038f, 1.0f, 1.937393708057424390744927222840487957001f, -0.966392678521233783328625577269122004509f, 1.0f, -1.975854434025588135526163569011259824038f, 1.0f, 1.952884644070242314839447317353915423155f, -0.972373462682551759073135144717525690794f }; void arm_iir_f32_bs(void) { /* 初始化 */ arm_biquad_cascade_df1_init_f32(&S_BS, bs_numStages, (float32_t *)&IIRCoeffs32BS[0], (float32_t *)&IIRStateF32_bs[0]); /*放缩系数 */ bsScaleValue = 0.984570131944842996674083224206697195768f*0.984570131944842996674083224206697195768f; } void bs_bp(float32_t *bpinputF32_IN,float32_t *bsoutputF32_IN) { float32_t bpoutputF32_IN __attribute__((aligned(4))); arm_biquad_cascade_df1_f32(&S_BP, bpinputF32_IN, &bpoutputF32_IN, blockSize); bpoutputF32_IN = (bpoutputF32_IN)*bpScaleValue; arm_biquad_cascade_df1_f32(&S_BS, &bpoutputF32_IN, bsoutputF32_IN, blockSize); *bsoutputF32_IN = (*bsoutputF32_IN)*bsScaleValue; } /* ********************************************************************************************************* * 函 数 名: arm_iir_f32_bp * 功能说明: 调用函数arm_iir_f32_hp实现带通滤波器 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ void arm_iir_f32_bp(void) { /* 初始化 */ arm_biquad_cascade_df1_init_f32(&S_BP, bp_numStages, (float32_t *)&IIRCoeffs32BP[0], (float32_t *)&IIRStateF32_bp[0]); /*放缩系数 */ bpScaleValue = 0.66974428290971144139831494612735696137f; } #define TEST_LENGTH_SAMPLES 400 /* 采样点数 */ //static float32_t testInput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES]; /* 采样点 */ //static float32_t testOutput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES]; float math_caculate_signal(uint16_t sampleHz) { static uint16_t i = 0; float singalOutput; /* 50Hz正弦波 + 200Hz正弦波 */ singalOutput = arm_sin_f32(2 * 3.1415926f * 50 * i / sampleHz) + arm_sin_f32(2 * 3.1415926f * 200 * i / sampleHz); /* 归零逻辑:当i达到一个完整周期的采样点数时 */ if (++i >= (sampleHz / 50)) { i = 0; } return singalOutput; } void FilterInit() { arm_iir_f32_bs(); // 带阻滤波器 arm_iir_f32_bp(); // 带通滤波器 ////test code // CreateData(); // // for (int i = 0; i < TEST_LENGTH_SAMPLES; i++) // { // arm_biquad_cascade_df1_f32(&S_BS, &testInput_f32_50Hz_200Hz[i], &testOutput_f32_50Hz_200Hz[i], 1); // } /* NRF_LOG_INFO("raw\r\n"); char stf[10]; for (int i = 0; i < TEST_LENGTH_SAMPLES; i++) { sprintf(stf,"%0.3f", testInput_f32_50Hz_200Hz[i]); NRF_LOG_INFO("%s",stf); if (NRF_LOG_PROCESS() == false) //处理挂起的log { } } NRF_LOG_INFO("proccess\r\n"); NRF_LOG_PROCESS(); arm_biquad_cascade_df1_f32(&S_BS, testInput_f32_50Hz_200Hz, testOutput_f32_50Hz_200Hz, TEST_LENGTH_SAMPLES); for (int i = 0; i < TEST_LENGTH_SAMPLES; i++) { sprintf(stf,"%0.3f", testOutput_f32_50Hz_200Hz[i]); NRF_LOG_INFO("%s",stf); if (NRF_LOG_PROCESS() == false) //处理挂起的log { } } while(1) { NRF_LOG_PROCESS(); } */ //处理挂起的log //////end }