嵌入式系统的直接型FIR数字滤波器
(2021.5.28 这是大学最后一篇帖子)
FIR数字滤波器: 有限长单位冲激响应滤波器,因为结构简单易于实现所以广泛应用于数字系统中此次设计一个低通滤波器其他的同求。
FIR结构原理公式推导不想多谈看数字信号处理教程-程佩青版本学习
1.FIR滤波器参数选择(Matlab)
根据实际问题合理选择参数才能得到良好的效果~
1.打开matlab.exe 命令窗口输入fdatool弹出界面:此次设计为一个40阶的低通滤波器截止频率为9khz(幅度响应和相位响应如图并且用Hamming窗),当然使用归一化频率也有讲究此时的截止频率需要根据Fs进行换算(归一化乘以FS/2),对于ADC采样频率和FIR这里的Fs来看使用归一化频率更加方便,这里不使用归一化频率。当然用此小工具箱的目的就是计算滤波器系数,当然也可以直观的看见冲激响应和阶跃响应和零极点等信息。
滤波器系数如图:
进行数据截断或者选择类型将这些系数生成.h文件输出(精度会影响效果当然也会影响运算速度和效率)也就是:
Warning - Filter coefficients were truncated to fit specified data type.
The resulting response may not match generated theoretical response.
Use the Filter Design & Analysis Tool to design accurate;
2.生成.h文件导出滤波器系数:
2. 按照上图系数对于这个40阶的滤波器书写FIR过程:
#include <stdio.h>
#include <math.h>
#include <FIR.h>
const int BL = 41;
const float B[41] ={
-0.001274768147,-0.0005498603568, 0.001283414429, 0.002253919607,-2.456633361e-018,
-0.00421492476,-0.004339886364, 0.003106784541, 0.0105660269, 0.005189210642,
-0.01216886286, -0.02002013475,9.983707688e-018, 0.03149742261, 0.03043647483,
-0.02110532671, -0.07267356664, -0.03861451522, 0.1101378947, 0.2927655876,
0.3754502237, 0.2927655876, 0.1101378947, -0.03861451522, -0.07267356664,
-0.02110532671, 0.03043647483, 0.03149742261,9.983707688e-018, -0.02002013475,
-0.01216886286, 0.005189210642, 0.0105660269, 0.003106784541,-0.004339886364,
-0.00421492476,-2.456633361e-018, 0.002253919607, 0.001283414429,-0.0005498603568,
-0.001274768147
};
extern float Data_in[256] ;
extern float Data_out[256];
extern float State[42];
void DirectForm_FirHamming(float *Data_in , float *Data_out ,int n)
{
int i =0,j = 0 ,k =0;
float temp;
for(k=0 ; k < n ;k ++)
{
State[0] = Data_in[k]; //
for (i = 0, temp = 0; i < 41; i++)
temp += B[i] * State[i];
Data_out[k] = temp;
for (j = 41 - 1; j > -1 ; j--)
State[j+1] = State[j];
}
}
主函数进行模拟ADC采样后进行FIR滤波器滤波过程:
#define Fs 48000 //可以后面做FFT分析当然前面设计工具也需修改 此例子信号简单无需fft观察波形即可 多个信号叠加及其以上需FFT才能验证得出结论
int main(void)
{
int i;
while(1)
{
if(flag)
{
for(i=0; i<256; i++)
Data_in[i]=500*sin(PI2*i*1000/Fs);
DirectForm_FirHamming(Data_in , Data_out ,256);
flag = 0;
}
}
}
生成波形如图:频率为1khz的正弦波序列长度为256也就是Data_in的数据为:
经过FIR滤波器之后:序列长度为256也就是Data_out的数据为:
可见产生了不可避免的时延但是信号在通带内被保留
修改信号为
Data_in[i]=300*sin(PI2*i*1000/Fs)+500*sin(PI2*i*15000/Fs);
即幅度为300的1000hz信号和幅度为500的15khz信号如图:
经过FIR滤波器后:只留下了幅度为300的1khz信号
再次修改被测信号:
Data_in[i]=500*sin(PI2*i*15000/Fs);
修改信号为幅度500的15khz信号不在通带范围内:
此时修正幅度使其输出相对比幅度500信号几乎全为0,信号15khz不许通过。
3. FIR的高通滤波器
1.生成高通滤波器系数(10khz高通滤波器)
进行上述操作信号改为:
Data_in[i]=500+500*sin(PI2*i*8000/Fs);
输出为:
将此时修正幅度使其输出
再将信号修改为:
Data_in[i]=500+500*sin(PI2*i*11000/Fs);
经过FIR10khz高通滤波器后:
可见直流量0hz被滤除留下了11khz的频率信号。
4. 将FIR滤波器输出数据Data_out经DAC按频率输出
也算是有始有终吧;