1

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

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

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

4

3 回答 3

3

生成波浪比识别波浪要容易得多。我有一个小项目,可以产生一些波浪。这是我的项目中的一个示例:

    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这里在波形的每一帧都会更新,并且取决于您正在创建的波形的频率。

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

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

于 2011-09-14T00:01:01.327 回答
0

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

于 2011-09-13T23:35:04.510 回答
0

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

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

于 2011-09-14T06:09:39.560 回答