音楽ファイルの楽器音を分離するアルゴリズムを開発しようとしています。C#、C++ DLL を使用。私はそれを達成するためにかなり長い時間を費やしました。だから私がこれまでにやったことは次のとおりです。
- PCM で特殊な FFT を実行します (時間領域と周波数領域の両方で高解像度が得られます)。
- 人間の聴覚システム (心理音響モデル) をシミュレートするための FFT ビンでのフィルターバンク計算
- 一部の機械学習用の入力データを供給するためのピーク検出によるパターン認識 (現在計画レベル)
現在の進行状況では、「極大値を選択する」という単純な方法でピークを検出しました。ざっくりですが、f(x)の周波数応答、xを周波数インデックスとして、f(x-1) < f(x) > f(x+1)の場合にピークとして検出します。
しかし、ここでいくつかの問題が発生しました。周波数領域で 2 つ以上の信号が近くに存在する場合、この方法では 1 つのピークが検出されるだけで、他のすべての信号は隠されます。数日間ウェブを検索しました。「ピーク純度」、「ピーク分離」と呼ばれるものがありました。ピーク分離を行うには、いくつかの方法がありました。彼らは実際にピークをうまく分離しています。ここに私がググったいくつかの写真があります。
(出典:クロマトグラフィーオンライン.org )
このような状況では、「デコンボリューション」を使用する方法が最適だと思います。しかし、スペクトルをデコンボリューションする方法がわかりません。デコンボリューションでピークを分離します。私の知る限り、上の写真に直接見られるように、デコンボリューションはピークの複数のコンポーネントを提供しません。また、どのフィルター関数を使用すればよいですか? 私は数学のスキルが不足しているため、疑似コード レベルのヘルプが必要です。他のアドバイスを見てうれしいです:)