信号(音)の1つのクラス分類に使用するアルゴリズムはどれですか?
-
22-07-2019 - |
質問
更新この質問は、以前は「信号(音)パターン検出の簡単なアルゴリズムの名前を教えてください"」というタイトルでした。
- 私の目的は、ノイズの多い信号で特定のパターンの存在を検出することです。マイクで音を録音している昆虫の種の存在を検出したい。以前に昆虫の音をデジタル形式で録音しました。
- 音声認識をしようとはしていません。
- すでに、入力信号とパターン間のコンボリューションを使用して、それらの類似性レベルを決定しています。しかし、この手法は、離散時間(つまり、信号が一定の間隔で発生するデジタル通信)と、2つの特定のパターン(1つのパターンのみ)の間で入力信号を区別するのに適していると思います。
- ニューラルネットワークを使用したことがないため、ニューラルネットワークを使用するのが怖く、そのコードを埋め込むことができるかどうかわかりません。
他のアプローチをいくつか教えていただけますか、それとも私の現在のアプローチがまだ良いアイデアであるか、ニューラルネットワークが実行可能な方法であると確信させてください。
更新既に2つの良い回答がありますが、別の回答があれば歓迎され、報われることさえあります。
解決
畳み込みからのステップアップは、動的なタイムワーピングです。これは畳み込み演算子と考えることができます1つの信号を伸縮して、別の信号に最適に一致させます。
おそらく、より簡単なアプローチは、サンプルのFFTを実行して、フィルター処理できる特定の周波数を昆虫が特定しているかどうかです。
より複雑な側面ではありますが、ニューラルネットワークではありませんが、 libsvm および svmlight でデータをスローできます。
試行する経路に関係なく、FFTなどのツールを使用して昆虫が発する音の性質を調べることに時間を費やします。結局のところ、自分でできるなら、音を分類するためにコンピューターを教える方が簡単です。
他のヒント
典型的な 1つのクラス分類の問題、つまりあなたのような気にしない他の物の大きなプールで1つの物を検索したい。
やりたいことは、生の記録の短い部分ごとに計算できる一連の機能または記述子を見つけて、クリーンな記録が生成する機能と照合できるようにすることです。畳み込みは必ずしも悪いとは思いませんが、ノイズにかなり敏感なので、あなたの場合には最適ではないかもしれません。 あなたのケースで実際に機能するのは、ビン化フーリエ変換でのパターンマッチングです。信号のフーリエ変換を使用して、(電力対時間のグラフではなく)電力対周波数のグラフを取得し、周波数を帯域で分割し、各帯域の平均電力を特徴として取得します。データにほとんどホワイトノイズが含まれている場合、同様の長さの生の昆虫の音から得られるパターンは、参照音のパターンと非常によく一致します。 この最後のトリックは正常に使用されています(ウィンドウを使用して)、Googleなどが使用するオーディオキャプチャをクラックします視覚障害者がアクセスできるサイト。
ところで、生のオーディオ信号はデジタルなので(そうでなければコンピューターでの処理は機能しません;-))、畳み込みが適切です。基準信号と、各サンプルから始まる生の入力からの同じ長さのサンプルとの間で畳み込みを実行する必要があります。したがって、参照信号の長さがNで、生のサンプルの長さがMで、M> = Nの場合、参照信号と1から始まる生の入力からのPサンプルとの間でM-N + 1 = Pの畳み込みを実行する必要があります。 P.生のサンプル内の基準音の位置の最良の可能性は、最も高い畳み込みスコアを持つサンプルです。これは非常に短時間で非常に時間がかかることに注意してください。
参照サンプルの2倍の長さの生データから50%のオーバーラップサンプルを使用して上記で説明したフーリエ変換ベースのマッチングは、少なくとも高速になります(必ずしも良くなるわけではありませんが)
さらに情報が必要です。
ノイズの多い信号と言うとき、背景雑音は何ですか?それは、最初の近似値に対して、定常的(統計的な意味、つまり一定)ですか、それとも非定常的(つまり、他の動物の鳴き声など、他の音を含む可能性が高いですか)
バックグラウンドノイズが非定常の場合、最善の策は Independent Components Analysisと呼ばれるものを使用することです。 与えられた混合音をコンポーネントソースに分離しようとする場合、昆虫自体のオリジナルの録音さえ必要ありません。多数のICAソフトウェアは、Wikipediaページからリンクされています。
(編集:ICAはブラインドソース分離の場合です( BSS)、BSSを実行する他の多くの方法があり、それらも検索するのに役立つかもしれません。)
ただし、バックグラウンドノイズが定常的である場合、問題ははるかに簡単です(依然として非常に難しい):
この場合、使用するアプローチは次のとおりです。少しのノイズの振幅スペクトルと昆虫の鳴き声の振幅スペクトルを分析します。運がよければ、昆虫の鳴き声は一般に、ノイズとは異なる周波数帯域にある可能性があります。その場合は、適切なハイ、ロー、またはバンドパスフィルターで着信信号をフィルターします。
その後、「より多くのエネルギー」を含むフィルタリングされた信号のセクションを比較してみてください。 (フィルタリングされた)昆虫の呼び出しで平均よりもおそらく、A。Rexによって提案された画像類似性アルゴリズムを使用することによって。
編集:バックグラウンドノイズは非定常であるため、非ガウスソースのブラインドソース分離により、さらにアルゴリズムが追加される場合があります。答えは、あなたが望むことをする単純なアルゴリズムはないということだと思います。
一致フィルターを試すことができます。実際に使用したことはありませんが、良いことを聞いたことがあります。
また、単純ではありませんが、Hidden Markov Model(HMM、音声認識なしと言っていますが、聞いてください!)が最良の結果をもたらすと思います。繰り返しますが、実際に使用したことはありませんが、オープンソースの実装が至る所で利用可能です。既存の「クリーン」を使用してトレーニングするだけです。昆虫の記録。次に、1つのオープンソース実装を示します。一般的な非表示マルコフモデルライブラリ。
確かにこれは私の専門分野ではありませんが、最初に考えたのは再帰最小二乗フィルター-自己相関を実行します。現在使用している畳み込みフィルターに似ていますが、もう少し高度です。カルマンフィルタリングはこれを拡張したものです。これは、複数のノイズのある測定値から信号を再生成するために使用されるため、この場合はおそらく有用ではありません。オフハンドのニューラルネットワークを拒否しません。この種のニューラルネットワークは非常に便利です(適切にトレーニングされている場合)。
これについてさらに深く考えると、おそらくFFTを使用することをお勧めします。探している信号は非常に帯域制限されている可能性があり、おそらくデータに対してバンドパスフィルターを使用してからFFTを使用し、最終的には時間領域データの代わりにそのデータに対して単純な畳み込みフィルターを使用する方が幸運でしょうポイント。または、両方を実行して、2倍のデータを取得します。私は数学にあまり詳しくないので、この方法を使用して重要な(線形依存ではない)結果が得られるかどうかはわかりませんが、失うのは時間だけです。
MAツールボックスに興味があるかもしれません。類似度のMatlab実装。
私は個人的にこの論文を見つけました。 MPEG-7の一般的な音声分類と類似性、興味深い。ただし、ペイウォールの背後にある可能性があり(わかりません)、実際にはそれほど有用ではない可能性があります。
GPL版フレームワーク Marsyas には、keaと呼ばれる機械学習分類のためのツールがあります。私の推測では、これはおそらくあなたが望んでいることをしないか、接続するのが面倒です。
それ以外の私の唯一のアイデアは、フーリエ変換を行い、効果的にサウンドをグレースケール画像に変換することです。次に、多数の画像類似度アルゴリズムのいずれかを使用します。
Naive Bayes Classifier は、サウンドサンプルを、関心のある種とそうでない種。複雑な現象には非常によく機能します。私はかつて、特定のミリ波レーダーデータセットにブラシ、タンクトラップなどの障害物が含まれているかどうかを判断するために使用しました。ベイジアン分類器の連続データを個別のチャンクに分割する方法については、連続データセットと昆虫サンプルと同じ長さのチャンクを分割します。たとえば、比較するサンプルの長さが2秒の場合、識別器に0〜2秒、0.5〜2.5秒、1〜3秒などを供給することができます。識別器をトレーニングする必要がありますが、それは一般的なことです機械学習ベースのソリューションの要件。
これらの種類のアプローチは、あなたの昆虫種が探している単一の比較的明確な音を持っていない場合に進む唯一の方法です。相互相関/畳み込みは、大音量または小音量の単一のサウンドよりも複雑なものを探している場合、有用性が限られています。
ウィナーフィルターアプローチが必要な場合があります。
Google:FastICAアルゴリズム。 ICAとブラインドソース信号分離を互換的に使用する人もいます。アルゴリズムの著者は、ICAでアマゾンで使用される約40〜60ドルの素晴らしい本を書きました。
Goertzel-単純なパターン検出と複雑な周波数分離のいずれかに使用できます。 C#での実装