2008-09-15 6 views

答えて

5

実際にFFT(高速フーリエ変換)が関与します。 FFTを使うと、固定周波数と振幅の単純な正弦波の和でアナログ信号を近似することができます。あなたが基本的にやっていることは、サンプルをとり、それを振幅 - >周波数ペアに分解し、次に最大振幅に対応する周波数を取ることです。

うまくいけば、私は理論とコードの間に残っているギャップを埋めることができることを願っています!

+3

このアプローチは、特に音楽の文脈で深刻な精度の問題があります。 endolithが指摘するように、FFTはある範囲の周波数で強度を与えます。範囲は、FFTウィンドウサイズが小さくなる(およびより速くなる)ほど大きくなります。さらに悪いことに、全体的な範囲は0から44100 Hz(レッドブックのオーディオ)ですが、典​​型的な音符はほぼ常に1000Hzよりはるかに低いため、高い周波数帯域ではほとんどの解像度が無駄になります。 – MusiGenesis

1

DFTを適用し、結果から基本周波数を導出します。 DFT情報を求めて周りを回っていくと、必要な情報が得られます。私はあなたとリンクしたいと思っていますが、数学知識の期待が大きく異なります。

幸運。

4

ギターチューナーは、FFTまたはDFTを使用しません。通常、ゼロ交差をカウントします。いくつかの波形は他の波形よりもゼロクロスが多いため、基本周波数を得ることはできませんが、通常は基本周波数の倍数を得ることができます。 1つまたは複数のオクターブをオフにしても、音符を取得するには十分です。

ゼロクロッシングをカウントする前にローパスフィルタリングを行うと、通常、超過ゼロクロッシングを除去できます。ローパスフィルタをチューニングすることで、もう少し、具体的

+2

彼らはゼロ交差を数えているのではないかと疑います。典型的なギター波形では、1サイクルあたり多くのゼロクロスがあります。 http://www.flickr.com/photos/[email protected]/4180888094/彼らはおそらく単純な自己相関をします。 – endolith

+1

より多くのゼロ交差は、単純なチューナーにとっては重要ではありません。チューナーは基本周波数の正確な周波数を必要としないことを覚えておいてください。ノートを知る必要があります。 1サイクルあたりより多くのゼロクロスをカウントすると、より高いオクターブにロックされる可能性がありますが、CbはまだCbになり、高すぎる2セントはまだ高すぎる2セントになります。自己相関はより高度な処理には最適ですが、チューナーにとっては過度です。 – Mendelt

4

かかわら検出したい周波数の範囲の一部knowlegdeが必要です。

あなたが入力配列内の生PCMで起動した場合、何を基本的に持っていることはグラフです。 FFTを実行すると、入力サンプリングレートの0〜1/2の周波数の周波数ヒストグラムに変換されます。結果配列の各エントリの値は、対応するサブ周波数の「強度」になります。だから/秒SサンプルでサンプリングサイズNの入力アレイ所与のルート周波数を見つける

FFT(N, input, output); 
max = max_i = 0; 
for(i=0;i<N;i++) 
    if (output[i]>max) max_i = i; 
root = S/2.0 * max_i/N ; 
+0

私は簡潔さが好きですが、forループの問題が疑わしいです。出力は確かに入力と同じサイズではないでしょう – Waslap

+0

まったく同じサイズです。 FFTを行うのはトレードオフです。大きな時間幅を分析するだけで、細かい周波数分解能(多くの出力ビン)が得られます。分析を非常に正確な時間(小さな入力サンプルサイズ)に制限すると、周波数領域で分解能が低くなります。 – AShelly

17

は時間ベースであり、他のアルゴリズム、周波数基づかないでもあります。 自己相関はピッチ検出の比較的単純なアルゴリズムです。 参照:http://cnx.org/content/m11714/latest/

私は、自己相関と他の読み取り可能なアルゴリズムの実装を書いています。チェックアウト:http://code.google.com/p/yaalp/

http://code.google.com/p/yaalp/source/browse/#svn/trunk/csaudio/WaveAudio/WaveAudio ファイルを一覧表示し、PitchDetection.csが必要なファイルです。

(プロジェクトはGPLですので、コードを使用する場合はその用語を理解してください)

+2

私はこの回答を何度も投票したいと思います。 FFTはこの問題のひどい解決策です。それは食料品店にタンクを運転するようなものです。確かに、それはクールですが、それは本当に最善の方法ではありません。自己相関は、一般に、この問題に対する正しい解決策と考えられている。 Autotune/Melodyne/Singstar /あなたの名前をつけてください。ゼロクロッシングベースのソリューションは、妊娠時の行動に関する特別な知識がある場合にのみ適用されます。自己相関も非常に効率的に実施することができる。 –

+5

おお、何?同意しません。周波数領域ソリューションは、まったく恐ろしい解決策ではありません。高調波生成スペクトルまたはケプストラム法は、実装が容易であり、頑強である。自己相関は、いかなる方法によっても*一般的に正しい解とはみなされません。それはいくつかの有効な解決策の1つです。確かに、ゼロクロッシングは信頼できるピッチの指標ではありません。 –

+1

自己相関は通常、FFTより計算量が多いです。私たちは頻繁に自己相関を行うためにFFTを使用しています。なぜなら、それはより速いからです。あなたがFFTでそれを行うことができるときに素朴な自己相関を使用することは、正面玄関を使用する代わりに、食料品店の壁を通してタンクを運転するようなものです。 – endolith

19

FFTは周波数の位置を把握するのに役立ちますが、正確にはの頻度はとは言えません。 FFTの各点は周波数の「ビン」です。したがって、FFTにピークがある場合は、必要な周波数がそのビン内または周波数範囲内のどこかにあることがわかります。

本当に正確にしたい場合は、高解像度とたくさんのビン(=たくさんのメモリと多くの計算)で長いFFTが必要です。ログスケールされたスペクトル上でquadratic interpolationを使用して低解像度FFTから真のピークを推測することもできます。これは驚くほどうまくいきます。

計算コストが最も重要な場合は、ゼロ交差をカウントできる形式に信号を取得し、カウントするほど精度が高くなります。

ただし、fundamental is missingの場合は動作しません。 :)

hereのアルゴリズムを概説していますが、補間されたFFTは通常最も正確です(ただしこれはwhen the fundamental is the strongest harmonicでしかありませんが、それ以外の場合は賢明である必要があります)。ゼロクロスが近い秒(ただしこれはfor waveforms with one crossing per cycleでしか動作しません)。これらの条件のいずれも典型的なものではありません。

基本周波数より上の部分音は、ではありません。ピアノやギターのような多くの楽器では完全な高調波です。各部分はactually a little bit out of tune、またはinharmonicです。したがって、FFTの高周波数ピークは、基本波の整数倍に正確にはならず、波形は1つのサイクルから次のサイクルにわずかに変化するため、自己相関がなくなります。

本当に正確な周波数の読みを得るには、自己相関を使って基本波を推測し、次に二次補間を使って真のピークを見つけるといいでしょう。 (周波数領域で自己相関を行い、CPUサイクルを節約することができます。)問題がたくさんあり、使用する正しい方法は実際にアプリケーションによって異なります。

+1

欠落したファンダメンタルズと同様に、弦楽器の信号に対処するための交響的共鳴の問題もあります。特に、ギターの楽器チューニングのシナリオでは、任意の時点でチューニングされていないストリングが開いていて、チューニングされたピッチに近い場合は、再生されたストリングと一致する部分があります。 – marko

3

PCMオーディオ信号における基本周波数の取得困難な作業であり、それについて話すことがたくさんあるだろう...とにかく

、通常、時間ベースの方法があるため、ポリフォニック信号には適していません複数の基本周波数による異なる高調波成分の和によって与えられる複素数波は、最低周波数成分のみに依存するゼロ交差率を有する。 周波数領域においても、FFTは周波数音符間の間隔は、線形ではなく指数スケールに従います。これは、FFT法で使用される一定の周波数分解能は、時間領域における分析ウインドウのサイズが十分に大きくない場合には、より低い周波数のノートを分解するのに不十分であり得ることを意味する。

より適切な方法は、信号のローパスフィルタリングおよびデシメーションの後に適用されるDFTであり(すなわち、各ステップのサンプリング周波数を1/2にする)、異なる値を得るために周波数分解能の異なるサブバンドである。このようにして、DFTの計算が最適化される。問題は、時間分解能も可変であり、低いサブバンドでは増加するということです。

最後に、単一の音符の基本周波数を推定しようとすると、FFT/DFT方法は問題ありません。異なる音の部分音が重なり合い、その位相差に応じて振幅の和/キャンセルが行われるポリフォニック・コンテキストでは、音程が変化し、単一のスペクトル・ピークが異なる音に属することができます。この場合の相関は良い結果をもたらしません。

関連する問題