2010-03-04 12 views
0

J'ai l'impression que c'est une question stupide, mais je ne vois pas de bonne façon de le faire. Ce que je veux faire est de créer une LUT à onde sinusoïdale au moment de la compilation ou de l'exécution. Idéalement, compilez le temps, mais le temps d'exécution est correct s'il est beaucoup plus facile de coder. Cependant, je veux que cet objet statique soit accessible par tout ce qui inclut sa bibliothèque (je ne veux pas avoir à le passer). J'ai l'impression que je vais changer l'amplitude, le nombre d'échantillons, le nombre de cycles (entre les compiles, il sera réglé une fois que le programme est en cours d'exécution), etc, donc je ne veux pas doivent générer l'onde sinusoïdale ailleurs et coder dur les valeurs. Je veux que ce soit statique parce que je ne veux pas avoir à recréer l'onde sinusoïdale chaque fois que j'en ai besoin. Le problème que je rencontre est que je n'ai pas de constructeur pour l'initialiser et je ne sais pas comment le faire fonctionner une seule fois sans le passer aux objets ou à travers quelques bibliothèques différentes. Je sais que cela doit être possible et probablement très facile, mais je ne sais pas trop où chercher. En plus de cela, il pourrait s'agir simplement d'un problème de style de programmation, donc toute suggestion serait la bienvenue.Créer une LUT en C# au moment de la compilation ou de l'exécution

Merci

+1

Vous savez que vous pouvez avoir un constructeur statique, non? –

Répondre

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

Utilisation:

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

Merci, exactement ce que je cherchais. – EatATaco

0

Ce n'est pas tout à fait clair ce que vous voulez que cette vague à faire. Essayez-vous d'obtenir la valeur à un moment donné, ou y a-t-il quelque chose que vous voulez que la vague fasse dans son ensemble?

Y at-il quelque chose que vous devez faire au-delà d'appeler Math.Sin avec la bonne valeur (basée sur la fréquence et le temps), puis multipliez-le par l'amplitude? Avez-vous déjà essayé et trouvé que c'est trop lent si vous le faites chaque fois que vous en avez besoin?

+0

Je devrais admettre que c'est principalement académique car je pourrais probablement partir avec faire le Math.Sin chaque fois que j'ai besoin d'une valeur. Cependant, venant d'un contexte de programmation embarqué et FPGA, l'efficacité était la première chose qui me venait à l'esprit et, même si je pouvais juste faire Math.Sin, ce serait bien de savoir comment faire. Mais je vais l'utiliser pour un certain nombre de choses, la principale (ce qui me préoccupait au sujet du temps) un filtre de corrélation sur les ondes qui ont 8192 échantillons. – EatATaco

+0

@EatATaco: Je vous suggère de concevoir d'abord ce que votre classe "Wave" devrait ressembler en termes d'API - et vous pouvez trouver qu'il est très facile d'implémenter la mise en cache en interne. (Je suggère de construire un tableau.) –

Questions connexes