C++ 识别/生成波形?

C++ 识别/生成波形?,c++,c,analysis,signals,waveform,C++,C,Analysis,Signals,Waveform,我想编码一些可以接受某种输入的东西,并将其识别为方波、三角波或某种波形。我还需要一些方法来产生这些波 我确实有使用C/C++的经验,但是,我不确定如何模拟所有这些。最后,我想把它转换成一个微控制器程序来读取它的模拟输入来确定波形 编辑:对不起;我应该提到它的频率是已知的,振幅是未知的 从MATLAB或免费的GNU倍频程开始。您可以生成具有所需波形的阵列,并编写适当的函数来解码/识别。当你有了详细的工作,抓取一个FFTW(西方最快的傅里叶变换)库的副本来处理你的c/c++代码的fft/ifft例程

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

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


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

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

生成波形比识别波形要容易得多。我有一个小项目,可以产生一些波浪。下面是一个例子:

θ
在波形的每一帧上都会更新,这取决于所创建的波的频率

至于波的识别,如果你知道你将得到简单的,不混合的方波,三角波或正弦波,你可以做一些简单的测试。观察沿波任意两点的振幅变化。如果它们是一样的,方波。如果它们是线性变化的(也就是说,如果振幅的变化是恒定的),你就得到了一个三角波(或者一个锯齿波,如果你这样区分的话)。否则,它是一个正弦波。请记住,只有当您只期望这些类型的波,并且它们没有被混合或任何东西时,此检查才有效。我能想到还有一些其他的边缘案例,但我会让你担心的


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

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


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

波形是否有噪声?你知道频率吗?你知道振幅吗?一般来说,这是一个很难解决的问题;我应该提到它的频率是已知的,振幅应该是未知的。这并没有解决真正的问题,即波形的分类。在频域中,提到的两种不同的波形应该是非常不同的。
    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:
            ;
    }