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

📄 dft.cpp

📁 DFT(有限离散富立叶变换)的程序,可处理虚数,输入离散序列,得到变换后结果
💻 CPP
字号:
#include <math.h>
#include <stdio.h>
#include <string.h>

#define PI 3.141592654

//功能:作DFT变换或逆变换
void dft( double x[],double y[], double a[], double b[], int n, int sign )
{
    int i,k;
    double c, d, q, w, s;

    q = 2 * PI / n;

    for( k=0; k<n; k++)
	{
        w = k * q; // w = 2πk/N

        a[k] = b[k] = 0.0;

        for( i=0; i<n; i++)
		{
            d = i * w;  // d = 2πkn/N
            c = cos( d );  
            s = sin( d ) * sign;

            a[k] += c * x[i] + s * y[i];
            b[k] += c * y[i] - s * x[i];
		}
	}

    if( -1 == sign )//若为逆变换则除以N
	{
        for( k=0; k<n; k++)
		{
            a[k] = a[k] / n;
            b[k] = b[k] / n;
		}
	}
}

//功能:根据输入的字符串得出所输入实数的实部和虚部
void get_Re_Im( char s[], double *re, double *im)
{
	char *ss = strchr( s, 'j');

	*re = atof( s );

	if( NULL == ss)
		*im = 0;
	else
	    *im = atof( (ss+1) );
}



void main()
{
	int n, sign;
	char str[50];

    printf("请输入序列点数:\t");
	scanf("%d", &n );

	double *x = new double[n];
	double *y = new double[n];
	double *a = new double[n];
	double *b = new double[n];

	printf("请输入原始序列,注意若虚部不为0请以\"实部+j虚部\"的形式输入\n");

	for(int i=0; i<n; i++)
	{   
		printf("第%d个:\t", i+1);//以字符串形式读入序列
        scanf("%s", str);

		get_Re_Im(str, &x[i], &y[i]);//分离出实部和虚部
	}
	
	printf("进行正变换还是逆变换?(输入1表示正变换,-1表示逆变换)");
	scanf("%d", &sign);

    dft( x, y, a, b, n, sign );//进行变换

	for(i=0; i<n; i++)//输出
	{
		if( fabs(b[i]) < 0.0000001 )//虚部为0时只输出实部
			printf("%10.4lf\n",a[i]);

		else if( b[i] < 0 )//虚部为负
		    printf("%10.4lf-j%10.4lf\n",a[i],-b[i]);

		else
			printf("%10.4lf+j%10.4lf\n",a[i],b[i]);
	}
}

⌨️ 快捷键说明

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