예제 #1
0
int main(){
	int k, n, N, p, q, r;
	double *y_r, *y_i, *x_r, *x_i, w_r, w_i;
	
	printf("Please input p q r=");
	scanf("%d %d %d", &p, &q, &r);
	N = Generate_N(p, q, r);
	printf("N=2^%d 3^%d 5^%d = %d\n",p,q,r,N);
	
	
	x_r = (double *) malloc(N*sizeof(double));
	x_i = (double *) malloc(N*sizeof(double));
	y_r = (double *) malloc(N*sizeof(double));
	y_i = (double *) malloc(N*sizeof(double));
	
	Initial(x_r, x_i, N);
	FFTv3(x_r, x_i, y_r, y_i, N);
	/*
	for(int i=0;i<N;++i){
		printf("%f\n",y_r[i]);
	}
	*/
	Print_Complex_Vector(y_r, y_i, N);
	return 0;
}
예제 #2
0
int main()
{
	int k, n, p, q, r, N;
	double *y_r, *y_i, *x_r, *x_i, w_r, w_i;
	clock_t t1, t2;
	
	printf("Please input p q r=");
	scanf("%d %d %d", &p, &q, &r);
	N = Generate_N(p, q, r);
	printf("N=2^%d 3^%d 5^%d = %d\n",p,q,r,N);
	
	x_r = (double *) malloc(N*sizeof(double));
	x_i = (double *) malloc(N*sizeof(double));
	y_r = (double *) malloc(N*sizeof(double));
	y_i = (double *) malloc(N*sizeof(double));
	
	Initial(x_r, x_i, N);
	t1 = clock();
	FFTr3(x_r, x_i, y_r, y_i, N);
	t2 = clock();
	printf("Fast FT3: %f secs\n", 1.0*(t2-t1)/CLOCKS_PER_SEC);
//	Print_Complex_Vector(y_r, y_i, N);
	
	return 0;
} 
예제 #3
0
int main()
{
	int i, k, n, p, q, r, N;
	double *y_r, *y_i, *x_r, *x_i, *z_r, *z_i, w_r, w_i, everage, *t;
	clock_t t1, t2;
	
	printf("Please input p q r=");
	scanf("%d %d %d", &p, &q, &r);
	N = Generate_N(p, q, r);
	printf("N=2^%d 3^%d 5^%d = %d\n",p,q,r,N);

	z_r = (double *) malloc(N*sizeof(double));
	z_i = (double *) malloc(N*sizeof(double));	
	x_r = (double *) malloc(N*sizeof(double));
	x_i = (double *) malloc(N*sizeof(double));
	y_r = (double *) malloc(N*sizeof(double));
	y_i = (double *) malloc(N*sizeof(double));
	t = (double *) malloc(20*sizeof(double));
	
	Initial(x_r, x_i, N);
	int m=20;
	for(i=0;i<m;i++)
	{
		t1 = clock();
		FFT(x_r, x_i, y_r, y_i, z_r, z_i, p, q, r);
		t2 = clock();
		t[i] = 1.0*(t2-t1)/CLOCKS_PER_SEC;
		printf("Fast FTT: %f secs\n", 1.0*(t2-t1)/CLOCKS_PER_SEC);
	}
	everage = 0;
	for(i=0;i<m;i++)
	{
		everage = everage + t[i];	
	}
	everage = everage / m;
	printf("everage time: %f \n", everage);
//	Print_Complex_Vector(y_r, y_i, N);
	
	return 0;
} 
예제 #4
0
int FFT(double *x_r, double *x_i, double *y_r, double *y_i,double *z_r, double *z_i, int p, int q, int r)
{
	//bit-reverse
	int i, j, pp, qq, bse, N, M;
	N = 1;
	N = Generate_N(p, q, r);

	for(i=0;i<N;i++)
	{
		y_r[i]=x_r[i];
		y_i[i]=x_i[i];
	}
	for(i=0;i<N;i++)
	{
		z_r[i]=y_r[i];
		z_i[i]=y_i[i];
	}
	j=0;
	for(i=1;i<N;i++)
	{
		M=N;
		if(p==0)
		{
			if(q==0)
			{
				//(0,0,r)
				j = j + M/5;
				while(j >= M & M > 1)
				{
					j=j-M;
					M=M/5;
					j=j+M/5;
				}
			}
			else
			{
				if(r==0)
				{
					//(0,q,0)
					j=j+M/3;
					while(j>=M)
					{
						j=j-M;
						M=M/3;
						j=j+M/3;
					}
				}
				else
				{
					//(0,q,r);
					bse=3;
					qq=q;
					j=j+M/bse;
					while(j>=M)
					{
						j=j-M;
						M=M/bse;
						qq=qq-1;
						if(qq==0) bse=5;
						j=j+M/bse;
					}
				}
			}
		}
		else
		{
			if(q==0)
			{
				if(r==0)
				{
					//(p,0,0)
					j=j+M/2;
					while(j>=M)
					{
						j=j-M;
						M=M/2;
						j=j+M/2;
					}
				}
				else
				{
					//(p,0,r)
					bse=2;
					pp=p;
					j=j+M/bse;
					while(j>=M)
					{
						j=j-M;
						M=M/bse;
						pp=pp-1;
						if(pp==0) bse=5;
						j=j+M/bse;
					}
				}
			}
			else
			{
				if(r==0)
				{
					//(p,q,0)
					bse=2;
					pp=p;
					j=j+M/bse;
					while(j>=M)
					{
						j=j-M;
						M=M/bse;
						pp=pp-1;
						if(pp==0) bse=3;
						j=j+M/bse;
					}
				}
				else
				{
					//(p,q,r)
					pp=p;
					qq=q;
					j=j+M/2;
					while(j>=M)
					{
						j=j-M;
						M=M/2;
						pp=pp-1;
						if(pp>0) j=j+M/2;
						else
						{
							j=j+M/3;
							while(j>=M)
							{
								j=j-M;
								M=M/3;
								qq=qq-1;
								if(qq>0) j=j+M/3;
								else
								{
									j=j+M/5;
									while(j>=M)
									{
										j=j-M;
										M=M/3;
										j=j+M/5;
									}
								}
							}
						}
					}
				}
			}
		}
		y_r[i]=z_r[j];
		y_i[i]=z_i[j];
	}

	
	//Butterfly structure			 
	int P, Q, R;
	P = pow(2,p);
	Q = pow(3,q);		

	//p != 0
	if(p > 0)
	{
		double theta, w_br, w_bi, a_r, a_i;
		int k, n, pp;
		pp = 0;
		n = 2;
		while(pp < p & p > 0)
		{
			for(k=0;k<n/2;k++)
			{
				theta = -2.0*k*M_PI/n;
				w_br = cos(theta);
				w_bi = sin(theta);
				for(i=k;i<N;i+=n)
				{
					j = i + n/2;
					a_r = w_br * y_r[j] - w_bi * y_i[j];
					a_i = w_br * y_i[j] + w_bi * y_r[j];
					
	
					y_r[j] = y_r[i] - a_r;
					y_i[j] = y_i[i] - a_i;
					y_r[i] = y_r[i] + a_r;
					y_i[i] = y_i[i] + a_i;
	
				}
			}
			n = n * 2;
			pp = pp + 1;
		}
	}
	
	// q != 0
	if(q > 0)
	{				
		double theta, w_br, w_bi, w_cr, w_ci, a_r, a_i, b_r, b_i, c_r, c_i, s;
		int l, k, n, m, qq;
		qq = 0;
		n = 3*P;
		s = sqrt(3)/2;
		while(qq < q & q > 0)
		{
			for(k=0;k<n/3;k++)
			{
				theta = -2.0*k*M_PI/n;
				w_br = cos(theta);
				w_bi = sin(theta);
				w_cr = cos(2*theta);
				w_ci = sin(2*theta);
				for(i=k;i<N;i+=n)
				{
					j = i + n/3;
					l = j + n/3;
					a_r = y_r[i];
		            a_i = y_i[i];
					b_r = w_br * y_r[j] - w_bi * y_i[j];
					b_i = w_br * y_i[j] + w_bi * y_r[j];
					c_r = w_cr * y_r[l] - w_ci * y_i[l];
					c_i = w_cr * y_i[l] + w_ci * y_r[l];
					
	                y_r[i] = a_r + b_r + c_r; 
	                y_i[i] = a_i + b_i + c_i;
	                y_r[j] = a_r - (b_r + c_r)/2 + (b_i - c_i) * s;
	                y_i[j] = a_i - (b_i + c_i)/2 - (b_r - c_r) * s;
	                y_r[l] = a_r - (b_r + c_r)/2 - (b_i - c_i) * s;
	                y_i[l] = a_i - (b_i + c_i)/2 + (b_r - c_r) * s;
			                
				}
			}
			n = n * 3;
			qq = qq + 1;
		}
	}
	
	if(r > 0)
	{
		double a, b, c, d, theta, w_br, w_bi, w_cr, w_ci, w_dr, w_di, w_er, w_ei, a_r, a_i, b_r, b_i, c_r, c_i, d_r, d_i, e_r, e_i;
		int f, g, h, n, k, rr;
		rr = 0;
		n = 5*Q*P;
		a = cos(2.0*M_PI/5);
		b = sin(2.0*M_PI/5);
		c = -cos(4.0*M_PI/5);
		d = sin(4.0*M_PI/5);
		while(rr < r & r > 0)
		{
			for(k=0;k<n/5;k++)
			{
				theta = -2.0*k*M_PI/n;
				w_br = cos(theta);
				w_bi = sin(theta);
				w_cr = cos(2.0*theta);
				w_ci = sin(2.0*theta);
				w_dr = cos(3.0*theta);
				w_di = sin(3.0*theta);
				w_er = cos(4.0*theta);
				w_ei = sin(4.0*theta);
				
				for(i=k;i<N;i+=n)
				{
					j = i + n/5;
					f = j + n/5;
					g = f + n/5;
					h = g + n/5;
					
					a_r = y_r[i];
					a_i = y_i[i];
					b_r = (y_r[j] * w_br - y_i[j] * w_bi);
					b_i = (y_r[j] * w_bi + y_i[j] * w_br);
					c_r = (y_r[f] * w_cr - y_i[f] * w_ci);
					c_i = (y_r[f] * w_ci + y_i[f] * w_cr);
					d_r = (y_r[g] * w_dr - y_i[g] * w_di);
					d_i = (y_r[g] * w_di + y_i[g] * w_dr);
					e_r = (y_r[h] * w_er - y_i[h] * w_ei);
					e_i = (y_r[h] * w_ei + y_i[h] * w_er);
						
					y_r[i] = a_r + b_r + c_r + d_r + e_r; 
					y_i[i] = a_i + b_i + c_i + d_i + e_i;
					y_r[j] = a_r + (a * (b_r + e_r) - c * (c_r + d_r)) + (b * (b_i - e_i) + d * (c_i - d_i));
					y_i[j] = a_i + (a * (b_i + e_i) - c * (c_i + d_i)) - (b * (b_r - e_r) + d * (c_r - d_r));
					y_r[f] = a_r - (c * (b_r + e_r) - a * (c_r + d_r)) + (d * (b_i - e_i) - b * (c_i - d_i));
					y_i[f] = a_i - (c * (b_i + e_i) - a * (c_i + d_i)) - (d * (b_r - e_r) - b * (c_r - d_r));
					y_r[g] = a_r - (c * (b_r + e_r) - a * (c_r + d_r)) - (d * (b_i - e_i) - b * (c_i - d_i));
					y_i[g] = a_i - (c * (b_i + e_i) - a * (c_i + d_i)) + (d * (b_r - e_r) - b * (c_r - d_r));
					y_r[h] = a_r + (a * (b_r + e_r) - c * (c_r + d_r)) - (b * (b_i - e_i) + d * (c_i - d_i));
					y_i[h] = a_i + (a * (b_i + e_i) - c * (c_i + d_i)) + (b * (b_r - e_r) + d * (c_r - d_r));
						              
				}
			}
			n = n * 5;
			rr = rr + 1;
		}
	}
	
}