滤波器系数生成与代码编写
1.MATLAB滤波器设计
使用filterDesigner打开滤波器设计界面,界面如下

Fs:采样频率;
Fc:截止频率。
2.导出滤波器系数
文件->导出,弹出导出界面如下

3.在Workspace查看滤波器系数
查看滤波器系数命令为
[a,b] = tf(Hd);//Hd为变量名
4.生成滤波器模型

目标:在哪个Simulink文件中生成filiter模块;
实现模型:生成模型。
5.代码示例
double b1[7] = {0.328603015244413,0,-0.985809045733238,0,0.985809045733238,0,-0.328603015244413};
double a1[7] = {1.0,5.081685231849039,11.479000532970600,14.588358090743688,10.988764421858018,4.656910559926142,0.877285250077527};
double b2[3] = {0.391335772501769,0.782671545003537,0.391335772501769};
double a2[3] = {1.0,0.369527377351241,0.195815712655833};
//带通滤波器程序
void ButtordBandpass(double in)
{
int i;
static double xBBuff[7] = {0,0,0,0,0,0,0};
static double yBBuff[7] = {0,0,0,0,0,0,0};
static int len = 0;
for(i=6;i>0;i--)
{
xBBuff[i] = xBBuff[i-1];
yBBuff[i] = yBBuff[i-1];
}
xBBuff[0] = in;
yBBuff[0] = 0;
for(i=1;i<7;i++)
{
yBBuff[0] = yBBuff[0] + b1[i]*xBBuff[i];
yBBuff[0] = yBBuff[0] - a1[i]*yBBuff[i];
}
yBBuff[0] = yBBuff[0] + b1[0]*xBBuff[0];
}
//低通滤波器程序
void ButtordLowpass(double in)
{
int i;
static double xLBuff[3] = {0,0,0};
static double yLBuff[3] = {0,0,0};
static int len = 0;
for(i=2;i>0;i--)
{
xLBuff[i] = xLBuff[i-1];
yLBuff[i] = yLBuff[i-1];
}
xLBuff[0] = in;
yLBuff[0] = 0;
for(i=1;i<3;i++)
{
yLBuff[0] = yLBuff[0] + b2[i]*xLBuff[i]
yLBuff[0] = yLBuff[0] - a2[i]*yLBuff[i];
}
yLBuff[0] = yLBuff[0] + b2[0]*xLBuff[0];
}
6.MATLAB验证
设计一个截止频率为200Hz的低通滤波器,对比滤波器为simulink自带的巴特沃斯低通滤波器
。
输入为频率为100Hz的正弦波,两者输出如下
(1)simulink自带的巴特沃斯低通滤波器仿真结果

幅值为7.067
(2)根据生成的滤波器系数编写的滤波函数的滤波结果

幅值为 9.703
输入为频率为200Hz的正弦波,两者输出如下
(1)simulink自带的巴特沃斯低通滤波器仿真结果

幅值为2.418
(2)根据生成的滤波器系数编写的滤波函数的滤波结果
幅值为7.07
输入为频率为500Hz的正弦波,两者输出如下
(1)simulink自带的巴特沃斯低通滤波器仿真结果

幅值为0.399
(2)根据生成的滤波器系数编写的滤波函数的滤波结果

幅值为1.557
输入为频率为1000Hz的正弦波,两者输出如下
(1)simulink自带的巴特沃斯低通滤波器仿真结果

幅值为0.098
(2)根据生成的滤波器系数编写的滤波函数的滤波结果

幅值为0.374
7.调试心得
在编写MATLAB代码时,由于变量定义为全局变量,又复制了好几个MATLAB Function模块,没想到不同模块间
全局变量相互影响,所以显示结果错的离谱。
浙公网安备 33010602011771号