2010-03-04 72 views
0

我觉得这是一个愚蠢的问题,但我想不出一个好的方法来做到这一点。在编译时或运行时在C#中创建LUT

我想要做的是在编译时或运行时创建一个正弦波LUT。理想的编译时间,但如果编码更容易,运行时间就没有问题。不过,我希望这个静态对象可以被包含它的库的任何东西访问(我不想传递它)。

我有一种感觉,我将改变振幅,样本数量,周期数(在编译之间,它会在程序运行后设置)等等,所以我不想必须在其他地方生成正弦波并对值进行硬编码。

我希望它是静态的,因为我不想在每次需要时重新创建正弦波。我遇到的问题是我没有一个构造函数来初始化它,我不知道如何让它运行一次而不传递给对象或跨越几个不同的库。

我知道这一定是可能的,可能很容易,但我不确定在哪里看。最重要的是,它可能只是一个编程风格问题,所以任何建议都会受到欢迎。

谢谢

+1

你都知道,你可以有一个静态构造函数,对不对? – 2010-03-04 21:01:01

回答

1
public static class Sines { 
    private static double[] lut; 

    static Sines() { 
     lut = new double[2048]; 
     for (int ix = 0; ix < lut.Length; ++ix) 
     lut[ix] = Math.Sin(Math.PI * 2 * ix/lut.Length); 
    } 

    public static double Lookup(int index) { 
     return lut[index]; 
    } 
    } 

用法:

double value = Sines.Lookup(1024); 
+0

谢谢,正是我在找的东西。 – EatATaco 2010-03-08 19:57:30

0

这并不完全清楚你会希望这一波做什么。你是否想要获得任何特定时间的价值,或者是否有你想让波做的事作为一个整体

除了用正确的值(基于频率和时间)调用Math.Sin之外,还有什么需要做的事情,然后再乘以振幅?你是否已经尝试过,发现如果你每次需要时都做得太慢?

+0

我应该承认,这主要是学术问题,因为我可能会在Math.Sin的每一次需要价值时逃脱。然而,从嵌入式和FPGA编程背景出发,效率是我头上的第一件事,即使我只能做Math.Sin,也很高兴知道如何做到这一点。 但是我会用它来做很多事情,主要的一个(它关注我的时间)是一个有8192个样本的波浪上的相关滤波器。 – EatATaco 2010-03-04 21:06:21

+0

@EatATaco:我建议你首先根据API设计你的“Wave”类应该是什么样子 - 然后你会发现在内部实现缓存非常容易。 (我建议创建一个数组。) – 2010-03-04 21:14:48