滤波器简介
matlab使用
https://www.cnblogs.com/21207-iHome/p/7059144.html
c语言设计
https://www.jianshu.com/p/0e246f3d4a7b
以低通滤波器(10hz以上频率滤除)为例:
1:参数生成(结果与matlab相同)
#define PI 3.14159265358979
void iir_lowspass_coefs_generate(float fn, float Q, float *coefs)
{
//Q=0.707 截止频率衰减3Db fn=10(截止频率)/16000(sample_rate)
float w0 = 2 * PI*fn;
float alpha = (float)sin(w0) / (2 * Q);
float a0 = 1 + alpha;
float a1 = -2 * (float)cos(w0);
float a2 = 1 - alpha;
float b0 = (1 - (float)cos(w0))/2;
float b1 = 1 - (float)cos(w0);
float b2 = (1 - (float)cos(w0))/2;
coefs[0] = 1;
coefs[1] = a1/a0;
coefs[2] = a2/a0;
coefs[3] = b0/a0;
coefs[4] = b1/a0;
coefs[5] = b2/a0;
printf("%f %f %f %f %f %f\n",coefs[0],coefs[1],coefs[2],coefs[3],coefs[4],coefs[5]);
}
IIR滤波器(计算公式)
float iir_low_pass_10hz(float Value)
{
const float NUM[3] = {0.000015, 0.000031, 0.000015};
const float DEN[3] = {1.000000, -1.988891, 0.988953};
static float y0 = 0, y1 = 0, y2 = 0, x0 = 0, x1 = 0, x2 = 0;
float Out = 0;
x0 = Value;
y0 = x0*NUM[0] + x1*NUM[1] + x2*NUM[2] - y1*DEN[1] - y2*DEN[2];//用差分方程计算就好
y2 = y1;
y1 = y0;
x2 = x1;
x1 = x0;
Out=y0;
return y0;
}