|
#include<stdio.h> #include<math.h> #include<float.h> #include<malloc.h> #include<stdlib.h> void initial(int num_data, float* real, float* inm); void enter_data(int num_data, float* data); void wave_sin(int num_data, float* data); void wave_cos(int num_data, float* data); void decay(int num_data, float* data); void random(int num_data, float* data); void table(int num_data, char flag, float* tablesin, float* tablecos); void DFT(int num_data, char flag, float* real, float* img, float* tablesin, float* tablecos); float period; void main() { int num_data; int i; char flag; float *real, *img; float *tablecos, *tablesin; printf("PLEASE INPUT SAMPLE PERIOD(Second):"); scanf("%f", &period); printf("PLEASE INPUT SAMPLE POINT NUMBER:"); scanf("%d", &num_data); fflush(stdin); printf("DFT OR IDFT (D/I):"); flag=getchar(); if(flag==‘d’) flag=‘D’; if(flag==‘i’) flag=‘I’; printf("\n"); real=(float*)malloc(sizeof(float)* num_data); img=(float*)malloc(sizeof(float)* num_data); tablesin=(float*)malloc(sizeof(float)* num_data); tablecos=(float*)malloc(sizeof(float)* num_data); initial(num_data, real, img); table(num_data, flag, tablesin, tablecos); DFT(num_data, flag, real, img, tablesin, tablecos); for(i=0; i<num_data; i++) printf("%8d real=%12.6f img=%12.6f\n", i, real, img); free(real); free(img); free(tablesin); free(tablecos); } void initial(int num_data, float* real, float* img) { int n; for(n=0; n<num_data; n++) { real[n]=0; img[n]=0; } printf("INITIAL REAL DATA\n"); enter_data(num_data, real); printf("\nINITIAL IMG DATA\n"); enter_data(num_data, img); } void enter_data(int num_data, float* data) { int selection; printf("FUNCTION SELECTION\n"); printf("1-----AMPLITUDE*SIN(2*3.1415926 *FREQUENCY*PERIOD*T)\n"); printf(& quot;2-----AMPLITUDE*COS(2*3.1415926 *FREQUENCY*PERIOD*T)\n"); printf("3-----AMPLITUDE*EXP(-PERIOD)\n"); printf("4-----DATA=0\n"); printf("5-----ENTER DATA\n"); printf("ENTER SELECTION---"); scanf("%d", &selection); switch(selection) { case 1:wave_sin(num_data, data);break; case 2:wave_cos(num_data, data);break; case 3:decay(num_data, data);break; case 4:break; case 5:random(num_data, data);break; } } void wave_sin(int num_data, float* data) { float amplitude, frequency, c; int n; printf("PLEASE INPUT AMPLITUDE OF WAVE:\n"); scanf("%f", &litude); printf("PLEASE INPUT FREQUENCY OF WAVE(Hz):\n"); scanf("%f", &frequency); for(n=0; n<num_data; n++) { c=2*3.1415926*frequency*period*n; data[n]=(float)(amplitude*sin(c)); } } void wave_cos(int num_data, float* data) { float amplitude, frequency, c; int n; printf("PLEASE INPUT AMPLITUDE OF WAVE:\n"); scanf("%f", &litude); printf("PLEASE INPUT FREQUENCY OF WAVE(Hz):\n"); scanf("%f", &frequency); for(n=0; n<num_data; n++) { c=2*3.1415926*frequency*period*n; data[n]=(float)(amplitude*cos(c)); } } void decay(int num_data, float* data) { float amplitude, c; int n; printf("PLEASE INPUT AMPLITUDE OF WAVE\n"); scanf("%f", &litude); for(n=0; n<num_data; n++) { c=-period*n; data[n]=(float)(amplitude*exp(c)); } } void random(int num_data, float* data) { int n; for(n=0; n<num_data; n++) { printf("PLEASE INPUT DATA[%d]:", n); scanf("%f", &data[n]); } } void table(int num_data, char flag, float* tablesin, float* tablecos) { float w, c; int n; w=(float)(8*atan(1)/num_data); if(flag==‘D’) w=-w; for(n=0; n<num_data; n++) { c=w*n; tablecos[n]=(float)cos(c); tablesin[n]=(float)sin(c); } } void DFT(int num_data, char flag, float* img, float* tablesin, float* tablecos) { int i, j, L; float *result_r, *result_i; result_r=(float*)malloc(sizeof(float)*num_data); result_i=(float*)malloc(sizeof(float)*num_data); for(i=0; i<num_data; i++) { result_r=0; result_i=0; for(j=0; j<num_data; j++) { L=i*j%num_data; result_r=result_r+real[j]*tablecos[L] +img[j]*tablesin[L]; result_i=result_i+img[j]*tablecos[L] -real[j]*tablesin[L]; } } if(flag==‘D’) { for(i=0; i<num_data; i++) { real=result_r; img=result_i; } } else if(flag==‘I’) { for(i=0; i<num_data; i++) { real=result_r/num_data; img=result_i/num_data; } } free(result_r); free(result_i); } |
|
|