📄 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 + -