|
现在在做一个带阻滤波,想把50Hz的频率滤掉,采样率为1200。滤波器的系数是靠matlab的fdatool生成的,
fdatool配置界面
,可以看得到在50HZ的点上分贝数已经达到了40dB多,接近50dB了,理应可以滤掉波形。在MATLAB中仿真也是没问题的,图如下
仿真结果
。
单片机具体的程序如下
输入信号为
main函数:(没完整粘贴,变量定义没贴上)
sum1=40;//点数
for(i=0; i<sum1; i++)
{
// INPUT =i*30;
INPUT = (arm_sin_f32(2*3.1415926f*50*i/1200))*2047;
}
for(i=sum1; i<sum1+sum1; i++)
{
// INPUT1[i-sum1] =i*30;
INPUT1[i-sum1] = (arm_sin_f32(2*3.1415926f*50*i/1200))*2047;
}
while(1)
{
LCD_Clear(WHITE);
// LCD_DrawLine(0,48,180,48);
fil();
for(i=1;i<140;i++)
{
// LCD_DrawLine(100+INPUT[i-1]/25,2*(i-1+10),100+INPUT/25,2*(i-0+10));
LCD_DrawLine(100+BSOUT[i-1]/25,2*(i-1+10),100+BSOUT[i+0]/25,2*(i+10)); //190-290,,,205-302 BS:95-215
}
}
这是fil()函数
#define TEST_LENGTH_SAMPLES 320 /* 采样点数 */
#define SIZE 32 /* 调用一次arm_fir_f32处理的采样点个数 */
#define NUM_TAPS 201 /* 滤波器系数个数 */
#define tableSize 320
uint32_t blockSize = SIZE;
uint32_t numBlocks =10;//TEST_LENGTH_SAMPLES/SIZE; /* 需要调用arm_fir_f32的次数 */
static float32_t firStateF32[SIZE + NUM_TAPS - 1]; /* 状态缓存,大小numTaps + blockSize - 1*/
void fil()[
uint32_t i;
arm_fir_instance_f32 S;
float32_t *inputF32, *outputF32;
if(num2==0)
{
inputF32=&INPUT[0];
}
else if(num2==1)
{
inputF32 = &INPUT1[0];
}
/* 初始化输入输出缓存指针 */
// inputF32 = &HPOUT[82];
outputF32 = &BSOUT[0];
/* 初始化结构体S */
arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&BS[0], &firStateF32[0], blockSize);
/* 实现FIR滤波 */
for(i=0; i < numBlocks; i++)
{
arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);
}
]
可是得到的波形如下,因为拍照拍不出来,只能按着图手画了出来,
这是两段输入滤波后的形状
,也尝试过使用把数据发送出去再收集绘图,波形如下
,从图中可以看到50HZ的频率的幅值仍然有一半(原值为2000+),滤波后为1000+。
这个究竟是什么原因,这问题搞了两个星期都没解决掉,也尝试过把滤波器的阶数改为不同,波形还是不能完全的滤掉。 |
|