私は音声トレーニングアプリを作成していますが、FFTを使用して信号を時間領域から周波数領域に変換しました。 FFTを適用する前に、blackman-harrisウィンドウを使用して信号を窓掛けしました。次に、基本周波数を抽出するために高調波積スペクトルを使用しました。最低周波数はF2(87.307 Hz)で、最高周波数はC6(1046.502 Hz)です。 FFT Lengthは8192、サンプリング周波数は44100 Hzです。高調波のスペクトルにおけるオクターブ誤差を修正するには?
オクターブの誤差を修正するために、私はhereというルールを適用しました。
float[] array = hps.HPS(Data);
float hpsmax_mag = float.MinValue;
float hpsmax_index = -1;
for (int i = 0; i < array.Length; i++)
if (array[i] > hpsmax_mag)
{
hpsmax_mag = array[i];
hpsmax_index = i;
}
// Fixing octave too high errors
int correctMaxBin = 1;
int maxsearch = (int) hpsmax_index * 3/4;
for (int j = 2; j < maxsearch; j++)
{
if (array[j] > array[correctMaxBin])
{
correctMaxBin = j;
}
}
if (Math.Abs(correctMaxBin * 2 - hpsmax_index) < 4)
{
if (array[correctMaxBin]/array[(int)hpsmax_index] > 0.2)
{
hpsmax_index = correctMaxBin;
}
}
システムをノコギリ波でテストしたところ、オクターブのエラーがまだ目に見えることがわかりました。 87.307Hzから〜190Hzになると、オクターブの誤差が大きくなります。 G5(783.991)以上になるとオクターブが低くなることがあります。
ここにいくつかの結果があります:入力|結果|これは、ユーザーにシステムの最終的なフィードバックにひどく影響するため、エラー
F2 (87.307) - F4 (349.228) - 2 octaves higher
G2 (97.999)- G4 (391.995) - 2 octaves higher
A2 (110) - A3 (220) - an octave higher
D3 (146.832) - D4 (mostly) (293.665) and D3 - an octave higher
A3 (220) - A3 - Correct
A4 (440) - A4 - Correct
G5 (783.991) - G5 (mostly) and G4 (391.995) - an octave lower
A5 (880) - A5 - Correct
C6 (1046.502) - C6 - Correct
は、私はこの問題を解決するのに役立ちます。
..私はそれを試してみて、表示されます – Giggity