2010-03-04 69 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