C# 语言sin和cos函数的实现 -- 可以用于帧同步的sin查表算法
不多说了,直接贴代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using FP; namespace FP { class TrigonometricFunction { protected static int TAB_N = 256; //定义查表的点数 protected static FPoint PI = new FPoint(3.14159265f); //定义圆周率值 protected static List SIN_TAB = new List(); protected static TrigonometricFunction _Instance = null; protected static TrigonometricFunction Instance() { if (_Instance == null) { _Instance = new TrigonometricFunction(); } return _Instance; } protected TrigonometricFunction() { SIN_TAB.Add(0); SIN_TAB.Add(245); SIN_TAB.Add(491); SIN_TAB.Add(735); SIN_TAB.Add(980); SIN_TAB.Add(1224); SIN_TAB.Add(1467); SIN_TAB.Add(1710); SIN_TAB.Add(1951); SIN_TAB.Add(2191); SIN_TAB.Add(2430); SIN_TAB.Add(2667); SIN_TAB.Add(2903); SIN_TAB.Add(3137); SIN_TAB.Add(3369); SIN_TAB.Add(3599); SIN_TAB.Add(3827); SIN_TAB.Add(4052); SIN_TAB.Add(4276); SIN_TAB.Add(4496); SIN_TAB.Add(4714); SIN_TAB.Add(4929); SIN_TAB.Add(5141); SIN_TAB.Add(5350); SIN_TAB.Add(5556); SIN_TAB.Add(5758); SIN_TAB.Add(5957); SIN_TAB.Add(6152); SIN_TAB.Add(6344); SIN_TAB.Add(6532); SIN_TAB.Add(6716); SIN_TAB.Add(6895); SIN_TAB.Add(7071); SIN_TAB.Add(7242); SIN_TAB.Add(7410); SIN_TAB.Add(7572); SIN_TAB.Add(7730); SIN_TAB.Add(7883); SIN_TAB.Add(8032); SIN_TAB.Add(8176); SIN_TAB.Add(8315); SIN_TAB.Add(8449); SIN_TAB.Add(8577); SIN_TAB.Add(8701); SIN_TAB.Add(8819); SIN_TAB.Add(8932); SIN_TAB.Add(9040); SIN_TAB.Add(9142); SIN_TAB.Add(9239); SIN_TAB.Add(9330); SIN_TAB.Add(9415); SIN_TAB.Add(9495); SIN_TAB.Add(9569); SIN_TAB.Add(9638); SIN_TAB.Add(9700); SIN_TAB.Add(9757); SIN_TAB.Add(9808); SIN_TAB.Add(9853); SIN_TAB.Add(9892); SIN_TAB.Add(9925); SIN_TAB.Add(9952); SIN_TAB.Add(9973); SIN_TAB.Add(9988); SIN_TAB.Add(9997); SIN_TAB.Add(10000); } public static FPoint Sin(FPoint pi) { TrigonometricFunction fuc = TrigonometricFunction.Instance(); int n = 0; int a = 0; int TAB_N = TrigonometricFunction.TAB_N; List SIN_TAB = TrigonometricFunction.SIN_TAB; n = (pi * TAB_N / 2 / PI).ToInt(); // SIN_TAB[i] = sin(2*PI*i/TAB_N); if (n >= 0 && n <= TAB_N / 4) // 0 ~ PI/2 { a = SIN_TAB[n]; } else if (n > TAB_N / 4 && n < TAB_N / 2) // PI/2 ~ PI { n -= TAB_N / 4; a = SIN_TAB[TAB_N / 4 - n]; } else if (n >= TAB_N / 2 && n < 3 * TAB_N / 4) // PI ~ 3/4*PI { n -= TAB_N / 2; a = -SIN_TAB[n]; } else if (n >= 3 * TAB_N / 4 && n < TAB_N) // 3/4*PI ~ 2*PI { n = TAB_N - n; a = -SIN_TAB[n]; } FPoint ret = new FPoint(a); ret = ret * 0.0001f; return ret; } public static FPoint Cos(FPoint pi) { FPoint PI = TrigonometricFunction.PI; FPoint pi2 = pi + PI / 2; if (pi2 > 2 * PI) pi2 -= 2 * PI; FPoint a = TrigonometricFunction.Sin(pi2); return a; } } }