C#与Matlab混合编程之巴特沃斯低通滤波器(转)
因为教研室项目要求,近期做了关于巴特沃斯滤波器部分,采用的是C#与Matlab混合编程的方式,由于是第一次写博客,还有许多不足的地方。
教研室用的VS版本为2017版,而MatlabR2012a和MatlabR2014b似乎并不支持VS2017版,经过几番折腾,确定Matlab为2016版。
Matlab2016a安装步骤及破解详见以下地址:
[http://jingyan.baidu.com/article/870c6fc300c2fab03ee4be70.html]
安装完成后,在安装目录下的toolbox\compiler\deploy\win64找到MCRInstaller点击安装,完成MCR的安装
Matlab2016a安装步骤及破解详见以下地址:
[http://jingyan.baidu.com/article/870c6fc300c2fab03ee4be70.html]
安装完成后,在安装目录下的toolbox\compiler\deploy\win64找到MCRInstaller点击安装,完成MCR的安装
1、安装及破解工作完成后打开Matlab软件,界面如下:
2、点击新建—>函数
function Y = b_filter(X,W1,W2,W3,W4,M)
if M==0 %低通滤波器
[n,Wn] = buttord(W1,W2,3,60);
[b,a] = butter(n,Wn,'low');
elseif M==1 %高通滤波器
[n,Wn] = buttord(W1,W2,3,60);
[b,a] = butter(n,Wn,'high');
elseif M==2 %带通滤波器
[n,Wn] = buttord([W1 W2],[W3 W4],3,60);
[b,a] = butter(n,Wn);
elseif M==3 %带阻
[n,Wn] = buttord([W1 W2],[W3 W4],3,60);
[b,a] = butter(n,Wn,'stop');
else%默认为低通滤波器
[n,Wn] = buttord(W1,W2,3,60);
[b,a] = butter(n,Wn,'low');
end
Y = filter(b,a,X);
end12345678910111213141516171819
if M==0 %低通滤波器
[n,Wn] = buttord(W1,W2,3,60);
[b,a] = butter(n,Wn,'low');
elseif M==1 %高通滤波器
[n,Wn] = buttord(W1,W2,3,60);
[b,a] = butter(n,Wn,'high');
elseif M==2 %带通滤波器
[n,Wn] = buttord([W1 W2],[W3 W4],3,60);
[b,a] = butter(n,Wn);
elseif M==3 %带阻
[n,Wn] = buttord([W1 W2],[W3 W4],3,60);
[b,a] = butter(n,Wn,'stop');
else%默认为低通滤波器
[n,Wn] = buttord(W1,W2,3,60);
[b,a] = butter(n,Wn,'low');
end
Y = filter(b,a,X);
end12345678910111213141516171819
在本次巴特沃斯低通滤波器的设计中,将通带最大衰减R_p取值为3dB,阻带最小衰减A_s取值为60dB,使用Matlab工具中的自带函数buttord得到阶次n和截止频率W_n,即:
[n, W_n] = buttord(W1,W2,3,60),其中W1和W2为C#部分中用户输入的截止频率w1和w2经过计算得到的数字频率;再用自带函数butter得到滤波器系数,即[b,a] = butter(n, W_n,’low’),其中b和a为分子和分母的系数;最后使用Matlab工具中的自带函数filter完成滤波,即filter(b,a,X),其中X为输入的原始数据。
[n, W_n] = buttord(W1,W2,3,60),其中W1和W2为C#部分中用户输入的截止频率w1和w2经过计算得到的数字频率;再用自带函数butter得到滤波器系数,即[b,a] = butter(n, W_n,’low’),其中b和a为分子和分母的系数;最后使用Matlab工具中的自带函数filter完成滤波,即filter(b,a,X),其中X为输入的原始数据。
3、接下来就是打包生成.dll文件,在命令窗口输入deploytool,如图:
点击回车,出现以下界面:
选择第三个,Library Complier
在第一个画圈处选择.NET Assembly,第二个画圈处添加已经写好的.m文件,并在下方namespace处写入C#中要引入的namespace,此处写为b_Filter:
然后下方的Application Information选择4.0
最后点击Package
等待一会儿就生成成功:
4、Matlab部分完成,接着就是C#,打开VS2017,打开解决方案资源管理器,在所在工程的引用处单击右键添加引用,选择浏览,按照打包成功后弹出的文件夹路径添加b_Filter.dll文件:
并且同时添加安装目录下的toolbox\dotnetbuilder\bin\win64\v2.0的MWArray.dll文件,添加完成后右键单击属性,将其版本设定为2.16.0.0:
与此同时记得在代码的开头添加:
using MathWorks.MATLAB.NET.Arrays;
5、在C#中完成巴特沃斯低通滤波器部分的代码,最终完成:
本文的最后再小小的介绍一下关于巴特沃斯滤波器的知识:
巴特沃斯滤波器又称最平幅度特性滤波器,N阶巴特沃斯模拟低通滤波器的特性为:
1、幅度函数为:
| H_a (jΩc) |= 1/√(1+〖(Ω/Ω_c )〗^2N ) ,N为滤波器阶数,Ωc为通带截止频率。
1、幅度函数为:
| H_a (jΩc) |= 1/√(1+〖(Ω/Ω_c )〗^2N ) ,N为滤波器阶数,Ωc为通带截止频率。
2、巴特沃斯低通滤波器幅度特性的特点:
(1)Ω = 0 时,| H_a (j0) | = 1,无衰减;
(2)、Ω = Ωc 时,| H_a (jΩ) | = 1/√2 = 0.707,即幅度衰减到0.707,R_c = - 20lg| H_a (jΩc) | = 3dB,R_c 称为通带最大衰减,不管阶数N为多少,所有幅度特性曲线都在Ω = Ωc处交汇于3dB衰减处,这就是3dB不变性;
(3)在0≤Ω≤Ωc的通带内,| H_a (jΩ) |有最大平坦的幅度特性,随着Ω由0增加到Ωc,| H_a (jΩ) |单调减小,N越大,减小得越慢,即N越大,通带内幅度特性越平坦;
(4)当Ω>Ωc,即在过渡带和阻带中,| H_a (jΩ) |单调减小,而且由于Ω/Ωc > 1,故比通带内衰减的速度要快得多,即N越大,| H_a (jΩ) |特性在这个频率范围衰减得更快。
(1)Ω = 0 时,| H_a (j0) | = 1,无衰减;
(2)、Ω = Ωc 时,| H_a (jΩ) | = 1/√2 = 0.707,即幅度衰减到0.707,R_c = - 20lg| H_a (jΩc) | = 3dB,R_c 称为通带最大衰减,不管阶数N为多少,所有幅度特性曲线都在Ω = Ωc处交汇于3dB衰减处,这就是3dB不变性;
(3)在0≤Ω≤Ωc的通带内,| H_a (jΩ) |有最大平坦的幅度特性,随着Ω由0增加到Ωc,| H_a (jΩ) |单调减小,N越大,减小得越慢,即N越大,通带内幅度特性越平坦;
(4)当Ω>Ωc,即在过渡带和阻带中,| H_a (jΩ) |单调减小,而且由于Ω/Ωc > 1,故比通带内衰减的速度要快得多,即N越大,| H_a (jΩ) |特性在这个频率范围衰减得更快。
3.巴特沃斯低通滤波器的设计参数的确定:
(1) 20lg|(H_a (j0))/(H_a (jΩ_p ) )| = -20lg|H_a (jΩ_p )| ≤ R_p ①
20lg|(H_a (j0))/(H_a (jΩ_st ) )| = -20lg|H_a (jΩ_st )| ≥ A_s ②
Ω_p:通带截止频率 R_p:Ω_p处〖|H〗_a (jΩ_p )|的衰减的最大值
Ω_st:阻带截止频率 A_s:Ω_st处|H_a (jΩ_st )|的衰减的最小值
(2)求滤波器阶次N
将| H_a (jΩc) |= 1/√(1+〖(Ω/Ω_c )〗^2N ) 代入①、②分别得到:
20lg|H_a (jΩ_p )| = -10lg[1+〖(Ω_p/Ωc)〗^2N] ≥ -R_p
20lg|H_a (jΩ_st )| = -10lg[1+〖(Ω_st/Ωc)〗^2N] ≤ -A_s
(〖10〗^(0.1A_s )-1)/(〖10〗^(0.1R_p )- 1) ≤ 〖(Ω_st/Ωp)〗^2N
20lg|(H_a (j0))/(H_a (jΩ_st ) )| = -20lg|H_a (jΩ_st )| ≥ A_s ②
Ω_p:通带截止频率 R_p:Ω_p处〖|H〗_a (jΩ_p )|的衰减的最大值
Ω_st:阻带截止频率 A_s:Ω_st处|H_a (jΩ_st )|的衰减的最小值
(2)求滤波器阶次N
将| H_a (jΩc) |= 1/√(1+〖(Ω/Ω_c )〗^2N ) 代入①、②分别得到:
20lg|H_a (jΩ_p )| = -10lg[1+〖(Ω_p/Ωc)〗^2N] ≥ -R_p
20lg|H_a (jΩ_st )| = -10lg[1+〖(Ω_st/Ωc)〗^2N] ≤ -A_s
(〖10〗^(0.1A_s )-1)/(〖10〗^(0.1R_p )- 1) ≤ 〖(Ω_st/Ωp)〗^2N
由此得出阶次N为:
N ≥ lg(〖10〗^(0.1A_(s )- 1)/(〖10〗^(0.1R_p )- 1))/[2lg(Ω_st/Ωp))]
N ≥ lg(〖10〗^(0.1A_(s )- 1)/(〖10〗^(0.1R_p )- 1))/[2lg(Ω_st/Ωp))]
1)、若R_p = 3dB,则Ω_p= Ωc,R_p = 10lg[1+〖(Ω_c/Ωc)〗^2N] = 10lg2,此时
N ≥ (lg(〖10〗^(0.1A_s )-1))/(2lg(Ω_st/Ωp))
N ≥ (lg(〖10〗^(0.1A_s )-1))/(2lg(Ω_st/Ωp))
2)、若R_p ≠ 3dB时,Ω_p ≠ Ωc,巴特沃斯滤波器归一化低通原型的通带截止频率为Ωc = 1,去归一化成任意截止频率Ωc时必须是3dB衰减处的Ωc,此时
Ωc = (Ω_cp+ Ω_cs)/2,其中
Ω_cp = Ω_p/√(2N&〖10〗^(0.1R_p )-1) , Ω_cs = Ω_st/ √(2N&〖10〗^(0.1A_s )-1)
Ωc = (Ω_cp+ Ω_cs)/2,其中
Ω_cp = Ω_p/√(2N&〖10〗^(0.1R_p )-1) , Ω_cs = Ω_st/ √(2N&〖10〗^(0.1A_s )-1)
在本次巴特沃斯低通滤波器的设计中,将通带最大衰减R_p取值为3dB,阻带最小衰减A_s取值为60dB,使用Matlab工具中的自带函数buttord得到阶次n和截止频率W_n,即:
[n, W_n] = buttord(W1,W2,3,60),其中W1和W2为用户输入的截止频率w1和w2经过计算得到的数字频率;再用自带函数butter得到滤波器系数,即[b,a] = butter(n, W_n,’low’),其中b和a为分子和分母的系数;最后使用Matlab工具中的自带函数filter完成滤波,即filter(b,a,X),其中X为输入的原始数据。
————————————————
版权声明:本文为CSDN博主「Ishara_xw」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34532511/article/details/78298102
[n, W_n] = buttord(W1,W2,3,60),其中W1和W2为用户输入的截止频率w1和w2经过计算得到的数字频率;再用自带函数butter得到滤波器系数,即[b,a] = butter(n, W_n,’low’),其中b和a为分子和分母的系数;最后使用Matlab工具中的自带函数filter完成滤波,即filter(b,a,X),其中X为输入的原始数据。
————————————————
版权声明:本文为CSDN博主「Ishara_xw」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34532511/article/details/78298102
本文来自博客园,作者:NLazyo,转载请注明原文链接:https://www.cnblogs.com/bile/p/12213341.html