我想编写可以采取某种输入的东西,并将其识别为方波,三角波或某种波形。我还需要一些产生波浪的方法。
我确实有使用C / C ++的经验,但是,我不确定如何模拟所有这些。最后,我想将其转换为微控制器程序,以读取其模拟输入以确定波形。
编辑:对不起;我应该提到它将处于已知频率并且振幅应该是未知的。答案 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。