Окно БПФ, вызывающее неравномерное усиление по частотному спектру

Я использую FFTW для создания анализатора спектра в C ++.

После применения любой оконной функции к входному сигналу, выходная амплитуда внезапно, кажется, масштабируется с частотой.

Прямоугольное окно

образ

Точная Blackman

образ

Графики масштабируются логарифмически с частотой дискретизации 44100 Гц. Все гармоники генерируются на одном уровне с пиком 0 дБ, как видно в прямоугольном корпусе. Окно Exact-Blackman было усилено на 7,35 дБ, чтобы попытаться компенсировать усиление при обработке.

Вот мой код для генерации входной таблицы …

freq = 1378.125f;

for (int i = 0; i < FFT_LOGICAL_SIZE; i++)
{
float term = 2 * PI * i / FFT_ORDER;

for (int h = 1; freq * h < FREQ_NYQST; h+=1) // Harmonics up to Nyquist
{
fftInput[i] += sinf(freq * h * K_PI * i / K_SAMPLE_RATE); // Generate sine
fftInput[i] *= (7938 / 18608.f) - ((9240 / 18608.f) * cosf(term)) + ((1430 / 18608.f) * cosf(term * 2)); // Exact-Blackman window
}
}

fftwf_execute(fftwR2CPlan);

Увеличение или уменьшение размера окна ничего не меняет. Я тоже тестировал с окном Хемминга, та же проблема.

Вот мой код для получения вывода.

float val; // Used elsewhere
for (int i = 1; i < K_FFT_COMPLEX_BINS_NOLAST; i++) // Skips the DC and Nyquist bins
{
real = fftOutput[i][0];
complex = fftOutput[i][1];

// Grabs the values and scales based on the window size
val = sqrtf(real * real + complex * complex) / FFT_LOGICAL_SIZE_OVER_2;
val *= powf(20, 7.35f / 20); // Only applied during Exact-Blackman test
}

Любопытно, что я попытался сделать следующее, чтобы сгладить ответ в случае Точного-Блэкмана. Это уменьшение привело к почти, но все еще не совершенно плоскому ответу. Аккуратно, но все еще не объясняет мне, почему это происходит.

float x = (float)(FFT_COMPLEX_BINS - i) / FFT_COMPLEX_BINS; // Linear from 0 to 1
x = log10f((x * 9) + 1.3591409f); // Now logarithmic from 0 to 1, offset by half of Euler's constant
val = sqrt(real * real + complex * complex) / (FFT_LOGICAL_SIZE_OVER_2 / x); // Division by x added to this line

2

Решение

Может быть ошибка. Кажется, вы применяете свою оконную функцию несколько раз для каждого образца. Любое оконное управление должно быть удалено из вашего входного цикла компоновки и применено к входному вектору только один раз, прямо перед БПФ.

1

Другие решения

Я не смог воспроизвести код, потому что у меня нет библиотеки под рукой. Однако это может быть следствием спектральной утечки. https://en.wikipedia.org/wiki/Spectral_leakage

Это неизбежность оконных функций, а также выборки. Если вы посмотрите на раздел компромиссов этой статьи, тип окна может быть адаптивным для широкого диапазона частот или ориентированным на конкретную. Поскольку частота вашего сигнала увеличивается, возможно, сигнал с более низкой частотой вне вашей цели более подвержен спектральной утечке.

0

По вопросам рекламы [email protected]