Возможно, это неверно, но, насколько мне известно, у вас есть 2 способа получить спектр всей песни.
1) Сделайте один БПФ на всей песне, что даст вам очень хорошее частотное разрешение, но на практике неэффективно, и вам не нужно такое разрешение в любом случае.
2) Разделите его на небольшие куски (например, 4096 образцов блоков, как вы сказали), получите БПФ для каждого из них и усредняйте спектры. Вы будете компрометировать частотное разрешение, но сделайте расчет более управляемым (а также уменьшите дисперсию спектра). Ссылка Wilhelmsen описывает, как вычислить БПФ на C++, и я думаю, что некоторая библиотека уже существует для этого, как FFTW (но мне никогда не удалось ее скомпилировать, чтобы быть справедливым =)).
Чтобы получить спектр амплитуды, усредняйте энергию (квадрат величины) по всему, что вы куски для каждого отдельного бункера. Чтобы получить результат в дБ, всего 10 * log10 - результаты. Это, конечно, предполагает, что вас не интересует фазовый спектр. Я думаю, что это известно как Barlett's method.
Я хотел бы сделать что-то вроде этого:
// At this point you have the FFT chunks
float sum[N/2+1];
// For each bin
for (int binIndex = 0; binIndex < N/2 + 1; binIndex++)
{
for (int chunkIndex = 0; chunkIndex < chunkNb; chunkIndex++)
{
// Get the magnitude of the complex number
float magnitude = FFTChunk[chunkIndex].bins[binIndex].real * FFTChunk[chunkIndex].bins[binIndex].real
+ FFTChunk[chunkIndex].bins[binIndex].im * FFTChunk[chunkIndex].bins[binIndex].im;
magnitude = sqrt(magnitude);
// Add the energy
sum[binIndex] += magnitude * magnitude;
}
// Average the energy;
sum[binIndex] /= chunkNb;
}
// Then get the values in decibel
for (int binIndex = 0; binIndex < N/2 + 1; binIndex++)
{
sum[binIndex] = 10 * log10f(sum[binIndex]);
}
Надеется, что это отвечает на ваш вопрос.
Edit: пост GoZ даст вам много информации по этому вопросу =)
Я пишу свою собственную программу на С ++. Можете ли вы объяснить пример выше. Что такое 0: и 1: meen и что такое fs? – goocreations
fs = частота выборки, 0: x = все шаги от нуля до x, то же самое для 1: N/2. абс = абсолютное значение. Концом является график (x, y), поэтому fbins - это x, а остальное - y – chwi
В следующий раз оставьте ссылку на pastebin со своим C-кодом, мне немного любопытно, как вы это решите :) – chwi