ДПФ и БПФ по существу одинаковы для целей этого вопроса.
Чтобы ослабить частотный элемент (или «полосу») в массиве, преобразованном БПФ, вам необходимо умножить действительную и мнимую составляющие на один и тот же коэффициент, а также умножить действительную и мнимую составляющие соответствующего отрицательного em> частотный бункер. БПФ создает преобразованную пару массивов, где первая половина значений представляет собой положительные частотные составляющие, а вторая половина - отрицательные частотные составляющие.
Вот упрощенный пример кода для фильтра нижних частот, который объясняет, что я имею в виду:
// 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 ячейками. Как правило, настройки 8 ползунков будут использоваться для вычисления кривой функции, соединяющей 8 точек в частотной области, а затем эта функция будет использоваться для установки амплитуды бинов для гораздо большего, более детализированного набора частот.
Еще один момент: интервалы частот равномерно делят доступный диапазон, поэтому независимо от размера вашего окна более половины интервалов покрывают частоты, которые не слышны человеческому уху. Вот почему полосы, охватываемые эквалайзером, обычно масштабируются логарифмически (например, 100 Гц, 1 кГц и 10 кГц для типичного 3-полосного эквалайзера) и, таким образом, не применяются к равному количеству частотных бинов < / em>.
В случае окна из 8 элементов, равномерно разнесенных, ослабление 5 из 8 наверняка не вызовет слышимого эффекта, кроме искажения слышимых частот.
person
MusiGenesis
schedule
20.05.2010