📄 cordic.c
字号:
//-------------+--------------------------------------------------------------// Description | Evaluation of sin & cos using cordic algorithm.//// History |//##############################################################################// Author : Aviral Mittal// avimit@yahoo.com//###############################################################################define NULL (0)#include <stdio.h>#include <string.h>#include <math.h>float str2float(char * argv[]);void PrintHelpMess();void HandleArgs(int argc);float msin(float angle);int main (int argc, char * argv[]){ float angle; float sinval; float cosval; HandleArgs(argc); angle = str2float(argv); if(angle <0 || angle>90) { printf("ERROR! Input(%f) out of bounds, should be >=0 and <=90\n",angle); exit(-1); } sinval = msin(angle); printf("cos eval\n"); //cosval = msin(90-angle); printf("Input Angle is %f,%f(rad), sinval = %f, cosval = %f\n",angle,(angle*3.141592)/180,sinval,cosval); printf("Input Angle is %f,%f(rad), sinval = %f, cosval = %f\n",angle,(angle*3.141592)/180,sin((angle*3.141592)/180),cos((angle*3.141592)/180));}// int main (int argc, char * argv[])float str2float(char * argv[]){char whole[32];char *pwhole;char deci[32];char *pdeci;int wend = 0;int ww;int wd;int ii;int re = 1;int co = 0;float ff; wend = 0; ww = 0; wd = 0; pwhole = &whole[0]; pdeci = &deci[0]; ff = 0.0; while(*argv[1]) { if(*argv[1] == 46)//look for decimal i.e a dot '.' { wend = 1; } else { if(wend) { *pdeci = *argv[1]-48; //printf("%d\n",*pdeci); pdeci++; wd++; } else { *pwhole = *argv[1]-48; //printf("%d\n",*pwhole); pwhole++; ww++; } } argv[1]++; }// while(*argv[1]) *pwhole = '\0'; *pdeci = '\0'; pwhole--; for(ii=0;ii<ww;ii++) { //printf("%d\n",*pwhole); ff = ff + *pwhole*pow(10,ii); pwhole--; } pdeci = pdeci - wd; for(ii=1;ii<wd+1;ii++) { //printf("%d\n",*pdeci); ff = ff + *pdeci*pow(10,-ii); pdeci++; } return ff;}// float str2float(char * argv[])void PrintHelpMess(){ printf("ERROR! No Input. One expected\n"); printf("Usage> a.out <angle between 0 and 90>\n"); printf("Example> a.out 54\n");}void HandleArgs(int argc){switch(argc) { case 1 : { PrintHelpMess(); exit(-1); }// case 1 : case 2 : { break; }// case 2 : default: { printf("ERROR! Too many args at command line. Exiting....\n"); exit(-1); } }// switch(argc)}// void HandleArgs(int argc)float msin(float angle){ int itt = 5; float re = 0.60725; //float re = 1.0; float im = 0; float new_re; float new_im; float mag; float angles[13]; float accum; angles[0] = 45.0; angles[1] = 26.56505; angles[2] = 14.03624; angles[3] = 7.12502; angles[4] = 3.57633; angles[5] = 1.78991; angles[6] = 0.89517; angles[7] = 0.44761; angles[8] = 0.22381; angles[9] = 0.111905; angles[10] = 0.055953; angles[11] = 0.027976; angles[12] = .0139882; accum = 0; for(itt=0;itt<13;itt++) { if(angle > accum) { accum = accum + angles[itt]; new_re = re-im/pow(2,itt); new_im = im+re/pow(2,itt); printf("accum = %f,pow=%f\n",accum,pow(2,itt)); } else { accum = accum - angles[itt]; new_re = re+im/pow(2,itt); new_im = im-re/pow(2,itt); printf("accum2 = %f,pow=%f\n",accum,pow(2,itt)); } re=new_re; im=new_im; mag = pow((pow(new_re,2) + pow(new_im,2)),0.5); printf("new_re = %f,new_im=%f,mag=%f,angle = %f\n",new_re,new_im,mag,angles[itt]); } //printf("cos = %f,sin=%f,angle(rad) = %f\n",new_re,new_im,(angle*3.141592)/180); return(new_im); }// float msin(float angle)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -