음성 학습 앱을 만들고 있으며 FFT를 사용하여 시간 도메인에서 주파수 도메인으로 신호를 변환했습니다. FFT를 적용하기 전에 blackman-harris 윈도우를 사용하여 신호를 창으로 봤습니다. 그런 다음 기본 주파수를 추출하기 위해 고조파 스펙트럼을 사용했습니다. 가장 낮은 주파수는 F2 (87.307 Hz)이고 가장 높은 주파수는 C6 (1046.502 Hz)입니다. FFT 길이는 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.307 Hz ~ 190 Hz에서 옥타브의 높은 오류를 나타냅니다. 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