日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

巴特沃斯(Butterworth)滤波器的设计和幅频特性曲线绘制

發布時間:2023/12/31 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 巴特沃斯(Butterworth)滤波器的设计和幅频特性曲线绘制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大佬的一些文章
設計濾波器的參考鏈接
繪制伯德圖的源碼參考鏈接

一、設計Butterworth濾波器

設計濾波器,其實就是設計傳遞函數,butterworth低通濾波器的傳遞函數如下:

對于butterworth高通濾波器,唯一的區別是分子項,從1變為s^N。
高低通Butterworth濾波器歸一化后的系數如下:
(所謂歸一化,就是只按照階數來定系數,不考慮截止頻率)

反歸一化過程(考慮截止頻率):將s用以下公式代替,wc為截止頻率,單位rad/s。

就得到考慮了階數以及截至頻率的Butterworth濾波器的傳遞函數。

1.1 利用matlab獲取濾波器的歸一化系數

在Matlab中,通過改變下面代碼的N值(階數),可以得到任意階的歸一化系數,(上面只給出了10階的,你可以對比看看對不對)。

clc;clear N = 10;%階數 wc = 1;%截至頻率設置為1rad/s,這樣相當于歸一化[B,A]= butter(N,wc,'s') %代入N和wn設計低通巴特沃斯模擬濾波器 %[B,A]= butter(N,wc,'high','s') %代入N和wn設計高通巴特沃斯模擬濾波器 B=B./B(N); A=A./B(N);

1.2 設計低通Butterworth濾波器

還記得上面說的嗎?設計濾波器就是設計傳遞函數的分子項和分母項的系數。

%% butterworth濾波器的歸一化系數,共7階coff=[1 1 0 0 0 0 0 0;1 sqrt(2) 1 0 0 0 0 0;1 2 2 1 0 0 0 0;1 2.6131 3.4142 2.6131 1 0 0 0;1 3.2361 5.2361 5.2361 3.2361 1 0 0;1 3.8637 7.4641 9.1416 7.4641 3.8637 1 0;1 4.4940 10.0978 14.5918 14.5918 10.0978 4.4940 1];N=4;%濾波器的階數wc=90;%單位Hzwc=2*pi*wc;%轉換為rad/snum1=[0 0 0 0 1]; %分子系數for i=1:(N+1)den1(i)=coff(N,i)*(1/wc)^(N-i+1);%分母系數end%整理系數num1=num1/den1(1);den1=den1/den1(1);

1.3 設計高通Butterworth濾波器

高低通的區別,僅僅只是分子項的區別。
對于低通,分子項為1;——以5階為例為[0 0 0 0 1]
對于高通,分子項為s^n;——以5階為例為[1 0 0 0 0]

%% butterworth濾波器的歸一化系數,共7階coff=[1 1 0 0 0 0 0 0;1 sqrt(2) 1 0 0 0 0 0;1 2 2 1 0 0 0 0;1 2.6131 3.4142 2.6131 1 0 0 0;1 3.2361 5.2361 5.2361 3.2361 1 0 0;1 3.8637 7.4641 9.1416 7.4641 3.8637 1 0;1 4.4940 10.0978 14.5918 14.5918 10.0978 4.4940 1];N=4;%濾波器的階數wc=90;%單位Hzwc=2*pi*wc;%轉換為rad/snum1=[1 0 0 0 0]; %分子系數for i=1:(N+1)den1(i)=coff(N,i)*(1/wc)^(N-i+1);%分母系數end%整理系數num1=num1/den1(1);den1=den1/den1(1);

二、C++源碼——繪制伯德圖

頭文件和cpp文件見最末尾,具體使用方法如下:

//在應用的頭文件類中 #include "bode.h"Bode HighPassCurveData;//高通濾波器數據//在應用的cpp文件中 //butterworth濾波器的歸一化系數,共8階 double coff[8][9]={1,1,0,0,0,0,0,0,0,1,1.4142,1,0,0,0,0,0,0,1,2,2,1,0,0,0,0,0,1,2.6131,3.4142,2.6131,1,0,0,0,0,1,3.2361,5.2361,5.2361,3.2361,1,0,0,0,1,3.8637,7.4641,9.1416,7.4641,3.8637,1,0,0,1,4.4940,10.0978,14.5918,14.5918,10.0978,4.4940,1,0,1,5.1258309,13.1370712,21.846151,25.6883559,21.846151,13.1370712,5.1258309,1};//更新高通濾波器的幅頻曲線 HighPassCurveData._TF.n=OrderHighPass+1; HighPassCurveData._TF.d=OrderHighPass+1;//定義分子項系數 double tempvalue=1.0/(2*PI*CutOffFreqHighPass); HighPassCurveData._TF.num[0]=pow(tempvalue,OrderHighPass);; for(int i=1;i<HighPassCurveData._TF.n;++i) {HighPassCurveData._TF.num[i]=0; }//定義分母項系數 for(int i=0;i<HighPassCurveData._TF.d;++i) {HighPassCurveData._TF.den[i]=coff[OrderHighPass-1][i]*pow(tempvalue,OrderHighPass-i); }HighPassCurveData._wlen=LEN;//幅頻特性曲線的數據長度 HighPassCurveData.freData = new struct fre[LEN]; HighPassCurveData.BodeData =new struct BodeNum[LEN]; for(int i=0;i<LEN;i++) {HighPassCurveData.freData[i].f=Xaxisdata[i];//幅頻特性曲線的X軸坐標,單位HzHighPassCurveData.freData[i].w=HighPassCurveData.freData[i].f*2*PI;//轉換單位為rad/s } //計算幅頻特性曲線各頻點的幅度值 HighPassCurveData.compute();

頭文件如下:

#ifndef BODE_H #define BODE_H /****************************************************************************** * 文件 : bode.h * 作者 : dhs 746769845@qq.com * 版本 : V1.0 * 日期 : 2020-7-31 * 描述 : 給定傳遞函數繪制,計算對應的波特圖坐標的數據(幅值、相角) * ******************************************************************************/ #include <complex> #include <cmath> using namespace std;#define PI 3.1415926535 /*傳遞函數結構體*/ struct TransferFunction {double num[10]; //傳遞函數分子項double den[10]; //傳遞函數分母項char n; //分子個數char d; //分母個數 }; /*幅值、相角結構體*/ struct BodeNum {double mag; //幅值 dbdouble phase; //相角 度(角度) }; /*頻率、角頻率結構體*/ struct fre {double f; //頻率 Hzdouble w; //角頻率 rad/s }; class Bode { public:Bode(struct TransferFunction TF); //傳入傳遞函數~Bode();struct BodeNum *compute(); //完成計算struct fre *logspace(int start, int stop, int num=50, int base=10.0);//產生輸入的頻率數組int getWlen(){return _wlen;} //獲取數組長度private:struct TransferFunction _TF; //傳遞函數double *_w; //頻率指針int _wlen; //頻率長度struct fre *freData; //頻率、角頻率struct BodeNum *BodeData; //幅值、相角 };#endif // BODE_H

cpp文件如下:

/****************************************************************************** * 文件 : bode.h * 作者 : dhs 746769845@qq.com * 版本 : V1.0 * 日期 : 2020-7-31 * 描述 : 給定傳遞函數繪制,計算對應的波特圖坐標的數據(幅值、相角) * ******************************************************************************/ #include "bode.h"/******************************************************************************* * 函 數 名 : Bode * 函數功能 : bode類,構造函數 * 輸入參數 : TF --> 傳入傳遞函數 * 返 回 值 : 無 *******************************************************************************/ Bode::Bode(struct TransferFunction TF):_TF(TF) {freData = 0;BodeData = 0; } /******************************************************************************* * 函 數 名 : compute() * 函數功能 : bode圖數據計算 * 輸入參數 : 無 * 返 回 值 : bode圖計算后的數據(數組指針) *******************************************************************************/ struct BodeNum *Bode::compute() {int i=0;int j=0;complex<double> ds,ms,s,j1;if(freData ==0){return 0;}ds=ms={0,0};j1={0,1}; //虛數單位for (i=0; i<_wlen; i++){s=j1*freData[i].w; //傳遞函數中的 s用jw代入ms ={0,0}; //保存分子項ds ={0,0}; //保存分母項for (j=0; j<_TF.n; j++){ms= ms * s + _TF.num[j];}for (j=0; j<_TF.d; j++){ds= ds * s + _TF.den[j];}s = ms/ds;BodeData[i].mag = 20.0 * log10(abs(s)); //20倍 log10幅度值BodeData[i].phase = atan2(s.imag(),s.real()) * 180.0 / PI; //相角值}return BodeData; } /******************************************************************************* * 函 數 名 : logspace * 函數功能 : 生成頻率 * 輸入參數 : start-->對數開始的冥 * stop -->對數結束的冥 * num --> 生成頻率的個數 默認50 * base --> 對數的底 默認為10 * 例:logspace(-2, 5, 200, 10) //表示從0.01Hz~0.1MHz按照10倍頻的間距 生成200個頻率 * 返 回 值 : 返回生成的頻率(數組指針) *******************************************************************************/ struct fre *Bode::logspace(int start, int stop, int num, int base) {double step=0;int i =0;_wlen = num;freData = new struct fre[num];BodeData =new struct BodeNum[num];step =(stop-start)/(num-1.0);for(i=0;i<num; i++){freData[i].f=pow(base, start+step*i);freData[i].w=freData[i].f*2*PI;}return freData;} /******************************************************************************* * 函 數 名 : ~Bode * 函數功能 : 析構 * 輸入參數 : * 返 回 值 : *******************************************************************************/ Bode::~Bode() {delete BodeData;delete freData;}

總結

以上是生活随笔為你收集整理的巴特沃斯(Butterworth)滤波器的设计和幅频特性曲线绘制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。