ある種の入力を取り、それを方形波、三角波、またはある種の波形として識別できるものをコーディングしたいと思います。また、前述の波を生成する方法も必要です。
C/C++ の経験はありますが、これらすべてをシミュレートする方法がわかりません。最終的には、アナログ入力を読み取って波形を決定するためのマイクロコントローラー プログラムに変換したいと考えています。
編集:申し訳ありません。私はそれが既知の周波数であり、振幅が不明であるべきであると述べたはずです。
波を生成することは、それらを識別するよりもはるかに簡単です。私はいくつかの波の生成を行う小さなプロジェクトを持っています。これが私のプロジェクトの例です:
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
ここでは、波形に沿ってフレームごとに更新され、作成している波の周波数に依存します。
波の識別に関しては、単純で混合されていない正方形、三角形、または正弦波が得られることがわかっている場合は、おそらくいくつかの簡単なテストを行うことができます. 波に沿った任意の 2 点での振幅の変化を見てください。同じなら方形波。それらが線形に変化している場合 (つまり、振幅の変化が一定である場合) は、三角波 (または、その区別をしている場合はのこぎり波) が得られます。それ以外の場合は、正弦波です。このチェックは、これらのタイプの波だけを期待しており、それらが混合されていない場合にのみ機能することに注意してください。他にも考えられるエッジケースがいくつかありますが、それについては心配させてください。
より手の込んだことをしている場合は、コメントセクションで提案されているような、この種のことを専門とする本を調べる必要があるでしょう.
波形を特定するには:周波数がわかっている場合は、Alexが回答で示唆しているように、離散勾配を使用することでかなり多くのことができます。
別の方法は、内挿法を使用して係数を調べることです。さらにもう1つは、高速フーリエ変換です。これらの最後の2つは、計算量が多くなりますが、特により複雑な波形を識別する場合は、はるかに正確になります。uCが十分に高速であるかどうか、または運が良ければハードウェアFFTがあるかどうかを確認する必要があります。
MATLAB または無料の GNU Octave から始めてください。目的の波形で配列を生成し、適切な関数を記述してデコード/識別できます。詳細が決まったら、FFTW (西部で最速のフーリエ変換) ライブラリのコピーを入手して、c/c++ コードの fft/ifft ルーチンを処理します。MATLAB の信号処理ワークベンチ モジュールには、目的を達成するための便利なツールがたくさんあります。