www.pudn.com > 滤波图生成系统filter_1.34.zip > calculate.h


#include "math.h" 
//用混合同余法产生(a,b)区间上的随机数yi. 
double uniform(double a,double b,long *seed) 
{ 
	double t; 
	*seed=2045*(*seed)+1; 
	*seed=*seed-(*seed/1048576)*1048576; 
	t=(*seed)/1048576.0; 
	t=a+(b-a)*t; 
	return(t); 
} 
 
double gauss(double mean,double sigma,long *s) 
{ 
	int i;double x,y; 
    for(x=0,i=0;i<12;i++) 
    { 
		x+=uniform(0.0,1.0,s); 
	} 
    x=x-6.0; 
	y=mean+x*sigma; 
	return(y); 
} 
 
void sinwn(double a[],double f[],double ph[],int m,double fs,double snr,long seed,double x[],int n) 
{ 
	int i,k; 
	double z,pi,nsr; 
	pi=4.0*atan(1.0); 
	z=snr/10.0; 
	z=pow(10.0,z); 
	z=1.0/(2*z); 
	nsr=sqrt(z); 
	for(i=0;i0;i--) 
		{ 
			re=br; 
			im=bi; 
			br=(re+b[i])*zr-im*zi; 
			bi=(re+b[i])*zi+im*zr; 
		} 
		ar=0.0; 
		ai=0.0; 
		for(i=n;i>0;i--) 
		{ 
			re=ar; 
			im=ai; 
			ar=(re+a[i])*zr-im*zi; 
			ai=(re+a[i])*zi+im*zr; 
		} 
		br=br+b[0]; 
		ar=ar+1.0; 
		numr=ar*br+ai*bi; 
		numi=ar*bi-ai*br; 
		den=ar*br+ai*br; 
		x[k]=numr/den; 
		y[k]=numi/den; 
		switch(sign) 
		{ 
		case 1: 
			{ 
				temp=sqrt(x[k]*x[k]+y[k]*y[k]); 
				y[k]=atan2(y[k],x[k]); 
				x[k]=temp; 
				break; 
			} 
		case 2: 
			{ 
				temp=x[k]*x[k]+y[k]*y[k]; 
				y[k]=atan2(y[k],x[k]); 
				x[k]=10.0*log10(temp); 
			} 
		} 
	} 
}