巴特沃斯(Butterworth)滤波器的设计和幅频特性曲线绘制
生活随笔
收集整理的這篇文章主要介紹了
巴特沃斯(Butterworth)滤波器的设计和幅频特性曲线绘制
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
大佬的一些文章
設(shè)計濾波器的參考鏈接
繪制伯德圖的源碼參考鏈接
一、設(shè)計Butterworth濾波器
設(shè)計濾波器,其實就是設(shè)計傳遞函數(shù),butterworth低通濾波器的傳遞函數(shù)如下:
對于butterworth高通濾波器,唯一的區(qū)別是分子項,從1變?yōu)閟^N。
高低通Butterworth濾波器歸一化后的系數(shù)如下:
(所謂歸一化,就是只按照階數(shù)來定系數(shù),不考慮截止頻率)
反歸一化過程(考慮截止頻率):將s用以下公式代替,wc為截止頻率,單位rad/s。
就得到考慮了階數(shù)以及截至頻率的Butterworth濾波器的傳遞函數(shù)。
1.1 利用matlab獲取濾波器的歸一化系數(shù)
在Matlab中,通過改變下面代碼的N值(階數(shù)),可以得到任意階的歸一化系數(shù),(上面只給出了10階的,你可以對比看看對不對)。
clc;clear N = 10;%階數(shù) wc = 1;%截至頻率設(shè)置為1rad/s,這樣相當(dāng)于歸一化[B,A]= butter(N,wc,'s') %代入N和wn設(shè)計低通巴特沃斯模擬濾波器 %[B,A]= butter(N,wc,'high','s') %代入N和wn設(shè)計高通巴特沃斯模擬濾波器 B=B./B(N); A=A./B(N);1.2 設(shè)計低通Butterworth濾波器
還記得上面說的嗎?設(shè)計濾波器就是設(shè)計傳遞函數(shù)的分子項和分母項的系數(shù)。
%% butterworth濾波器的歸一化系數(shù),共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;%濾波器的階數(shù)wc=90;%單位Hzwc=2*pi*wc;%轉(zhuǎn)換為rad/snum1=[0 0 0 0 1]; %分子系數(shù)for i=1:(N+1)den1(i)=coff(N,i)*(1/wc)^(N-i+1);%分母系數(shù)end%整理系數(shù)num1=num1/den1(1);den1=den1/den1(1);1.3 設(shè)計高通Butterworth濾波器
高低通的區(qū)別,僅僅只是分子項的區(qū)別。
對于低通,分子項為1;——以5階為例為[0 0 0 0 1]
對于高通,分子項為s^n;——以5階為例為[1 0 0 0 0]
二、C++源碼——繪制伯德圖
頭文件和cpp文件見最末尾,具體使用方法如下:
//在應(yīng)用的頭文件類中 #include "bode.h"Bode HighPassCurveData;//高通濾波器數(shù)據(jù)//在應(yīng)用的cpp文件中 //butterworth濾波器的歸一化系數(shù),共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;//定義分子項系數(shù) 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; }//定義分母項系數(shù) for(int i=0;i<HighPassCurveData._TF.d;++i) {HighPassCurveData._TF.den[i]=coff[OrderHighPass-1][i]*pow(tempvalue,OrderHighPass-i); }HighPassCurveData._wlen=LEN;//幅頻特性曲線的數(shù)據(jù)長度 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;//轉(zhuǎn)換單位為rad/s } //計算幅頻特性曲線各頻點的幅度值 HighPassCurveData.compute();頭文件如下:
#ifndef BODE_H #define BODE_H /****************************************************************************** * 文件 : bode.h * 作者 : dhs 746769845@qq.com * 版本 : V1.0 * 日期 : 2020-7-31 * 描述 : 給定傳遞函數(shù)繪制,計算對應(yīng)的波特圖坐標的數(shù)據(jù)(幅值、相角) * ******************************************************************************/ #include <complex> #include <cmath> using namespace std;#define PI 3.1415926535 /*傳遞函數(shù)結(jié)構(gòu)體*/ struct TransferFunction {double num[10]; //傳遞函數(shù)分子項double den[10]; //傳遞函數(shù)分母項char n; //分子個數(shù)char d; //分母個數(shù) }; /*幅值、相角結(jié)構(gòu)體*/ struct BodeNum {double mag; //幅值 dbdouble phase; //相角 度(角度) }; /*頻率、角頻率結(jié)構(gòu)體*/ struct fre {double f; //頻率 Hzdouble w; //角頻率 rad/s }; class Bode { public:Bode(struct TransferFunction TF); //傳入傳遞函數(shù)~Bode();struct BodeNum *compute(); //完成計算struct fre *logspace(int start, int stop, int num=50, int base=10.0);//產(chǎn)生輸入的頻率數(shù)組int getWlen(){return _wlen;} //獲取數(shù)組長度private:struct TransferFunction _TF; //傳遞函數(shù)double *_w; //頻率指針int _wlen; //頻率長度struct fre *freData; //頻率、角頻率struct BodeNum *BodeData; //幅值、相角 };#endif // BODE_Hcpp文件如下:
/****************************************************************************** * 文件 : bode.h * 作者 : dhs 746769845@qq.com * 版本 : V1.0 * 日期 : 2020-7-31 * 描述 : 給定傳遞函數(shù)繪制,計算對應(yīng)的波特圖坐標的數(shù)據(jù)(幅值、相角) * ******************************************************************************/ #include "bode.h"/******************************************************************************* * 函 數(shù) 名 : Bode * 函數(shù)功能 : bode類,構(gòu)造函數(shù) * 輸入?yún)?shù) : TF --> 傳入傳遞函數(shù) * 返 回 值 : 無 *******************************************************************************/ Bode::Bode(struct TransferFunction TF):_TF(TF) {freData = 0;BodeData = 0; } /******************************************************************************* * 函 數(shù) 名 : compute() * 函數(shù)功能 : bode圖數(shù)據(jù)計算 * 輸入?yún)?shù) : 無 * 返 回 值 : bode圖計算后的數(shù)據(jù)(數(shù)組指針) *******************************************************************************/ 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}; //虛數(shù)單位for (i=0; i<_wlen; i++){s=j1*freData[i].w; //傳遞函數(shù)中的 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; } /******************************************************************************* * 函 數(shù) 名 : logspace * 函數(shù)功能 : 生成頻率 * 輸入?yún)?shù) : start-->對數(shù)開始的冥 * stop -->對數(shù)結(jié)束的冥 * num --> 生成頻率的個數(shù) 默認50 * base --> 對數(shù)的底 默認為10 * 例:logspace(-2, 5, 200, 10) //表示從0.01Hz~0.1MHz按照10倍頻的間距 生成200個頻率 * 返 回 值 : 返回生成的頻率(數(shù)組指針) *******************************************************************************/ 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;} /******************************************************************************* * 函 數(shù) 名 : ~Bode * 函數(shù)功能 : 析構(gòu) * 輸入?yún)?shù) : * 返 回 值 : *******************************************************************************/ Bode::~Bode() {delete BodeData;delete freData;}總結(jié)
以上是生活随笔為你收集整理的巴特沃斯(Butterworth)滤波器的设计和幅频特性曲线绘制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像分割python代码_SILC超像素
- 下一篇: 升讯威周报与工时统计系统 V3