FFTを使用してピアノの音符を認識できますか?


13

いくつかの音符を認識するツールを作成したい(これが車輪を再発明していることは知っている)。だから、私はピアノでミドルC、D、Eを演奏し、それらの音を分類できるはずです。アプローチ方法は次のとおりです。

  1. ノートを演奏している私のサンプルを録音する
  2. 高速フーリエ変換を使用して信号を周波数領域に変換します
  3. 最も存在する周波数を見つけます(基本的には周波数領域データのargmax)
  4. 周波数は演奏された音に由来すると仮定し、それを使用して音を分類します

間違った道を始めたくないので、私はまだこれを試していません。理論的には、これは機能しますか?


タイトルをより具体的にすることができればいいと思います。私はピアノの音高認識について少し話をしようとしましたが、私の(ネイティブではない)英語は今日、明らかに私に失敗しています。
パイプ

1
@パイプOK私はそれを変更しました
マイケルズノウデン

1
音を演奏する「サンプル」は、振幅と時間の波形である必要があります。基本的に、ポイント2は冗長です。比較的単純な実装では、上記の手順で十分です。
user2943160

@ user2943160明示的に追加しました。サウンドは多くの形式で保存できますが、通常、時間の経過とともに適切な振幅にするには多少の調整が必要です。
マイケルズノウデン

yt=AωtAyt

回答:


23

コンセプトは優れていますが、実際にはそれほど単純ではないことがわかります。

ピッチは単に支配的なトーンではないため、問題番号1があります。

FFT周波数ビンは、音階のすべてのトーン(または複数のトーン)を同時にヒットすることはできません。

FFTを使用して特定のタスクを実装しようとする前に、FFTアナライザーとトーンジェネレーターを含むオーディオプログラム(Audacityなど)で再生して、できること(できないこと)を体感することをお勧めします。

いくつかの特定のトーンだけを検出する必要がある場合は、Goertzelアルゴリズムを見つけることができますがより簡単で高速であることがわかります。

ピッチ検出は複雑であり、その分野ではまだ研究が進行中です。トーン検出は非常に簡単ですが、希望するものが得られない場合があります。


サンプルが特定の楽器のものであるという仮定から始めると、問題の処理が少し簡単になるかもしれませんよね?
mkeith

これは本当によさそうです。1つのフォローアップの質問は、次のとおりです。Goertzelアルゴリズムを使用して、同時に演奏されている2つのノートを検出できますか?
マイケルズノウデン

同時トーンの検出に使用できます。同時ノートを検出するのに十分かどうかは別の質問であり、私はまだ取り組んでいます。ゲルツェルベースのギター音検出器を持っていますが、これは何年もオンとオフを繰り返してきました。
JRE

2
@mkeith:並べ替え。音をテストして、特定の楽器(およびおそらく興味のある音だけ)で主音を検出するのに適切かどうかを確認できます。
JRE

3

信号のマルチモーダル観測ウィンドウを使用する方が良いと思います。オーディオ信号のウェーブレット分解の線に沿ったもので、ノート内の複数の倍音を識別できます。うん、実際にウェーブレット、私は行く方法だと思います。

これは、ウェーブレットが何であるかを非常に一般化した内訳ですが、STFTのように信号を通過させる多重解像度ウィンドウと考えてください。したがって、信号内のさまざまな時間的位置で発生するさまざまな正弦波を識別できます。また、これは重要なことです。演奏するノートは静止した信号ではなく、再生してから時間とともに減衰するからです。私はミュージシャンではありませんが、音の衰弱を通じて音の支配性が変化すると信じています。

もちろん、ウェーブレット分解後、音と周辺音を識別するアルゴリズムを実装する必要があります。

ウェーブレットは、ピッチの識別に関して人々がyboutを語っている問題に本当に対処していると思います。

ウェーブレットがどのように機能するかを知りたい場合は、HPからリリースされた素晴らしいホワイトペーパー:) http://www.hpl.hp.com/hpjournal/94dec/dec94a6.pdfおよび ウェーブレットの概要

実装のために、MATLABにはウェーブレットツールがあり、Rなどのプラットフォームで利用できるパッケージが他にもたくさんあると確信しています。


1

ピアノの範囲の中央(200〜500 Hzなど)で演奏されるノートを考えていると思いますが、その範囲であっても、1つのノートには多くの倍音がありますが、これは正確ではありません基本周波数の倍数を、また、各音符の冒頭、そしておそらく最後にもかなりの量の広帯域ノイズがあります。

音域の下端にある大きな音の場合、音エネルギーのごくわずか(1%未満)が実際に音の基本ピッチにあることがわかります。

別の問題は、FFTの単純な解釈では、検出しようとしている信号の振幅が一定であると想定していることです。これは、実際に振幅がいくつかの指数関数的な減衰の重ね合わせに続くピアノの音符には当てはまりません。減衰の最初の部分の時定数は比較的短く、後の部分の時定数は長くなります。

ガボール変換などの短い時間スケールのフーリエ変換法や、ウェーブレットベースの方法を詳しく調べてください。

連続する音の基本ピッチは音ごとに約6%増加するため、オーディオの倍音の周波数を特定するのに必ずしも非常に高い精度が必要なわけではないことに注意してください。音符を正確に識別することは、音符が音階と正確に一致しているかどうかを判断することとまったく同じ問題ではありません。


0

はい、これがFFTのすべてです。フィードするデータの周波数スペクトルを提供します。あなたが言及したように、難しい部分は実装の詳細です。

何をしたいのかによって、正確に答えが変わります。

自分の音楽を分析したいだけなら、それを行うためのソフトウェアがすでにあります。応答(基本的にはFFT)を示すEQを見るか、ピッチも示す「音楽EQ」を取得できます。音声をMIDI VSTに送って、演奏内容を正しいMIDIノートに変換できます。キーボードがMIDIの場合、VSTをスキップして、MIDIを直接録音します。

FFTとそれが音楽にどのように関係するかを自分で学びたい場合は、任意のデータのFFTを計算できるMatlabのようなものを取得する方が良いでしょう。wavファイルなどを読み取りながら記録および再生する機能があります。これらは本当に使いやすいものになります。構文を知っていれば、オーディオをグラフ化し、あらゆる種類の分析をかなり迅速に行うことができます。

そのようなことを行うデバイスを構築したい場合、それは非常に複雑です。計算を行うにはuC / dsp / fpga / etcが必要です。ほとんどの一般的なデバイスにはすでにFFTコードが付属しているため、自分でコーディングする必要はありません(これも複雑です)。

回路などすべてを構築する必要があります。難しいことではありませんが、経験/知識によってはかなり時間がかかり、学習曲線が急です。また、最終製品の品質にも依存します。

数学的には、理想的な音符は「基本」の幾何学的なシリーズで構成されています。

F0が基本周波数であると仮定すると、ほとんどの音符はF(t)+ F0 * sum(a_k e ^(2 ^ k F0 * pi i t))= F0 + a_1 * F1 + a_2 * F2 + で近似されます。 ...

a_kはそれらのより高い周波数F_kの強さであり、F_kはF0の倍数です。すべてのkに対してa_k = 0の場合、純粋な正弦波が得られます。このピッチは簡単に検出できます。FFTの最大値を見つけるだけで、その周波数は音の基本=音符です。

FFTを実行すると、最終的にデータを取得し、計算を実行します。基本的には微積分です。

それはすべて比較的簡単です。

あなたが対処しなければならないいくつかの問題。これらのすべてが「解決」されるわけではないことに注意してください。

  1. 遅延-何らかのリアルタイムの処理を行う場合、これが問題になる可能性があります。

  2. 複数の音-すべての余分な倍音のため、音のグループを決定するのは困難です。再生A = 440hzおよびA '= 880hzの場合、ほとんどの倍音が重なります。A = 440hzを簡単に取得できますが、A '= 880hzを取得するのはより困難です。和音や高速走行などを考えると、すべての情報(メモ)を正確に取得することは非常に困難です。一般的にすべてが数学的に可能ですが、データ自体にはエラーと異常があり、場合によっては方程式が不十分に定義されます。

  3. ノイズ-信号のノイズにより、誤った結果が生じる可能性があります。ミュージカルノイズが発生すると、結果が台無しになります。その場合、より良いアルゴリズムが必要になります=時間+お金+知識。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.