Ejemplo n.º 1
0
void cpeval (double *x, double *xi, double *z, double *zi)
{	int i;
	double *p,h,hi;
	p=polynom+(2l*degree);
	*z=*p; *zi=*(p+1);
	p-=2;
	for (i=degree-1; i>=0; i--)
	{	complex_multiply(x,xi,z,zi,&h,&hi);
		*z= h + *p;
		*zi=hi+*(p+1); p-=2;
	}
}
Ejemplo n.º 2
0
void cddeval (double *x, double *xi, double *z, double *zi)
{	int i;
	double *p,h,hi,*dd,xh,xhi;
	p=divdif+(2l*degree);
	dd=divx+(2l*(degree-1));
	*z=*p; *zi=*(p+1);
	p-=2;
	for (i=degree-1; i>=0; i--)
	{	xh=*x-*dd;
		xhi=*xi-*(dd+1); dd-=2;
		complex_multiply(&xh,&xhi,z,zi,&h,&hi);
		*z= h + *p;
		*zi=hi+*(p+1); p-=2;
	}
}
Ejemplo n.º 3
0
Archivo: FFT.c Proyecto: grzesiu/fft
int fft_iterative(const complex *input, complex *output, const unsigned int bits, const char dir)
{
	double unity_root, w;
	unsigned int s, k, j, m;
	complex t, u, num;

	assert(input != NULL && output != NULL && bits >= 0);

	if(fft_bit_reverse_copy(input, output, bits) == -1)
	{
		return -1; //fft_bit_reverse_copy failed
	}

	for(s = 1; s <= bits; s++)
	{
		m = 1<<s; //number of elements for which DFT is computed
		if(dir == 0)
		{
			unity_root = -(2 * M_PI) / m; //exponent of e - expotential form of complex number
		}
		else
		{
			unity_root = (2 * M_PI) / m; //exponent of e - expotential form of complex number
		}

		for(k = 0; k < 1<<bits; k += m)
		{
			num.Re = 1;
			num.Im = 0;
			for(j = 0; j <= m/2-1; )
			{
				t = complex_multiply(num, output[k + j + m/2]);
				u = output[k+j];
				
				output[k + j].Re = u.Re + t.Re;
				output[k + j].Im = u.Im + t.Im;
				output[k + j + m/2].Re = u.Re - t.Re;
				output[k + j + m/2].Im = u.Im - t.Im;
				
				w = unity_root * (++j); 
				num.Re = cos(w);
				num.Im = sin(w);
			}
		}
	}

	return 0;
}
Ejemplo n.º 4
0
void operator_complex() {
    double complex result;
    char in[USHRT_MAX];
    double real;
    double imag;
    printf("Entre com a 1º parte real: ");
    scanf("%s", in);
    printf("\n");
    real = atof(in);
    printf("Entre com a 1º parte imaginaria: ");
    scanf("%s", in);
    printf("\n");
    imag = atof(in);
    result = complex_constructor(real, imag);
    int keep_going = 1;
    while (keep_going) {
        switch (menu_complex()) {
            case 1:
                // Add
                printf("Entre com a próxima parte real: ");
                scanf("%s", in);
                printf("\n");
                real = atof(in);
                printf("Entre com a próxima parte imaginaria: ");
                scanf("%s", in);
                printf("\n");
                imag = atof(in);
                complex_add(&result, complex_constructor(real, imag));
                break;
            case 2:
                // Subtract
                printf("Entre com a próxima parte real: ");
                scanf("%s", in);
                printf("\n");
                real = atof(in);
                printf("Entre com a próxima parte imaginaria: ");
                scanf("%s", in);
                printf("\n");
                imag = atof(in);
                complex_subtract(&result, complex_constructor(real, imag));
                break;
            case 3:
                // Multiply
                printf("Entre com a próxima parte real: ");
                scanf("%s", in);
                printf("\n");
                real = atof(in);
                printf("Entre com a próxima parte imaginaria: ");
                scanf("%s", in);
                printf("\n");
                imag = atof(in);
                complex_multiply(&result, complex_constructor(real, imag));
                break;
            case 4:
                // Power
                printf("Entre com o próximo valor: ");
                scanf("%s", in);
                printf("\n");
                complex_power(&result, atof(in));
                break;
            case 5:
                // Divide
                while (1) {
                    printf("Entre com a próxima parte real: ");
                    scanf("%s", in);
                    printf("\n");
                    real = atof(in);
                    printf("Entre com a próxima parte imaginaria: ");
                    scanf("%s", in);
                    printf("\n");
                    imag = atof(in);
                    if (real == 0 && imag == 0)
                        printf("Combinação de valores inválida!\n\n");
                    else
                        break;
                }
                complex_divide(&result, complex_constructor(real, imag));
                break;
            default:
                keep_going = 0;
                break;
        }
        char *string = complex_string(result);
        printf("Resultado: %s\n\n", string);
        free(string);
    }
}