低通滤波器的设计与实现
打开Matlab ,运行命令filterDesigner,选择FIR 最小二乘或者其它,设置采样频率,和低通滤波器截止频率。点击设计滤波器,如图1:
点击目标生成.C头文件,滤波器系数如下:
const int BL = 41;
double BBB[41] = {
-0.00209557154698,-0.001476623089881,-0.0007749172356411, 0.001078324976728,
0.003836735408429, 0.006655352519891, 0.008206881969049, 0.007078038071226,
0.002355979867595,-0.005762925264306, -0.01559789169637, -0.02403993585321,
-0.02714550652792, -0.02117231404326,-0.003786352520018, 0.02491382612837,
0.06195502635744, 0.1018081070428, 0.13750215203, 0.1622394922755,
0.1710869277889, 0.1622394922755, 0.13750215203, 0.1018081070428,
0.06195502635744, 0.02491382612837,-0.003786352520018, -0.02117231404326,
-0.02714550652792, -0.02403993585321, -0.01559789169637,-0.005762925264306,
0.002355979867595, 0.007078038071226, 0.008206881969049, 0.006655352519891,
0.003836735408429, 0.001078324976728,-0.0007749172356411,-0.001476623089881,
-0.00209557154698
};
FIR滤波器实例代码如下:
const int BL = 41;
double BBB[41] = {
-0.00209557154698,-0.001476623089881,-0.0007749172356411, 0.001078324976728,
0.003836735408429, 0.006655352519891, 0.008206881969049, 0.007078038071226,
0.002355979867595,-0.005762925264306, -0.01559789169637, -0.02403993585321,
-0.02714550652792, -0.02117231404326,-0.003786352520018, 0.02491382612837,
0.06195502635744, 0.1018081070428, 0.13750215203, 0.1622394922755,
0.1710869277889, 0.1622394922755, 0.13750215203, 0.1018081070428,
0.06195502635744, 0.02491382612837,-0.003786352520018, -0.02117231404326,
-0.02714550652792, -0.02403993585321, -0.01559789169637,-0.005762925264306,
0.002355979867595, 0.007078038071226, 0.008206881969049, 0.006655352519891,
0.003836735408429, 0.001078324976728,-0.0007749172356411,-0.001476623089881,
-0.00209557154698
};
void plot::fir_filter_realtime(float *input, float *output, double * coeffs, int input_len, int coeffs_len)
{
int i,j;
float sum;
for(j = 0; j < input_len; j++)
{
sum = 0;
for (i=0;i<coeffs_len; i++) {
sum += input[i+j] * coeffs[i];
}
output[j] = sum;
}
}
void plot::dataInit(void)
{
//创建一个测试信号
int fs = 1000; //采样频率
// float t = 0:1/fs:1; //时间向量 分辨率
float t = 1.0 / fs;
const float pi = 3.1415926;
int i = 0;
for (i = 0; i < _DATA_LENGTH; i++) {
rawData[i] = sin(2 * pi * 50 * t * i) + sin(2 * pi * 150 * t * i) + sin(2 * pi * 250 * t * i);
rawData2[i] = sin(2 * pi * 50 * t * i);
}
for (i = 0; i < _DATA_LENGTH; i += 2)
{
fir_filter_realtime(&rawData[i],&filterData[i], BBB, 2,41);
}
}
效果如图所示,上下依次是
1 -> 50Hz,150Hz,250Hz原始叠加信号。
2 -> 50Hz原始信号。
3 -> 低通滤波后的信号,可见FIR滤波对相位没有影响。