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的安裝
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文件:

並且同時添加安裝目錄下的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為通帶截止頻率。
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM