Быстрое преобразование Фурье не должно знать больше, чем ваши входные байты. Не пугайтесь статьи из Википедии. Алгоритм FFT будет принимать ваш входной сигнал (при использовании общих алгоритмов FFT число выборок должно быть степенью 2, например 256, 512, 1024) и возвращать вектор комплексных чисел с одинаковым размером. Поскольку ваши входные данные действительны, а не сложны (мнимая часть установлена на ноль), возвращаемый вектор будет симметричным. Только половина из них будет содержать данные. Поскольку вам не важна фаза, вы можете просто взять величину комплексных чисел, которая равна sqrt (a ^ 2 + b ^ 2). Может также сработать просто взять абсолютное значение комплексного числа, в некоторых языках это эквивалентно предыдущему выражению.
Доступны Java-реализации FFT, например: http://www.cs.princeton.edu/introcs/97data/FFT.java.html
Псевдокод будет выглядеть примерно так:
Complex in[1024];
Complex out[1024];
Copy your signal into in
FFT(in, out)
for every member of out compute sqrt(a^2+b^2)
To find frequency with highest power scan for the maximum value in the first 512 points in out
Выход будет содержать значения для частот от нуля до половины частоты дискретизации.
Поскольку FFT принимает повторяющийся сигнал, вы можете применить окно к вашему входному сигналу. Но сначала не беспокойся об этом.
Более подробную информацию можно найти в Интернете, например: БПФ для начинающих
Также, как отмечает Оли, когда присутствуют несколько частот, воспринимаемая высота звука является более сложным явлением .