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

📄 toepsolve.c

📁 speech signal process tools
💻 C
字号:
toepsolve(Ma,G,D,Y,X,n0,n1,n2)/* Ma is an n0 x n0 symmetric Toeplitz matrix, n0 odd, G and D are temporarymatrices of order n1=2n0-1 x n2=(n0+1)/2 and Y is a vector n0 long symmetricabout the mid value; X is n0 long and is the solution of Ma X = Y n0=2M+1 n1=4M+1 n2=M+1 */register int n0,n1,n2;register double Ma[],G[],D[],Y[],X[];{	register int k,lim;	lim=n1*n2;	for(k=0;k<lim;k++)		G[k]=D[k]=0;	G[(n0-1)*n2]=1;	do_col(Ma,D,n0,n2);	con1volve(Ma,G,D,n0,n1,n2);	for(k=2;k<n2;k++)		{		con2volve(G,D,k-1,k,n1,n2);		do_sub(G,D,k-2,k,n0,n1,n2);		do_sub(G,D,k-1,k,n0,n1,n2);		}	domove(G,D,n0,n2);	doX(G,D,Y,X,n0,n2);	return;}static doX(G,D,Y,X,n0,n2)register int n0,n2;register double G[],D[],Y[],X[];{	register int i,iM,j,l,lM;	register double sum,tsum,temp;	double getPdiag();	for(i=iM=0;i<n2;i++,iM+=n2)		{		sum=0;		for(j=0;j<n2;j++)			{			if((temp=G[iM+j])==0)				continue;			tsum=0;			for(l=0,lM=j;l<n0;l++,lM+=n2)				tsum+=G[lM]*Y[l];			tsum*=temp/getPdiag(G,D,j,n0,n2);			sum+=tsum;			}		X[i]=X[n0-i-1]=sum;		}	return;}static domove(G,D,n0,n2)register int n0,n2;register double G[],D[];{	register int i,lim,c;	lim=n0*n2;	c=(n2-1)*n2;	for(i=0;i<lim;i++,c++)		{		G[i]=G[c];		D[i]=D[c];		}	return;}static double getPdiag(G,D,j,n0,n2)register int j,n0,n2;register double G[],D[];{	register int l,lM;	register double sum;	sum=0;	for(l=0,lM=j;l<n0;l++,lM+=n2)		sum+=G[lM]*D[lM];	if(sum==0)		printf("getPdiag is returning a zero\n");	return(sum);}static do_sub(G,D,k1,k2,n0,n1,n2)register int k1,k2,n0,n1,n2;register double G[],D[];{	register int j,jM,c,lim;	register double ratio,temp;	c=(n0-k1-1)*n2;	if((ratio=D[c+k1])==0)		{		printf("zero divide, do_sub from solveX\n");		exit(1);		}	ratio=D[c+k2]/ratio;	lim=n1-k2;	for(j=k2,jM=k2*n2;j<lim;j++,jM+=n2)		{		temp=G[jM+k2]-ratio*G[jM+k1];		G[jM+k2]=temp;		temp=D[jM+k2]-ratio*D[jM+k1];		D[jM+k2]=temp;		}	return;}static con2volve(G,D,k,ko,n1,n2)register int k,ko,n1,n2;register double G[],D[];{	register int j,iM,jMm,jMp,lim;	register double temp;	iM=ko*n2+ko;	jMm=k*n2+k;	jMp=jMm+2*n2;	lim=n1-ko;	for(j=ko;j<lim;j++)		{		temp=G[jMm]+G[jMp];		G[iM]=temp;		temp=D[jMm]+D[jMp];		D[iM]=temp;		iM+=n2;		jMm+=n2;		jMp+=n2;		}	return;}static con1volve(Ma,G,D,n0,n1,n2)register int n0,n1,n2;register double Ma[],G[],D[];{	register int j,iM,jM,jMm,jMp,lim;	register double temp,term;	term= -2*Ma[n0]/Ma[0];	iM=n2+1;	jMm=0;	jM=n2;	jMp=2*n2;	lim=n1-1;	for(j=1;j<lim;j++)		{		temp=G[jMm]+term*G[jM]+G[jMp];		G[iM]=temp;		temp=D[jMm]+term*D[jM]+D[jMp];		D[iM]=temp;		iM+=n2;		jMm+=n2;		jM+=n2;		jMp+=n2;		}	return;}static do_col(Ma,D,n0,n2)register int n0,n2;register double Ma[],D[];{	register int i,iM1,iM2,iM3,n0m1;	register double temp;	n0m1=n0-1;	for(i=iM1=iM2=0,iM3=(n0-1)*n2;i<n0;i++,iM1+=n0,iM2+=n2,iM3+=n2)		{		temp=Ma[iM1+n0m1];		D[iM2]=temp;		temp=Ma[iM1];		D[iM3]=temp;		}	return;}

⌨️ 快捷键说明

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