识别/生成波形?

时间:2011-09-13 23:25:25

标签: c++ c analysis signals waveform

我想编写可以采取某种输入的东西,并将其识别为方波,三角波或某种波形。我还需要一些产生波浪的方法。

我确实有使用C / C ++的经验,但是,我不确定如何模拟所有这些。最后,我想将其转换为微控制器程序,以读取其模拟输入以确定波形。

编辑:对不起;我应该提到它将处于已知频率并且振幅应该是未知的。

3 个答案:

答案 0 :(得分:3)

生成波浪比识别它们要容易得多。我有一个小项目,可以做一些波浪生成。以下是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此处在波形的每一帧都会更新,并且取决于您正在创建的波的频率。

至于识别波浪,如果你知道你将会变得简单,没有混合的正方形,三角形或正弦波,你可以做一些简单的测试。观察波浪中任意两点的振幅变化。如果它们是相同的,方波。如果它们线性变化(也就是说,如果幅度的变化是恒定的),你就会得到一个三角波(或锯齿,如果你正在进行区分)。否则,这是一个正弦波。请记住,只有在您期望这些类型的波浪时,此检查才有效,并且它们不会混合或任何其他类型。我可以想到其他一些边缘情况,但我会让你担心。

如果你做得更好,你可能需要查阅一本专门介绍这类事情的书,就像评论部分所建议的那样。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

识别波形:如果你知道频率,你可以通过使用离散梯度做很多事情,正如亚历克斯在答案中所说的那样。

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