【问题标题】:Identifying / generating a waveform?识别/生成波形?
【发布时间】:2011-11-16 14:29:10
【问题描述】:

我想编写一些可以接受某种输入并将其识别为方波、三角波或某种波形的代码。我还需要某种方式来产生所述波。

我确实有使用 C/C++ 的经验,但是,我不确定如何模拟所有这些。最后,我想把它翻译成一个微控制器程序来读取它的模拟输入来确定波形。

编辑:对不起;我应该提到它的频率是已知的,幅度应该是未知的。

【问题讨论】:

标签: c++ c analysis signals waveform


【解决方案1】:

从 MATLAB 或免费的 GNU Octave 类似工作开始。您可以生成具有所需波形的数组并编写适当的函数来解码/识别。当你搞定细节后,获取一份 FFTW(西方最快的傅立叶变换)库来处理你的 c/c++ 代码的 fft/ifft 例程。 MATLAB 的信号处理工作台模块有很多有用的工具来实现您的目标。

【讨论】:

  • 这并没有解决真正的问题,即波形的分类。
  • 在频域中,提到的几个不同的波形应该是非常有区别的。
【解决方案2】:

生成波浪比识别波浪要容易得多。我有一个小项目可以产生一些波浪。以下是来自my project 的示例:

    float amplitude;
    switch (sound->wavetype)
    {
        case LA_SQUARE:
            amplitude = sound->theta > .5 ? 1.0 : -1.0;
            break;
        case LA_SINE:
            amplitude = sin(2 * PI * sound->theta);
            break;
        case LA_TRIANGLE:
            amplitude = sound->theta > .5 ? 4 * sound->theta - 3 : -4 * sound->theta + 1;
            break;
        case LA_SAWTOOTH:
            amplitude = 2 * sound->theta - 1.0;
            break;
        case LA_NOISE:
            amplitude = ((float)rand() / RAND_MAX);
            break;
        default:
            ;
    }

theta 此处在波形的每一帧都会更新,并且取决于您正在创建的波形的频率。

至于识别波,如果您知道您将获得简单的、未混合的方形、三角形或正弦波,您可能只需进行一些简单的测试。观察波沿任意两点的幅度变化。如果它们相同,则为方波。如果它们是线性变化的(也就是说,如果幅度的变化是恒定的),你就会得到一个三角波(或者锯齿波,如果你要区分的话)。否则,它是一个正弦波。请记住,此检查仅在您只期待那些类型的波并且它们没有被混合或任何东西时才有效。我能想到的还有其他一些极端情况,但我会让你担心的。

如果您正在做一些更有趣的事情,您可能需要查找一本专门研究这类事情的书,就像 cmets 部分中建议的那样。

【讨论】:

    【解决方案3】:

    识别波形:如果您知道频率,则可以通过使用离散梯度来做很多事情,正如 Alex 在他的回答中所建议的那样。

    另一种方法是使用插值技术并查看系数。还有一个是快速傅立叶变换。最后两个在计算上更加密集,但也更加准确,尤其是在识别更复杂的波形时。您必须查看您的 uC 是否足够快,或者,如果幸运的话,是否有硬件 FFT。

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 2015-11-22
      • 1970-01-01
      • 2010-09-15
      • 2019-08-13
      • 2011-06-28
      相关资源
      最近更新 更多