ピッチ抽出の試み(その1)(Pitch) v0.6


周波数の測定方法として 周期測定・周波数カウンター・ヘテロダイン法・パワー スペクトル法などがありますが その中に線形予測法(Linear Prediction) によるスペクトル分析法があります。

その中からさらに PARCOR方式 (Partial Autocorrelation) <偏自己相関>の係数を計算機で求める方法として Durbin法というものがありす。

《 FORTRAN プログラム 》
それらのプログラムは(見やすくするため continueを追加してデータの入力部分は省略しています)
% wc *.f
      36      58     874 durb.f
      39      65     828 fdpk.f
      48      70    1042 fft.f
      41      66     816 formt.f
     164     259    3560 total
全て合わせても164行ですので「f2c」というプログラムで C言語に変換してから Java言語に再構成して見ました。 (因みに formt.java は (v0.6)713行ほどあります)

FORTRANプログラムでは 10[KHz]でサンプリングされた 256個の音声サンプルから Durbin法で 15個の線形予測係数を求め それに対して 256個の FFT処理によって周波数間隔 10[KHz] / 256 = 39.06[Hz]毎のスペクトル値を求め そのうちの半分(128個)のスペクトル値から ピークピッキング法により ホルマント周波数・帯域幅・ピーク値を求めています。

その周波数間隔の式から
サンプリング周波数を小さくして サンプル数を多くすれば周波数分解能が上がると思われます。

A(49) 440[Hz] を makewavex で作成した インハーモニシティあり・4倍音・サンプリング周波数 44100[Hz]の場合です。

a49-4-44 wave a49-4-44 FFT

上はそのWave波形図とFFT図です。

a49-4-44 wave file(133KB) a49-4-44 formt

しかし 4つに分解されません。
「sox」で サンプリング周波数を 44100[Hz]から 8000[Hz]に変更して見ます。

% sox -t wav -r 44100 a49-4-44.wav -r 8000 a49-4-8.wav
a49-4-8 wave file(24KB) a49-4-8 formt
〔構成周波数〕
1 : 440.0000
2 : 881.5262
3 : 1326.1138
4 : 1775.3155

周波数は上記のはずですが 画面の出力結果は…

A(37) 219.516[Hz]の4倍音の場合です。

a379-4-8 wave file(24KB) a37-4-8 formt
〔構成周波数〕
1 : 219.5160
2 : 439.4125
3 : 660.0713
4 : 881.8761

さらに A(25) 109.5125[Hz]の4倍音の場合です。

a25-4-8 wave file(24KB) a25-4-8 formt
〔構成周波数〕
1 : 109.5125
2 : 219.1200
3 : 328.9174
4 : 439.0000

「RCT」のように A(1)27.5[Hz]で 1セントまでの正確さとは行かないようです。


Formt gif (Java appletは 利用出来なくなりました;)

使い方:

では ピアノの音はどうでしょう?
参考にするピアノ音はJava Wave Viewer (Java Wave Viewer)で 「Fille」として取り上げた単音を サンプリング周波数を変えて見てみます。

  1. 22050[Hz]
    f-ved22 wave file(92KB) f-ved22 formt
  2. 8000[Hz]
    f-ved8 wave file(34KB) f-ved8 formt
8000[Hz]では以下のようなピーク値が現れています。
1: 556.7997 / 53.488686 / 142.25995
2: 1112.643 / 84.83396 / 134.22902
3: 1675.8291 / 17.415987 / 137.66922
4: 2248.093 / 55.755123 / 130.02992
5: 2814.7422 / 287.4275 / 121.181725
6: 3323.9897 / 1530.1614 / 112.94095
fille-f FFT

そのFFTの波形のゲインを上げて見ると ノイズの中に 6倍音ぐらいまであるように見受けられます。

因みに サンダーソン氏の式のインハーモニシティでは ピッチ441[Hz]でキー C#(53)は以下の値です。
〔構成周波数〕
1 : 556.129
2 : 1114.69
3 : 1678.13
4 : 2248.93
5 : 2829.64
6 : 3422.86

分解能を上げるために「sox」でサンプリング周波数を小さくして見ます。 (音声は正常には聞こえません)

% sox -r 8000 a25-4-8.wav -r 4000 a25-4-4.wav
a25-4-4 wave file(12KB) a25-4-4 formt
〔構成周波数〕
1 : 109.5125
2 : 219.1200
3 : 328.9174
4 : 439.0000
% sox -r 8000 a25-4-8.wav -r 2000 a25-4-2.wav
a25-4-2 wave file(6.2KB) a25-4-2 formt
% sox -r 8000 a13-4-8.wav -r 2000 a13-4-2.wav
a13-4-2 wave file(6.2KB) a13-4-2 formt
〔構成周波数〕
1 : 54.5707
2 : 109.1650
3 : 163.8067
4 : 218.5193
% sox -r 8000 a13-4-8.wav -r 1000 a13-4-1.wav
a13-4-1 wave file(3.3KB) a13-4-1 formt
% sox -r 8000 a1-4-8.wav -r 500 a1-4-05.wav
a1-4-05 wave file(2.2KB) a1-4-05 formt
〔構成周波数〕
1 : 27.1154
2 : 54.2367
3 : 81.3697
4 : 108.5204
% sox -r 8000 a1-10-8.wav -r 1000 a1-10-1.wav
a1-10-1 wave file(3.3KB) a1-10-1 formt

〔構成周波数:ボリューム〕
1 : 27.1154 : 0.244
2 : 54.2367 : 0.225
3 : 81.3697 : 0.196
4 : 108.5204 : 0.159
5 : 135.6946 : 0.118
6 : 162.8981 : 0.075
7 : 190.1371 : 0.035
8 : 217.4172 : 0.000
9 : 244.7445 : 0.027
10 : 272.1249 : 0.045

Formt gif (Java appletは 利用出来なくなりました;)

これまでのWave信号をFormtなどで見てみます。
View Wave Files


参考文献:
Dobashi.M
Last modified: 4月 26日 金 20:05:12 2024 JST