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

📄 capon.cpp

📁 信号处理中的谱分析
💻 CPP
字号:
#include "iostream.h"
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#include <fstream.h>
#include <iomanip.h>
void burg(double x[],int n,int p,double a[],double *v);
void mlm(double x[],int n,int pm,double fs,double s[],double freq[],int len,int sdb);
void main()
{
	double freq[200],b[1];
    double x[200],fs,sigma2;
	double data_frist[228],a[14],v,data_array[1368];
	int data_size=1368,i,j,p,n,len;
    ifstream data_file("test.txt");
	ofstream data_file1("test1.txt");
	 for(i=0;i<data_size;i++)
	 {
		 data_file>>data_array[i];
	 }
	 for(i=0;i<data_size/6;i++)
	 {
		 j=6*i;
		 data_frist[i]=data_array[j];
	 }
	 b[0]=1.0;
	n=data_size/6;
	p=13;	
	burg(data_frist,n,p,a,&v);
	for(i=0;i<=p;i++)
	{
		cout<<a[i]<<endl;
	}
	len=200;
	sigma2=v;
	fs=1.0;
	mlm(data_frist,n,p,fs,x,freq,len,1);
	for(i=0;i<len;i++)
	{
		data_file1<<setprecision(13)<<freq[i]<<"    "<<x[i]<<endl;
	}

}
void burg(double x[],int n,int p,double a[],double *v)
{ 
	int i,k;
	double r,sumd,sumn,*b,*ef,*eb;
	b=(double *)malloc((p+1)*sizeof(double));
	ef=(double *)malloc(n*sizeof(double));
	eb=(double *)malloc(n*sizeof(double));
	a[0]=1.0;
	r=0.0;
	for(i=0;i<n;i++)
	{
		r+=x[i]*x[i]/n;
	}
	v[0]=r;          

	for(i=1;i<n;i++)
	{
		ef[i]=x[i];
		eb[i-1]=x[i-1];
	}
	
	for(k=1;k<=p;k++)
	{
		sumn=0.0;
		sumd=0.0;
		for(i=k;i<n;i++)
		{
			sumn+=ef[i]*eb[i-1];
			sumd+=ef[i]*ef[i]+eb[i-1]*eb[i-1];
		}
		a[k]=-2*sumn/sumd;
		for(i=1;i<k;i++)
		{
			b[i]=a[i]+a[k]*a[k-i];
		}
		for(i=1;i<k;i++)
		{
			a[i]=b[i];
		}
		v[0]=(1.0-a[k]*a[k])*v[0];
		for(i=(n-1);i>=(k+1);i--)
		{
			ef[i]=ef[i]+a[k]*eb[i-1];
			eb[i-1]=eb[i-2]+a[k]*ef[i-1];
		}
	}
	free(b);
	free(ef);
	free(eb);
}

void mlm(double x[],int n,int pm,double fs,double s[],double freq[],int len,int sdb)
{
	int i,k,p;
	double v,ai,ar,im,re,zi,zr,sar,ang,tpi,*a;
	a=(double*)malloc((pm+1)*sizeof(double));
	tpi=8.0*atan(1.0);
	for(i=0;i<len;i++)
	{
		s[i]=0.0;
	}
	for(p=0;p<=pm;p++)
	{
		burg(x,n,p,a,&v);
		for(k=0;k<len;k++)
		{
			ang=k*1.0/(len-1);
			freq[k]=ang*fs;
			zr=cos(-tpi*ang);
			zi=sin(-tpi*ang);
			ar=0.0;
			ai=0.0;
			for(i=p;i>0;i--)
			{
				re=ar;
				im=ai;
				ar=(re+a[i])*zr-im*zi;
				ai=(re+a[i])*zi+im*zr;
			}
			ar=ar+1.0;
			sar=v/(fs*(ar*ar+ai*ai));
			s[k]=s[k]+1.0/sar;
		}
	}
	for(k=0;k<len;k++)
	{
		s[k]=pm/s[k];
	}
	if(sdb==1)
	{
		for(k=0;k<len;k++)
		{
			s[k]=10.0*log10(s[k]);
		}
	}
	free(a);
}


⌨️ 快捷键说明

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