📄 fir.txt
字号:
#include<iostream>
#include<cmath>
#define L 200
#define M 100
#define pi 3.1415926
using namespace std;
double fs;
double filter(int l) //海明窗滤波器
{
double w,h;
w=(0.54-0.46*cos(2*pi*l/(L-1)));
//cout<<w<<" ";
h=1/(pi*(l-(L-1)/2.0))*(sin((l-(L-1)/2.0)*2*pi/90)-sin((l-(L-1)/2.0)*2*pi/110))*w;
//if(l-(L-1)/2.0==0)
//cout<<" error";
//cout<<h<<" ";
return h;
}
double sample(double fi,double anglei,int k) //采样
{
double D;
D=5*sin(2*pi*fi*k/fs+anglei*pi/180);
//cout<<D;
return D;
}
double r(double P[]) //自相关函数
{
int k;
double C=0.0,z;
for(k=0;k<L;k++)
C=C+P[k]*P[k];
z=sqrt(2*C/M);
return z;
}
double RAB(double P[],double Q[]) // 互相关函数
{
int k;
double z=0.0;
for(k=0;k<L;k++)
z=z+P[k]*Q[k];
cout<<z<<" ";
return z;
}
double RAB1(double P[],double Q[]) //互相关函数
{
int k;
double z=0.0;
for(k=0;k<L;k++)
z=z+P[k]*Q[(k+200-M/4)%L];
cout<<z<<" ";
return z;
}
void process(double fi) //处理函数
{ double E[L],E_TMP[L],F[L],F_TMP[L],tmp1=0.0,tmp2=0.0;
double a,b,A[L],B[L],C[L],D[L];
double angle;
int i,k;
fs=fi*M;
//cout<<"xiaxia="<<fs<<" ";
for(k=0;k<M;k++)
{ A[k]=sample(28,0,k)+sample(140,0,k)+sample(1120,0,k)+sample(4480,0,k);
B[k]=sample(28,0,k)+sample(140,0,k)+sample(1120,0,k)+sample(4480,0,k);
//cout<<A[k];
//cout<<B[k];
}
for(k=0;k<M;k++)
{ A[k+100]=sample(28,0,k)+sample(140,0,k)+sample(1120,0,k)+sample(4480,0,k);
B[k+100]=sample(28,0,k)+sample(140,0,k)+sample(1120,0,k)+sample(4480,0,k);
//cout<<A[k];
//cout<<B[k];
}
for(k=0;k<L;k++) //被测信号通过滤波器得单一频率信号
{ tmp1=0.0;
for(i=0;i<L;i++)
{
E_TMP[i]=A[(200-i)%200];
}
for(i=0;i<L;i++)
{
E[i]=E_TMP[(i+k)%200];
//cout<<E[i]<<" ";
}
for(i=0;i<L;i++)
{tmp1=tmp1+E[i]*filter(i);
//cout<<E[i]*filter(i)<<" ";
}
C[k]=tmp1;
//cout<<filter(i)<<" ";
}
for(k=0;k<L;k++) //参考信号通过滤波器得单一频率信号
{ tmp2=0.0;
for(i=0;i<L;i++)
{
F_TMP[i]=B[(200-i)%200];
}
for(i=0;i<L;i++)
{
F[i]=F_TMP[(i+k)%200];
}
for(i=0;i<L;i++)
tmp2=tmp2+F[i]*filter(i);
D[k]=tmp2;
}
a=r(C);
b=r(D);
angle=atan(RAB1(C,D)/RAB(C,D))*180/pi;
//cout<<RAB1(C,D)/RAB(C,D)<<" ";
cout<<"A的幅度是:"<<a<<endl;
cout<<"B的幅度是:"<<b<<endl;
cout<<"A和B的相位差是:"<<angle<<endl;
}
void main()
{ double fi;
for(int i=0;i<4;i++)
{ cout<<"请依次输入fi,anglei的值:"<<endl;
cout<<"fi=";
cin>>fi;
//cout<<"anglei=";
//cin>>anglei;
process(fi);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -