大佬的一些文章
设计滤波器的参考链接
绘制伯德图的源码参考链接

一、设计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)滤波器的设计和幅频特性曲线绘制相关推荐

  1. java巴特沃斯滤波器编程_巴特沃斯(Butterworth)滤波器 (1)

    下面深入浅出讲一下Butterworth原理及其代码编写. 1. 首先考虑一个归一化的低通滤波器(截止频率是1),其幅度公式如下: 当n->∞时,得到一个理想的低通滤波反馈: ω<1时,增 ...

  2. 巴特沃斯(Butterworth)滤波器 (2) - 双线性变换

    这里接着上篇讲一下双线性变换Bilinear Transformation,它实现了模拟信号(连续域)与数字信号(离散域)之间的转换. 双线性变换公式如下: 反推可得到: 因此可以根据连续域传递函数推 ...

  3. 【老生谈算法】matlab实现巴特沃斯IIR滤波器程序设计源码

    matlab巴特沃斯IIR滤波器程序设计 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]matlab巴特沃斯IIR滤波器程序 ...

  4. MATLAB自修课_巴特沃斯二阶数字带通滤波器设计

    巴特沃斯二阶数字带通滤波器设计 理论来源:本例设计理论来自于<数字信号处理教程第五版-程佩青著> 设计注意:带通滤波器的阶次必须为偶次 设计验证: 滤波对象input = (15sin(2 ...

  5. 巴特沃斯数字低通滤波器的设计

    题目要求: 设计工作在采样频率80kHz的巴特沃斯数字低通滤波器,通带边界频率4kHz,通带最大衰减值0.5dB,阻带边界频率为20kHz,阻带最小衰减45dB.编程实现滤波器设计,并显示系统函数H( ...

  6. python巴特沃斯滤波器_butterworth-实时数字巴特沃斯IIR滤波器-Kei Imada

    作者:Kei Imada ### 作者邮箱:kimada1@swarthmore.edu ### 首页:https://github.com/keikun555/butter ### 文档:None ...

  7. 常用模拟低通滤波器的设计~经典 IIR 滤波器之巴特沃斯滤波器

    目录 常用模拟低通滤波器的设计--巴特沃斯(Butterworth)滤波器 1.确定系统函数的极点 2.巴特沃斯(Butterworth)滤波器 2.1.buttap 函数 2.2.buttord 函 ...

  8. 巴特沃斯低通滤波器归一化matlab,基于MATLAB设计巴特沃斯低通滤波器

    <基于MATLAB设计巴特沃斯低通滤波器>由会员分享,可在线阅读,更多相关<基于MATLAB设计巴特沃斯低通滤波器(6页珍藏版)>请在人人文库网上搜索. 1.基于MATLAB设 ...

  9. 算法学习 - 模拟滤波器(巴特沃斯、贝塞尔、切比雪夫、椭圆)及IIR滤波器设计

    摘要: 在进行信号处理算法的嵌入式代码实现时,经常需要设计滤波器来对信号进行预处理或者后处理.常用的有IIR滤波器和FIR滤波器.虽然IIR滤波器在稳定性和相位响应上比FIR滤波器较差,但是在相同滤波 ...

  10. MATLAB_数字信号处理_模拟滤波器_设计巴特沃斯滤波器

    简介 巴特沃斯滤波器-百度百科 巴特沃斯滤波器-维基百科 简介:巴特沃斯滤波器是一种模拟滤波器,它在频率响应方面具有特殊的属性.它被设计为具有均匀的幅度响应,即在通带内,它对所有频率的增益是相等的,而 ...

最新文章

  1. 从乘法表JAVA意思4_四、Java从头开始-我的九九乘法表(二)
  2. 算法-----前 k 个出现次数最多的单词
  3. WF 4.0 之持久化操作一:SqlServer方式的存储
  4. 推送改变世界!Push提高用户活跃度的三不原则
  5. 矩阵的乘法通用模板(C++/Java)
  6. 大数据集群中数据互相导通流程汇总(持续更新中)
  7. [CTF]思维导向图
  8. startx启动过程分析
  9. 深度学习自学(一):Loss function 损失函数
  10. 苹果手机上网速度慢_手机信号明明满格却上不去网?4招帮你搞定它!
  11. wifi rssi 计算 距离_用RSSI/TOF判断距离靠谱吗?浅谈RSSI/TOF测距优劣
  12. 关于unicode,mbcs,utf8,charset,encoding等相关概念的说明
  13. RHEL5下unixODBC 与 sqliteodbc 连接配置
  14. python3 shell,python3执行shell命令
  15. I210网卡LINUX的mac,intel(R)I211网卡刷I210简易教程
  16. Python3中使用flask_sqlalchemy的问题
  17. 网易2019实习生招聘编程题之数对
  18. 数学建模美国赛论文常用句式总结
  19. linux下查看显卡和驱动版本
  20. 延缓青少年近视进展的新方案

热门文章

  1. 《算法第4版》与《算法导论》比较
  2. VOIP语音电话配置
  3. 手把手教你使用EndNote X8 详细笔记
  4. 密码生成器c语言程序,C++全密码生成的实现代码
  5. 期末前端web大作业——基于HTML当当图书网项目的设计与实现 网上书城 网上书店 在线书店网页
  6. 如何在官网下载scala
  7. 基于Web的svg编辑器(2)——层次结构设计(DOM结构)
  8. 另类的切图仔画图方案:svg编辑器+css
  9. threejs添加天空盒
  10. 鞋城模板+html,西安锦绣鞋城整合营销策划方案