IIR滤波,C语言代码实现
请教版主和各路大神,我使用IIR低通滤波(基于matlab和ARM DSP)来处理MEMS加速度传感器输出值, 传感器采样100Hz, 想得到一个正常人呼吸的波形图。使用IIR过滤得到了一个较为规则的波形,单并不是呼吸的波形,
滤波器系数采用matlab生成,代码如下
#define MEDIAN_FILTER_WINDOW 3
static u16 mf_array;
static u8 median_filter_index = 0;
static float32_t testInput_f32_50Hz_200Hz;
static float32_t testOutput;
static float32_t IIRStateF32;
const float32_t IIRCoeffs32LP = {
1.0f, 2.0f, 1.0f, 1.3209134308194264f, -0.63273879288527657f,
1.0f, 2.0f, 1.0f, 1.0485995763626117f, -0.29614035756166951f
};
static void arm_iir_f32_lp(void)
{
uint32_t i;
arm_biquad_casd_df1_inst_f32 S;
float32_t ScaleValue;
/* 初始化 */
arm_biquad_cascade_df1_init_f32(&S, numStages, (float32_t *)&IIRCoeffs32LP, (float32_t
*)&IIRStateF32);
/* IIR滤波 */
arm_biquad_cascade_df1_f32(&S, testInput_f32_50Hz_200Hz, testOutput, TEST_LENGTH_SAMPLES);
/*放缩系数 */
// ScaleValue = 0.052219514664161221f * 0.04279801741658381f;
ScaleValue = 0.077956340516462552f * 0.061885195299764481f;
/* 打印滤波后结果 */
for(i=0; i<TEST_LENGTH_SAMPLES; i++)
{
printf("%f\r\n", testOutput*ScaleValue);
}
}
最终输出结果的matlab显示如下:
这不是我想要的结果,我该如何处理,求大神指点。 先对比正常的波形和含有噪声波形的FFT,看看噪声主要在那个频段,然后再做相应的滤波。
回 eric2013 的帖子
eric2013:先对比正常的波形和含有噪声波形的FFT,看看噪声主要在那个频段,然后再做相应的滤波。 (2016-05-10 22:38) images/back.gif发现原因了,因为我是每采样一个点,就计算一次,导致最终结果很小, 现在我每32个点处理一次,值是正常的,为什么会这样,也不清楚
那么,每次处理多少个点会不会影响最终的滤波效果呢?比如32个点和400个点
回 randolph 的帖子
randolph:发现原因了,因为我是每采样一个点,就计算一次,导致最终结果很小, 现在我每32个点处理一次,值是正常的,为什么会这样,也不清楚那么,每次处理多少个点会不会影响最终的滤波效果呢? 比如32个点和400个点 (2016-05-26 12:51) images/back.gif
要大于1个点,DSP教程有说。 现在发现论坛上有好多资料可以参考。
我在设计滤波器时遇到了问题,加速度传感器采样频率100hz, 要从里面提取出呼吸波形(呼吸大概2.5秒一次), 使用fir滤波器,fdatool该如何设计参数?
LZ你好,你的滤波是滤掉多少赫兹的呀,我现在程序也是这样,可我想滤掉50HZ的,却不成功
页:
[1]