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