ユーザーの操作がなければ、プログラムはADCからの記録にどのタイプの波形が存在するかをどのように識別しますか?
この質問のために:一定周波数の三角波、方形波、正弦波、半正弦波、またはのこぎり波。レベルと周波数は任意であり、ノイズ、少量の歪み、およびその他の欠陥があります。
私もいくつかの(素朴な)アイデアを提案します、そしてあなたはそれらを賛成または反対に投票することができます。
ユーザーの操作がなければ、プログラムはADCからの記録にどのタイプの波形が存在するかをどのように識別しますか?
この質問のために:一定周波数の三角波、方形波、正弦波、半正弦波、またはのこぎり波。レベルと周波数は任意であり、ノイズ、少量の歪み、およびその他の欠陥があります。
私もいくつかの(素朴な)アイデアを提案します、そしてあなたはそれらを賛成または反対に投票することができます。
ファンダメンタルズを見つけるために自己相関を取ることから始めたいと思うことは間違いありません。
それで、波形の 1 周期 (おおよそ) を取ります。
次に、その信号の DFT を取得し、すぐに最初のビンの位相シフトを補正します (最初のビンは基本波であり、すべての位相が相対的であれば、タスクはより簡単になります)。ここで、すべてのビンを正規化して、基本波がユニティ ゲインになるようにします。
次に、残りのビン (高調波を表す) を、テストしたい事前に保存された一連の波形と比較対照します。最も近いものを受け入れ、ノイズフロアの測定によって決定される精度のしきい値を満たさない場合は全体を拒否します。
FFT を実行し、奇数と偶数の高調波ピークを見つけて、それらが減少する速度を一般的な波形のライブラリと比較します..ピーク...比率。
自己相関を実行して基本周波数を見つけ、RMSレベルを測定し、最初のゼロ交差を見つけてから、その周波数、位相、およびレベルで一般的な波形を差し引いてみてください。最良の(そしてあるしきい値を超える)キャンセルした方が勝ちです。
この回答は、ノイズがなく、これが単純な学術的演習であることを前提としています。
時間領域では、波形のサンプルごとの差をとります。結果をヒストグラム化します。分布がゼロで明確に定義されたピーク (モード) を持っている場合、それは方形波です。分布に正の値で明確に定義されたピークがある場合、それはのこぎり歯です。分布に明確に定義された 2 つのピーク (1 つは負、もう 1 つは正) がある場合、それは三角形です。分布が広く、どちらかの側でピークに達している場合、それは正弦波です。
より多くの情報を身につけてください...
理論的に完全な正弦波には高調波部分がない(つまり、基本波のみ)ことをすでに知っていると思いますが、ADCを通過しているので、理論的に完全な正弦波のアイデアを窓の外に投げ出すことができます。 。エイリアシングと戦い、「実際の」パーシャルとは何か、アーティファクトとは何かを判断する必要があります...幸運を祈ります。
以下の情報は、csoundに関するこのリンクからのものです。
(*)のこぎり波には、(理論的には)無限の数の倍音部分が含まれ、それぞれが部分数の逆数の比率になります。したがって、基本波(1)の振幅は1、2番目の部分1/2、3番目の1/3、およびn番目の1/nです。
(**)方形波には、(理論的には)無限の数の高調波部分が含まれますが、奇数の高調波(1,3,5,7、..。)のみが含まれます。振幅は、部分数の逆数の比率になります。 、のこぎり波のように。したがって、基本波(1)の振幅は1、3番目の部分1/3、5番目の1/5、およびn番目の1/nです。
最初に基本周波数と位相を見つけます。FFT でそれを行うことができます。サンプルを正規化します。次に、各サンプルを、テストする波形のサンプル (同じ周波数と同じ位相) で減算します。結果を 2 乗してすべて足し、サンプル数で割ります。最小の数字が求める波形です。