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

📄 iir_chebyshev_i.cpp

📁 II滤波器的chebyshev滤波器的C语言程序设计。
💻 CPP
字号:
#include <stdio.h>
#include <math.h>

//Chebyshev_I:the filter of Chebyshev_I generator.
void Chebyshev_I(double * cheby_real,double * cheby_imag,int n);

//return_z:from p to z. (H(p)->H(z))
void return_z(double *z,double qp);

//complex_***:the base operation of th complex.
void complex_add(double * out_real,double * out_imag,double in_real,double in_imag);
void complex_sub(double * out_real,double * out_imag,double in_real,double in_imag);
void complex_mul(double * out_real,double * out_imag,double in_real,double in_imag);
void complex_div(double * out_real,double * out_imag,double in_real,double in_imag);

//return_z:get the times of filter equation.
int return_n(double as,double ap,double ls);

//digit_low_filter:the digit low pass filter generator.
//wp:the end frequence.
//ws:the bigin frequence of fobid band.
//as:the max decay of pass band.
//ap:the min decay of close band.  
void digit_low_filter(double * out_real,double * out_imag,double wp,double ws,double as,double ap);

void Chebyshev_I(double * cheby_real,double * cheby_imag,int n)
{
	int i;
	double k;
	for (i=0;i<n;i++)
	{
		k=(2*(i+1)-1)*pi/(2*n);
		cheby_real[i]=cos(k);
		cheby_imag[i]=sin(k);
	}
}

void return_z(double *z,double qp)
{
	int i;
	for (i=0;i<M;i++)
		z[i]=(i+1-1)/(qp*(i+1+1));
}

void complex_add(double * out_real,double * out_imag,double in_real,double in_imag)
{
	*out_real=*out_real+in_real;
	*out_imag=*out_imag+in_imag;
}

void complex_sub(double * out_real,double * out_imag,double in_real,double in_imag)
{
	*out_real=*out_real-in_real;
	*out_imag=*out_imag-in_imag;
}

void complex_mul(double * out_real,double * out_imag,double in_real,double in_imag)
{
	double temp_real,temp_imag;
	temp_real=(*out_real)*in_real-(*out_imag)*in_imag;
	temp_imag=(*out_real)*in_imag+(*out_imag)*in_real;
	*out_real=temp_real;
	*out_imag=temp_imag;
}

void complex_div(double * out_real,double * out_imag,double in_real,double in_imag)
{
	double temp;
	complex_mul(out_real,out_imag,in_real,-in_imag);
	temp=in_real*in_real+in_imag*in_imag;
	*out_real=*out_real/temp;
	*out_imag=*out_imag/temp;
}

int return_n(double as,double ap,double ls)
{
	int n;
	double temp1,temp2,temp3,temp4,temp5;
	temp1=pow(10,as/10)-1;
    temp2=pow(10,ap/10)-1;
	temp3=sqrt(temp1*temp2);
	temp4=log10(temp3);
	temp5=log10(ls);
    n=(int)(temp4/temp5+1);
	return n;
}

void digit_low_filter(double * out_real,double * out_imag,double wp,double ws,double as,double ap)
{
	double qp,qs,ls,lp;
	int n;
	qp=tan(wp/2);
	qs=tan(ws/2);
	lp=1;
	ls=qs/qp;
	n=return_n(as,ap,ls);
    Butterworth(out_real,out_imag,n,qp);
}

void main()
{
	double * outreal,outr;
	double * outimag,outi;
	double inreal;
	double inimag;
	int i,n;
	double as,ap,wp,ws,ls,fs;
	double out_real[M],out_imag[M];
	outreal=&outr;
	outimag=&outi;
	*outreal=1;
	*outimag=1;
	inreal=1;
	inimag=-1;
	fs=1000;
	as=20;
	ap=3;
	ls=2;
	wp=2*100*pi/fs;
	ws=2*300*pi/fs;
    complex_div(outreal,outimag,inreal,inimag);
	printf("real=%f;imag=%f",*outreal,*outimag);
	n=return_n(as,ap,ls);
	printf("\nn=%d",n);
	digit_low_filter(out_real,out_imag,wp,ws,as,ap);
	for (i=990;i<1000;i++)
	printf("\nreal=%f;imag=%f",out_real[i],out_imag[i]);
}

⌨️ 快捷键说明

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