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

📄 fir.txt

📁 用C++实现窗函数的设计
💻 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 + -