⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 巴特沃斯低通滤波器.cpp

📁 butterworth低通滤波器的原程序
💻 CPP
字号:
#include<iostream>
#include<cmath>
#include<fstream>
using namespace std;
const double pi=4*atan(1);
void butterworthlowpass(double,double,double,double,double);
int main()
{
	//数字低通滤波器性能要求
    double f,fc,fst;//f:抽样频率;fc:通带截止频率;fst:阻带截止频率
    double q1,q2;//q1:通带允许的最大衰减;q2:阻带允许的最小衰减
	cout<<"please input the parameter:"<<endl;
	cin>>f>>fc>>fst>>q1>>q2;
	butterworthlowpass( f,fc,fst, q1, q2);
    return 0;}

void butterworthlowpass(double f,double fc,double fst,double q1,double q2)
{	double Wc,Wst;//数字频率
     Wc=2*pi*fc/f;
	 Wst=2*pi*fst/f;
	//转换为模拟低通滤波器性能要求
    double Uc,Ust,Usc,Ksc;
     Uc=2*f*tan(Wc/2);
     Ust=2*f*tan(Wst/2);
     Usc=Ust/Uc;
     Ksc=sqrt((pow(10,0.1*q1)-1)/(pow(10,0.1*q2)-1));
    double log(double num);
    double v;
    v=-log(Ksc)/log(Usc);//计算阶数
    double ceil(double x);
   int N=ceil(v);//阶数圆整
    double Up;
    Up=Uc*pow((pow(10,0.1*q1)-1),-(1/(2*N)));
    double a,b[20],d;//模拟低通滤波器系统函数参数
	a=1;
	d=1;
	int k;
	for(k=1;k<=(N/2);k++)
	{b[k]=-2*Up*cos(pi/2+(2*k-1)*pi/(2*N));
	}

	double c;
     c=2*f;
	double A0[20],A1[50],A2[50],B0[50],B1[50],B2[50],R[50];//数字低通滤波器系统函数参数
	ofstream outfile("f1.dat",ios::out);//定义文件流对象,打开磁盘文件“f1.dat"
	if(!outfile)
	{ 
	   cerr<<"open error!"<<endl;
	exit(1);
	}
	for (k=1;k<=N/2;k++)
	{
		R[k]=c*c+c*b[k]+Up*Up;
		A0[k]=Up*Up/R[k];
		A1[k]=2*A0[k];
		A2[k]=A0[k];
		B0[k]=1;
		B1[k]=(2*Up*Up-2*c*c)/R[k];
		B2[k]=(Up*Up-b[k]*c+c*c)/R[k];
	}
cout<<v<<endl;
		if (N%2==0)
		{
			for (k=1;k<=N/2;k++)
				outfile<<endl<<A0[k]<<" "<<A1[k]<<" "<<A2[k]<<" "<<B0[k]<<" "<<B1[k]<<" "<<B2[k]<<endl;
				}
		else 
		{
			outfile<<endl<<1/(1+c)<<" "<<1/(1+c)<<" "<<1<<" "<<(1-c)/(1+c)<<endl;
for (k=1;k<=N/2;k++)
				outfile<<A0[k]<<" "<<A1[k]<<" "<<A2[k]<<" "<<B0[k]<<" "<<B1[k]<<" "<<B2[k]<<endl;
		}
		
	outfile.close();	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -