【问题标题】:Creating an LUT in C# at compile time or run time在编译时或运行时在 C# 中创建 LUT
【发布时间】:2010-03-04 20:53:31
【问题描述】:

我觉得这是一个愚蠢的问题,但我想不出一个好的方法。

我想做的是在编译时或运行时创建一个正弦波 LUT。理想情况下是编译时间,但如果它更容易编码,则运行时间很好。但是,我希望包含其库的所有内容都可以访问此静态对象(我不想传递它)。

我有一种感觉,我会改变幅度、样本数、周期数(在编译之间,一旦程序运行就会设置)等等,所以我不想在别处生成正弦波并对值进行硬编码。

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

我知道这一定是可能的,而且可能非常容易,但我只是不知道去哪里找。最重要的是,这也可能只是一个编程风格问题,因此欢迎提出任何建议。

谢谢

【问题讨论】:

  • 你知道你可以有一个静态构造函数,对吧?

标签: c# static coding-style runtime compilation


【解决方案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);

【讨论】:

  • 谢谢,正是我想要的。
【解决方案2】:

目前还不完全清楚你希望这波做什么。您是在尝试获取任何特定时间的价值,还是希望 Wave 做一些事情作为一个整体

除了使用正确的值(基于频率和时间)调用Math.Sin,然后将其乘以幅度之外,您还需要做些什么吗?您是否已经尝试过,发现每次需要时都这样做太慢了?

【讨论】:

  • 我应该承认这主要是学术性的,因为每次我需要一个值时我都可以通过 Math.Sin 逃脱。然而,来自嵌入式和 FPGA 编程背景,效率是我脑海中浮现的第一件事,即使我可以只做 Math.Sin,知道如何做到这一点也很好。但我会将它用于许多事情,主要的事情(与时间有关)是对具有 8192 个样本的波的相关滤波器。
  • @EatATaco:我建议您首先根据 API 设计“Wave”类的外观 - 然后您可能会发现在内部实现缓存非常容易。 (我建议构建一个数组。)
猜你喜欢
  • 2013-07-23
  • 2018-11-07
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 2021-02-19
相关资源
最近更新 更多