音の周波数測定
周波数を細かく計算するには大きなサンプル 数(長い時間のサンプル)を計算する必要があります。1Hzは1秒間に1周期の変化なので、1Hzの変化を捉えるのに、1秒以上計測することは必然なのだと思います。しかし、人の話し声などは、1秒間同じ状態が続くことはないでしょうから、このプログラムでは計測不能です。と、考えていたのですがゼロ詰めする方法がかなり、有効なのがわかりました。
この方法で、何度目かの書き直しました。
1.概要
このプログラムは、PCM入出力DLL(WaveIO2.DLL)の使い方を説明する、サンプルプログラムとして作りました。パソコンのマイクの入力を、FFT計算して、最大パワーの周波数を表示するものです。
0から4000Hzを、分解能1Hzで計測します。
2.処理内容
サンプリング周波数8000Hz、16ビット、モノラルで、マイクからPCMデータを受信します。4000サンプル(0.5秒)を、16384サンプルにゼロ詰めしてFFTを計算します。
遅いパソコンでループするのに気が付いてこの値にしました。高い分解能や周波数は、必要に応じて試してください。
11/3 2008
ゼロ詰めが有効なことを試して納得したので、シンプルに全域をFFTする方法に戻しました。
(一旦V2.1.7をアップしたのですが、サンプリング時間が短くなり計算頻度が上がったのにFFT計算サイズはそのままだったので高負荷になっていました。2.1.8をアップしました。)
4/14 2008
大きなサンプル数で、一部の周波数を計算する方法で、AudioFCを書き換えました。
記述内容をこれに合わせました。
4/8 2008
「音程の測定」を作ろうと、続きを書いていて気が付きました。人の歌声の場合は、上限が1100Hz程度、楽器でも8000Hzであるようだと言う事です。
FFTを計算する項の数、パワーを計算する範囲を制限すれば良いんですね。次回アップするとき直します。
|