📄 iir_chebyshev_i.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 + -