Рассчитать powerpectrum с помощью скользящего окна FFT:
Взять 1024 образца:
double[] signal = stream.Take(1024);
Подайте его по алгоритму БПФ:
double[] real = new double[signal.Length];
double[] imag = new double[signal.Length);
FFT(signal, out real, out imag);
Вы получите реальную часть и воображаемую часть. НЕ выбрасывайте мнимую часть. Сделайте то же самое с реальной частью воображаемого. Хотя верно, что мнимая часть не совпадает с действительной по пи / 2, она все еще содержит 50% информации о спектре.
EDIT:
Рассчитайте мощность в противоположность амплитуде, чтобы иметь большое число, когда оно громкое, и близко к нулю, когда тихо:
for (i=0; i < real.Length; i++) real[i] = real[i] * real[i];
Аналогично для мнимой части.
for (i=0; i < imag.Length; i++) imag[i] = imag[i] * imag[i];
Теперь у вас есть спектр мощности для последних 1024 выборок. Где первая часть спектра - это низкие частоты, а последняя часть спектра - это высокие
частот.
Если вы хотите найти BPM в популярной музыке, вам, вероятно, стоит сосредоточиться на басе. Вы можете подобрать интенсивность низких частот, суммируя нижнюю часть спектра мощности. Какие цифры использовать, зависит от частоты дискретизации:
double bassIntensity = 0;
for (i=8; i < 96; i++) bassIntensity += real[i];
Теперь сделайте то же самое снова, но переместите окно на 256 выборок, прежде чем вычислять новый спектр. Теперь вам нужно рассчитать bassIntensity для каждых 256 сэмплов.
Это хороший вход для вашего анализа BPM. Когда бас тихий, у вас нет ритма, а когда он громкий, у вас есть ритм.
Удачи!