滤波器代码.docx
《滤波器代码.docx》由会员分享,可在线阅读,更多相关《滤波器代码.docx(23页珍藏版)》请在冰点文库上搜索。
滤波器代码
#include
#include
doublePI=3.141592654;
intmain()
{
voidLPF();//低通滤波器函数的声明
voidHPF();//高通滤波器函数的声明
voidBPF();//带通滤波器函数的声明
voidBSF();//带通滤波器函数的声明
chara,b;
printf("请选择滤波器类型:
A:
低通B:
高通C:
带通D:
带阻\n\n");
scanf("%c",&a);
b=getchar();
printf("\n确认选择:
");
switch(getchar())
{
case'a':
case'A':
LPF();break;
case'b':
case'B':
HPF();break;
case'c':
case'C':
BPF();break;
case'd':
case'D':
BSF();break;
default:
putchar('\a');
}
system("pause");
return0;
}
voidLPF()//低通滤波器
{
intN,M,i,k;
doublewp,ws,as,wd,Bt;
doublehd[10000]={0.0};
printf("\n请输入设计指标\n\n");
printf("*********************************\n\n");
printf("通带截至频率wp(以Pi为单位):
");
scanf("%lf",&wp);
printf("\n阻带起始频率ws(以Pi为单位):
");
scanf("%lf",&ws);
printf("\n阻带最小衰减as:
");
scanf("%lf",&as);
printf("\n*********************************\n");
printf("\n\n\n");
wd=0.5*(wp+ws);
Bt=ws-wp;
printf("以下窗口类型可供你选择\n\n");
printf("***********************************************\n");
printf("标号窗口类型阻带最小衰减*\n");
printf("1:
矩形窗21dB*\n");
printf("2:
巴特列特窗(三角形窗)25dB*\n");
printf("3:
汉宁窗(升余弦窗)44dB*\n");
printf("4:
汉明窗(改进的升余弦窗)53dB*\n");
printf("5:
布莱克曼窗(二阶升余弦窗)74dB*\n");
printf("***********************************************");
printf("\n\n请你根据as选择合适的窗:
");
scanf("%d",&k);
printf("\n\n结果如下:
\n\n\n");
if(k=1)//选用矩形窗
{
N=(int)(4/Bt+0.5);
if(fmod(N,2.)==0)//判断N的奇偶性,若为偶则加1
{
N++;
M=(N-1)/2;
}
elseM=(N-1)/2;
printf("hn的长度为:
%d\n\n",N);
printf("hn序列:
\n\n");
for(i=0;i{
hd[i]=sin(wd*PI*(i-M))/(PI*(i-M));
printf("%lf\t",hd[i]);
}
printf("\n\n\n");
}
elseif(k=2)//选用三角窗
{
N=(int)(8/Bt+0.5);
if(fmod(N,2.)==0)
{
N++;
M=(N-1)/2;
}
elseM=(N-1)/2;
printf("hn的长度为:
%d\n\n",N);
printf("hn序列:
\n\n");
for(i=0;i<=M;i++)
{
hd[i]=sin(wd*PI*(i-M))/(PI*(i-M));
hd[i]=hd[i]*(2*i/(N-1));
}
for(i=M+1;i{
hd[i]=sin(wd*PI*(i-M))/(PI*(i-M));
hd[i]=hd[i]*(2-2*i/(N-1));
printf("%lf\t",hd[i]);
}
printf("\n\n\n");
}
elseif(k=3)//选用汉宁窗
{
N=(int)(8/Bt+0.5);
if(fmod(N,2.)==0)
{
N++;
M=(N-1)/2;
}
elseM=(N-1)/2;
printf("hn的长度为:
%d\n\n",N);
printf("hn序列:
\n\n");
for(i=0;i{
hd[i]=sin(wd*PI*(i-M))/(PI*(i-M));
hd[i]=hd[i]*(0.5*(1-cos(2*PI*i/(N-1))));
printf("%lf\t",hd[i]);
}
printf("\n\n\n");
}
elseif(k=4)//选用汉明窗
{
N=(int)(8/Bt+0.5);
if(fmod(N,2.)==0)
{
N++;
M=(N-1)/2;
}
elseM=(N-1)/2;
printf("hn的长度为:
%d\n\n",N);
printf("hn序列:
\n\n");
for(i=0;i{
hd[i]=sin(wd*PI*(i-M))/(PI*(i-M));
hd[i]=hd[i]*(0.54-0.46*cos(2*PI/(N-1)));
printf("%lf\t",hd[i]);
}
printf("\n\n\n");
}
elseif(k=5)//选用布莱克曼窗
{
N=(int)(12/Bt+0.5);
if(fmod(N,2.)==0)
{
N++;
M=(N-1)/2;
}
elseM=(N-1)/2;
printf("hn的长度为:
%d\n\n",N);
printf("hn序列:
\n\n");
for(i=0;i{
hd[i]=sin(wd*PI*(i-M))/(PI*(i-M));
hd[i]=hd[i]*(0.42-0.5*cos(2*PI*i/(N-1))+0.08*cos(4*PI*i/(N-1)));
printf("%lf\t",hd[i]);
}
printf("\n\n\n");
}
}
voidHPF()//高通滤波器
{
intN,M,i,k;
doublewp,ws,as,wd,Bt;
doublehd[10000]={0.0},dd[10000]={1.0};
printf("\n请输入设计指标:
\n\n");
printf("*********************************\n\n");
printf("通带截至频率wp(以Pi为单位):
");
scanf("%lf",&wp);
printf("\n阻带起始频率ws(以Pi为单位):
");
scanf("%lf",&ws);
printf("\n阻带最小衰减as:
");
scanf("%lf",&as);
printf("\n*********************************\n");
printf("\n\n\n");
wd=0.5*(wp+ws);
Bt=wp-ws;
printf("以下窗口类型可供你选择\n\n");
printf("***********************************************\n");
printf("标号窗口类型阻带最小衰减*\n");
printf("1:
矩形窗21dB*\n");
printf("2:
巴特列特窗(三角形窗)25dB*\n");
printf("3:
汉宁窗(升余弦窗)44dB*\n");
printf("4:
汉明窗(改进的升余弦窗)53dB*\n");
printf("5:
布莱克曼窗(二阶升余弦窗)74dB*\n");
printf("***********************************************");
printf("\n\n请你根据as选择合适的窗:
");
scanf("%d",&k);
printf("\n\n结果如下:
\n\n\n");
if(k=1)//选用矩形窗
{
N=(int)(4/Bt+0.5);
if(fmod(N,2.)==0)
{
N++;
M=(N-1)/2;
}
elseM=(N-1)/2;
printf("hn的长度为:
%d\n\n",N);
printf("hn序列:
\n\n");
for(i=0;i{
hd[i]=sin(wd*PI*(i-M))/(PI*(i-M));
hd[i]=dd[i]-hd[i];
printf("%lf\t",hd[i]);
}
printf("\n\n\n");
}
elseif(k=2)//选用三角窗
{
N=(int)(8/Bt+0.5);
if(fmod(N,2.)==0)
{
N++;
M=(N-1)/2;
}
elseM=(N-1)/2;
printf("hn的长度为:
%d\n\n",N);
printf("hn序列:
\n\n");
for(i=0;i<=M;i++)
{
hd[i]=sin(wd*PI*(i-M))/(PI*(i-M));
hd[i]=dd[i]-hd[i];
hd[i]=hd[i]*(2*i/(N-1));
}
for(i=M+1;i{
hd[i]=sin(wd*PI*(i-M))/(PI*(i-M));
hd[i]=dd[i]-hd[i];
hd[i]=hd[i]*(2-2*i/(N-1));
printf("%lf\t",hd[i]);
}
printf("\n\n\n");
}
elseif(k=3)//选用汉宁窗
{
N=(int)(8/Bt+0.5);
if(fmod(N,2.)==0)
{
N++;
M=(N-1)/2;
}
elseM=(N-1)/2;
printf("hn的长度为:
%d\n\n",N);
printf("hn序列:
\n\n");
for(i=0;i{
hd[i]=sin(wd*PI*(i-M))/(PI*(i-M));
hd[i]=dd[i]-hd[i];
hd[i]=hd[i]*(0.5*(1-cos(2*PI*i/(N-1))));
printf("%lf\t",hd[i]);
}
printf("\n\n\n");
}
elseif(k=4)//选用汉明窗
{
N=(int)(8/Bt+0.5);
if(fmod(N,2.)==0)
{
N++;
M=(N-1)/2;
}
elseM=(N-1)/2;
printf("hn的长度为:
%d\n\n",N);
printf("hn序列:
\n\n");
for(i=0;i{
hd[i]=sin(wd*PI*(i-M))/(PI*(i-M));
hd[i]=dd[i]-hd[i];
hd[i]=hd[i]*(0.54-0.46*cos(2*PI/(N-1)));
printf("%lf\t",hd[i]);
}
printf("\n\n\n");
}
elseif(k=5)//选用布莱克曼窗
{
N=(int)(12/Bt+0.5);
if(fmod(N,2.)==0)
{
N++;
M=(N-1)/2;
}
elseM=(N-1)/2;
printf("hn的长度为:
%d\n\n",N);
printf("hn序列如下:
\n\n");
for(i=0;i{
hd[i]=sin(wd*PI*(i-M))/(PI*(i-M));
hd[i]=dd[i]-hd[i];
hd[i]=hd[i]*(0.42-0.5*cos(2*PI*i/(N-1))+0.08*cos(4*PI*i/(N-1)));
printf("%lf\t",hd[i]);
}
printf("\n\n\n");
}
}
voidBPF()//带通滤波器
{
intN,M,i,k;
doublewpl,wpu,wsl,wsu,as,wd1,wd2,Bt1,Bt2,Bt;
doublehd[10000]={0.0};
printf("\n请输入设计指标:
\n\n");
printf("*********************************\n\n");
printf("通带截至频率(以Pi为单位)\n\n");
printf("wpl:
");
scanf("%lf",&wpl);
printf("wpu:
");
scanf("%lf",&wpu);
printf("\n阻带起始频率(以Pi为单位)\n\n");
printf("wsl:
");
scanf("%lf",&wsl);
printf("wsu:
");
scanf("%lf",&wsu);
printf("\n阻带最小衰减:
");
scanf("%lf",&as);
printf("\n*********************************\n");
printf("\n\n\n");
wd1=0.5*(wpl+wsl);
wd2=0.5*(wpu+wsu);
Bt1=wpl-wsl;
Bt2=wsu-wpu;
if(Bt1>=Bt2)Bt=Bt2;
elseBt=Bt1;
printf("以下窗口类型可供你选择\n\n");
printf("***********************************************\n");
printf("标号窗口类型阻带最小衰减*\n");
printf("1:
矩形窗21dB*\n");
printf("2:
巴特列特窗(三角形窗)25dB*\n");
printf("3:
汉宁窗(升余弦窗)44dB*\n");
printf("4:
汉明窗(改进的升余弦窗)53dB*\n");
printf("5:
布莱克曼窗(二阶升余弦窗)74dB*\n");
printf("***********************************************");
printf("\n\n请你根据as选择合适的窗:
");
scanf("%d",&k);
printf("\n\n结果如下:
\n\n\n");
if(k=1)//选用矩形窗
{
N=(int)(4/Bt+0.5);
if(fmod(N,2.)==0)
{
N++;
M=(N-1)/2;
}
elseM=(N-1)/2;
printf("hn的长度为:
%d\n\n",N);
printf("hn序列:
\n\n");
for(i=0;i{
hd[i]=sin(wd2*PI*(i-M))/(PI*(i-M));
hd[i]=hd[i]-sin(wd1*PI*(i-M))/(PI*(i-M));
printf("%lf\t",hd[i]);
}
printf("\n\n\n");
}
elseif(k=2)//选用三角窗
{
N=(int)(8/Bt+0.5);
if(fmod(N,2.)==0)
{
N++;
M=(N-1)/2;
}
elseM=(N-1)/2;
printf("hn的长度为:
%d\n\n",N);
printf("hn序列:
\n\n");
for(i=0;i<=M;i++)
{
hd[i]=sin(wd2*PI*(i-M))/(PI*(i-M));
hd[i]=hd[i]-sin(wd1*PI*(i-M))/(PI*(i-M));
hd[i]=hd[i]*(2*i/(N-1));
}
for(i=M+1;i{
hd[i]=sin(wd2*PI*(i-M))/(PI*(i-M));
hd[i]=hd[i]-sin(wd1*PI*(i-M))/(PI*(i-M));
hd[i]=hd[i]*(2-2*i/(N-1));
printf("%lf\t",hd[i]);
}
printf("\n\n\n");
}
elseif(k=3)//选用汉宁窗
{
N=(int)(8/Bt+0.5);
if(fmod(N,2.)==0)
{
N++;
M=(N-1)/2;
}
elseM=(N-1)/2;
printf("hn的长度为:
%d\n\n",N);
printf("hn序列:
\n\n");
for(i=0;i{
hd[i]=sin(wd2*PI*(i-M))/(PI*(i-M));
hd[i]=hd[i]-sin(wd1*PI*(i-M))/(PI*(i-M));
hd[i]=hd[i]*(0.5*(1-cos(2*PI*i/(N-1))));
printf("%lf\t",hd[i]);
}
printf("\n\n\n");
}
elseif(k=4)//选用汉明窗
{
N=(int)(8/Bt+0.5);
if(fmod(N,2.)==0)
{
N++;
M=(N-1)/2;
}
elseM=(N-1)/2;
printf("hn的长度为:
%d\n\n",N);
printf("hn序列:
\n\n");
for(i=0;i{
hd[i]=sin(wd2*PI*(i-M))/(PI*(i-M));
hd[i]=hd[i]-sin(wd1*PI*(i-M))/(PI*(i-M));
hd[i]=hd[i]*(0.54-0.46*cos(2*PI/(N-1)));
printf("%lf\t",hd[i]);
}
printf("\n\n\n");
}
elseif(k=5)//选用布莱克曼窗
{
N=(int)(12/Bt+0.5);
if(fmod(N,2.)==0)
{
N++;
M=(N-1)/2;
}
elseM=(N-1)/2;
printf("hn的长度为:
%d\n\n",N);
printf("hn序列:
\n\n");
for(i=0;i{
hd[i]=sin(wd2*PI*(i-M))/(PI*(i-M));
hd[i]=hd[i]-sin(wd1*PI*(i-M))/(PI*(i-M));
hd[i]=hd[i]*(0.42-0.5*cos(2*PI*i/(N-1))+0.08*cos(4*PI*i/(N-1)));
printf("%lf\t",hd[i]);
}
printf("\n\n\n");
}
}
voidBSF()//带阻滤波器
{
intN,M,i,k;
doublewpl,wpu,wsl,wsu,as,wd1,wd2,Bt1,Bt2,Bt;
doublehd[10000]={0.0},dd[10000]={1.0};
printf("\n请输入设计指标:
\n\n");
printf("*********************************\n\n");
printf("通带截至频率(以Pi为单位)\n\n");
printf("wpl:
");
scanf("%lf",&wpl);
printf("wpu:
");
scanf("%lf",&wpu);
printf("\n阻带起始频率(以Pi为单位)\n\n");
printf("wsl:
");
scanf("%lf",&wsl);
printf("wsu:
");
scanf("%lf",&wsu);
printf("\n阻带最小衰减:
");
scanf("%lf",&as);
printf("\n*********************************\n");
printf("\n\n\n");
wd1=0.5*(wpl+wsl);
wd2=0