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

📄 process.cpp

📁 我上硕士时完成的第一个作业!!! 可以显示两个离散的数据
💻 CPP
字号:

#include "stdafx.h"
#include <math.h>
#include "stdio.h"
#include <ctype.h>
#include <iostream.h>
#include <string.h>
#include <malloc.h>
#define pi 3.14159265359
FILE *fp,*fp1,*fp2;
int n=16,m=3,i,j,ii;
float *b,*c;
float cc,bb;
char Str1[6];
//定义复数结构 
typedef struct
{
	float re;
	float im;
}COMPLEX;

COMPLEX Add(COMPLEX c1, COMPLEX c2)
{
	COMPLEX c;
	c.re=c1.re+c2.re;
	c.im=c1.im+c2.im;
	return c;
}

COMPLEX Sub(COMPLEX c1, COMPLEX c2)
{
	COMPLEX c;
	c.re=c1.re-c2.re;
	c.im=c1.im-c2.im;
	return c;
}

COMPLEX Mul(COMPLEX c1, COMPLEX c2)
{
	COMPLEX c;
	c.re=c1.re*c2.re-c1.im*c2.im;
	c.im=c1.re*c2.im+c2.re*c1.im;
	return c;
}

COMPLEX *x,*h,*y;

//////////Fourier变换子程序
void FFT(COMPLEX * TD, COMPLEX * FD, int power)
{
	FILE *fp1,*fp2;
	int count;
	int i,j,k,bfsize,p;
	float angle;
	COMPLEX *W,*X1,*X2,*X;
		count=1<<power;
	W=(COMPLEX *)malloc(sizeof(COMPLEX)*count/2);
	X1=(COMPLEX *)malloc(sizeof(COMPLEX)*count);
	X2=(COMPLEX *)malloc(sizeof(COMPLEX)*count);
	for(i=0;i<count/2;i++)
	{
		angle=-i*pi*2/count;
		W[i].re=cos(angle);
		W[i].im=sin(angle);
	}
	
	memcpy(X1,TD,sizeof(COMPLEX)*count);

	for(k=0;k<power;k++)
	{
		for(j=0;j<1<<k;j++)
		{
			bfsize=1<<(power-k);
			for(i=0;i<bfsize/2;i++)
			{
				p=j*bfsize;
				X2[i+p]=Add(X1[i+p],X1[i+p+bfsize/2]);
				X2[i+p+bfsize/2]=Mul(Sub(X1[i+p],X1[i+p+bfsize/2]),W[i*(1<<k)]);
			}
		}
		X=X1;
		X1=X2;
		X2=X;
	}
	for(j=0;j<count;j++)
	{
		p=0;
		for(i=0;i<power;i++)
		{
			if (j&(1<<i)) p+=1<<(power-i-1);
		}
		FD[j]=X1[p];
		printf("\n !!!!!!fd[%d]==%f+j(%f)",j,FD[j].re,FD[j].im);
	}

if((fp1=fopen("test1.txt","w"))==NULL)
	{
      printf("can not open!!!!");
	}
if((fp2=fopen("test2.txt","w"))==NULL)
	{
      printf("can not open!!!!");
	}

for(i=0;i<count;i++)
{	
fprintf(fp1,"%3.1f  ",FD[i].re);
fprintf(fp2,"%3.1f  ",FD[i].im);
}	
	
fclose(fp1);
fclose(fp2);
	free(W);
	free(X1);
	free(X2);
}
////////////////////////////////////////

/*
int main(int argc, char* argv[])
{
	int n,m,i;
    COMPLEX *x,*h,*y;
	float *b,*c;
	float cc,bb;
	FILE *fp,*fp1,*fp2;
printf("请输入m的值:");
scanf("%d",&m);
	n=1<<m;
//分配内存
x=(COMPLEX *)malloc(sizeof(COMPLEX)*n);
h=(COMPLEX *)malloc(sizeof(COMPLEX)*n);
y=(COMPLEX *)malloc(sizeof(COMPLEX)*n);
b=(float *)malloc(sizeof(float)*n);	
c=(float *)malloc(sizeof(float)*n);	
//从文件中读入数据
	if((fp=fopen("test.txt","r"))==NULL)
	{
      printf("can not open!!!!");
	}

for(i=0;i<n;i++)
{	
fscanf(fp,"%f",&b[i]);
x[i].re=b[i];
h[i].re=b[i];
x[i].im=0.0;
h[i].im=0.0;
printf("\n x[%d]==%f",i,x[i].re);
}	
fclose(fp);

FFT(x,h,m);
//从文件中读出变换后的实部
if((fp1=fopen("test1.txt","r"))==NULL)
	{
      printf("can not open!!!!");
	}

for(i=0;i<n;i++)
{	
fscanf(fp1,"%f",&bb);
x[i].re=bb;
h[i].re=bb;
printf("\n          x[%d]=%f",i,x[i].re);
}
fclose(fp1);
//从文件中读出变换后的虚部 
if((fp2=fopen("test2.txt","r"))==NULL)
	{
      printf("can not open!!!!");
	}
for(i=0;i<n;i++)
{	
fscanf(fp2,"%f",&cc);
x[i].im=cc;
h[i].im=cc;
}
fclose(fp2);
//求y(k)=x(k)*h(k)及y(k)的共轭
for(i=0;i<n;i++)
{
	y[i]= Mul(x[i],h[i]);
	y[i].im=-1*y[i].im;
}

FFT(y,h,m);

if((fp1=fopen("test1.txt","r"))==NULL)
	{
      printf("can not open!!!!");
	}
if((fp2=fopen("test2.txt","r"))==NULL)
	{
      printf("can not open!!!!");
	}
for(i=0;i<n;i++)
{	
fscanf(fp1,"%f",&b[i]);
fscanf(fp2,"%f",&c[i]);
y[i].re=b[i];
y[i].im=c[i];
}
fclose(fp1);
fclose(fp2);
//求最终卷积的结果
for(i=0;i<n;i++)
{
	y[i].re=y[i].re/n;
	y[i].im=-1*y[i].im/n;
}
//输出到文件!!!
if((fp1=fopen("test3.txt","w"))==NULL)
	{
      printf("can not open!!!!");
	}

if((fp2=fopen("test4.txt","w"))==NULL)
	{
      printf("can not open!!!!");
	}
for(i=0;i<n;i++)
{
fprintf(fp1,"%3.1f  ",y[i].re);
//fprintf(fp1,"\n");
fprintf(fp2,"%3.1f  ",y[i].im);	
}
fclose(fp1);
fclose(fp2);
free(x);
free(h);
free(y);
free(b);
free(c);

	return 0;
}


*/







⌨️ 快捷键说明

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