Если предположить, что oSignal
заполнено комплексными числами таким образом, что чередуются действительная и мнимая части, это может помочь изменить
for(int y=0;y< 8191;y++)
до
for(int y=0;y< 8191;y+=2)
Редактировать: я даже не заметил, что вы передаете только 1024 сэмпла. Вы должны передать столько выборок во временной области, сколько будет выборок в частотной области, в вашем случае 4096.
Редактировать: Еще одна вещь: вы явно пытаетесь найти базовую частоту чего-то. Если что-то не является сгенерированным компьютером тоном или человеческим свистом (оба из которых очень чистые тона), вы можете быть разочарованы результатом. Простой метод, который вы опубликовали, едва работает на флейте.
Редактировать: Для голоса и гитары вам не повезло. Я написал программу некоторое время назад, которая отображает частотную область, попробуйте, вы увидите проблему. Есть также источники , если вам интересно.
Окончательное редактирование : Возможно, вы захотите прочитать статью Википедии об определении высоты звука . Сконцентрируйтесь на подходах во временной области.