zoukankan      html  css  js  c++  java
  • C#与Matlab混合编程之巴特沃斯低通滤波器(转)

    因为教研室项目要求,近期做了关于巴特沃斯滤波器部分,采用的是C#与Matlab混合编程的方式,由于是第一次写博客,还有许多不足的地方。
    教研室用的VS版本为2017版,而MatlabR2012a和MatlabR2014b似乎并不支持VS2017版,经过几番折腾,确定Matlab为2016版。
    Matlab2016a安装步骤及破解详见以下地址:
    [http://jingyan.baidu.com/article/870c6fc300c2fab03ee4be70.html]
    安装完成后,在安装目录下的toolboxcompilerdeploywin64找到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
    在本次巴特沃斯低通滤波器的设计中,将通带最大衰减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为输入的原始数据。
    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文件:

    并且同时添加安装目录下的toolboxdotnetbuilderinwin64v2.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为通带截止频率。
    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Ω)  |特性在这个频率范围衰减得更快。
    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
    由此得出阶次N为: 
       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))
    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)
    在本次巴特沃斯低通滤波器的设计中,将通带最大衰减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
  • 相关阅读:
    Building a Basic .NET Remoting Application
    Building a Basic .NET Remoting Application 之一 Building a Remotable Type
    Type Library Exporter (Tlbexp.exe)
    .NET Remoting Architecture
    Runtime Hosts
    Building a Basic .NET Remoting Application 之二 Building a Host Application
    Building a Basic .NET Remoting Application 之三 Building a Client Application
    C语言字符串大全(转自百度百科)
    作业 双向链表
    递推练习 简单n!
  • 原文地址:https://www.cnblogs.com/bile/p/12213341.html
Copyright © 2011-2022 走看看