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;
        }
    }
}

 

posted on 2018-09-29 00:18  &大飞  阅读(968)  评论(0编辑  收藏  举报

导航