| 关于DSP中重要的傅立叶变换的源程序 |
| |
| 作者:未知 来源:互联网 点击数:1333 更新时间:2007-2-7 |
|
您可以添加到网摘 让更多人关注此文章:
#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[i], img[i]); 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("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[i]=0; result_i[i]=0; for(j=0; j<num_data; j++) { L=i*j%num_data; result_r[i]=result_r[i]+real[j]*tablecos[L] +img[j]*tablesin[L]; result_i[i]=result_i[i]+img[j]*tablecos[L] -real[j]*tablesin[L]; } } if(flag=='D') { for(i=0; i<num_data; i++) { real[i]=result_r[i]; img[i]=result_i[i]; } } else if(flag=='I') { for(i=0; i<num_data; i++) { real[i]=result_r[i]/num_data; img[i]=result_i[i]/num_data; } } free(result_r); free(result_i); }
|
没有任何评论
*只显示最新10条评论。评论内容只代表网友观点,与本站立场无关。 更多评论
|
|
发帖须知:
一.所发文章必须遵守《互联网电子公告服务管理规定》;
二.严禁发布供求代理信息,公司介绍,产品信息等广告宣传信息;
三.严禁恶意重复发帖;
四.严禁对个人,实体,民族,国家等进行漫骂,污蔑,诽谤。 |
|
|
|