Создание LUT в C # во время компиляции или во время выполнения - PullRequest
0 голосов
/ 04 марта 2010

Я чувствую, что это глупый вопрос, но я не могу придумать, как это сделать.

То, что я хочу сделать, это создать LUT синусоидальной волны во время компиляции или во время выполнения. В идеале время компиляции, но время выполнения хорошо, если его намного проще кодировать. Однако я хочу, чтобы этот статический объект был доступен всему, что включает в себя его библиотеку (я не хочу передавать его).

У меня есть ощущение, что я буду менять амплитуду, количество выборок, количество циклов (между компиляциями, оно будет установлено после запуска программы) и т. Д., Поэтому я не хочу, чтобы для генерации синусоиды в другом месте и жесткого кодирования значений.

Я хочу, чтобы оно было статичным, потому что я не хочу воссоздавать синусоидальную волну каждый раз, когда мне это нужно. У меня проблема в том, что у меня нет конструктора для его инициализации, и я не уверен, как еще заставить его запускаться один раз, не передавая его объектам или нескольким различным библиотекам.

Я знаю, что это должно быть возможно и, вероятно, очень легко, но я просто не знаю, где искать. Кроме того, это может быть просто проблемой стиля программирования, поэтому любые предложения будут приветствоваться.

Спасибо

Ответы [ 2 ]

1 голос
/ 05 марта 2010
  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 голосов
/ 04 марта 2010

Не совсем ясно, что вы хотите, чтобы эта волна делала. Вы пытаетесь получить значение для какого-то определенного времени, или вы хотите, чтобы волна делала в целом ?

Есть ли что-то, что вам нужно сделать, кроме вызова Math.Sin с правильным значением (на основе частоты и времени), а затем умножить его на амплитуду? Вы уже пробовали это и обнаружили, что это слишком медленно, если вы делаете это каждый раз, когда вам это нужно?

...