DFT и FFT по существу одинаковы для целей этого вопроса.
Чтобы ослабить частотный интервал (или «полосу») в массиве с БПФ-преобразованием, вам необходимо умножить как действительные, так и мнимые компоненты на один и тот же коэффициент, а также умножить действительные и мнимые компоненты соответствующих отрицательная частота бин. БПФ создает преобразованную пару массивов, где первая половина значений представляет положительные частотные компоненты, а вторая половина представляет отрицательные частотные компоненты.
Вот упрощенный пример кода для фильтра нижних частот, который объясняет, что я имею в виду:
// fftsize = size of fft window
int halfFFTsize = fftsize / 2;
float lowpassFreq1 = 1000.0;
float lowpassFreq2 = 2000.0;
for (int i = 0; i < halfFFTsize; i++)
{
int ineg = fftsize - 1 - i; // index of neg. freq.
float freq = (float)i * (44100.0F / (float)halfFFTsize);
if (freq >= lowpassFreq2)
{
real[i] = 0;
imag[i] = 0;
real[ineg] = 0;
imag[ineg] = 0;
}
else if (freq >= lowpassFreq1)
{
float mult = 1.0 - ((freq - lowpassFreq1) /
(lowpassFreq2 - lowpassFreq1));
real[i] *= mult;
imag[i] *= mult;
real[ineg] *= mult;
imag[ineg] *= mult;
}
}
Обновление: после прочтения вашей правки, я должен сказать, что ваш код работает как положено. Я предположил, что вы получаете сильно искаженный искаженный повторно синтезированный сигнал, а не "слабо искаженный сигнал, особенно на низких частотах".
Я думаю, что искажение, которое вы видите, является результатом очень маленького размера окна, которое вы используете - это особенно имело бы место, если вы не используете подход окна Ханнинга для восстановления исходного сигнала.
Попробуйте запустить код с более типичным размером окна (например, 1024). 8-полосный эквалайзер обычно не использует 8-разрядное окно FFT. Как правило, настройки 8 ползунков используются для вычисления изогнутой функции, соединяющей 8 точек в частотной области, и эта функция затем используется для установки амплитуд бина для гораздо большего, более мелкозернистого набора частот.
Еще один момент: частотные бины равномерно распределяют доступный диапазон, поэтому независимо от размера окна, более половины бинов покрывают частоты, которые не слышны человеческому уху. Вот почему полосы , охватываемые эквалайзером, обычно масштабируются логарифмически (например, 100 Гц, 1 кГц и 10 кГц для типичного 3-полосного эквалайзера) и, следовательно, не применяются к равному количеству частот бинов .
В случае равномерно расположенного окна с 8 ячейками ослабление 5 из 8, несомненно, не будет иметь никакого слышимого эффекта, кроме искажения слышимых частот.