Вопрос

Я пытаюсь осуществить 8-полосную эквалайзер на основе DFT для единственной цели обучения. Чтобы доказать, что моя реализация DFT работает, я подал аудиосигнал, проанализировал его, а затем снова несинтезировал его без изменений, внесенных в частотный спектр. Все идет нормально.

Я использую так называемый «стандартный способ расчета DFT», который является корреляцией. Этот метод рассчитывает реальные и мнимые части как N / 2 + 1 образцов в длину. Ослабить частоту, я просто делаю:

float atnFactor = 0.6;
Re[k] *= atnFactor;
Im[k] *= atnFactor;

где «K» является индексом в диапазоне от 0 до N / 2, но то, что я получаю после ресинтеза, - это слепоточный искаженный сигнал, особенно на низких частотах.

Скорость образца входного сигнала составляет 44,1 кГц, и, поскольку я просто хочу, чтобы 8-полосный эквалайзер, который я кормлю образцы DFT 16 одновременно, поэтому у меня есть 8 частотных бункеров для игры.

Может кто-нибудь показать мне, что я делаю не так? Я пытался найти информацию об этой теме в Интернете, но не смог найти.

Заранее спасибо.

Это было полезно?

Решение

DFT и FFT по существу одинаковы для целей этого вопроса.

Чтобы ослабить частоту BIN (или «диапазон») в преобразованном FFT массива, вам необходимо умножить как реальные, так и мнимые компоненты одним и тем же фактором, а также умножать реальные и мнимые компоненты соответствующего отрицательный Частота Bin. 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;
    }

}

Обновлять: Прочитав вашу редактирование, я должен сказать, что ваш код работает как ожидалось. Я предположил, что вы получаете массивно Искаженный повторный синтезированный сигнал, а не «слепедный искаженный сигнал, особенно на низких частотах».

Я думаю, что искажение, которое вы видите, является результатом очень маленького размера окна, который вы используете - это будет особенно так, если вы не используете подход Hanning Window для восстановления исходного сигнала.

Попробуйте запустить свой код с более типичным размером окна (например, 1024). 8-полосный эквалайзер обычно не использует окно 8-бин FFT. Как правило, настройки из 8 ползунов будут использоваться для расчета пышной функции, соединяющей 8 точек в частотной области, и эта функция будет затем использоваться для установки амплитуд Bin для гораздо большего, более тонкозернитого набора частот.

Одним из точек: частоты BINS разделяют доступный диапазон равномерно, поэтому независимо от того, насколько большой размер вашего окна, более половины частот покрытия BINS, которые не слышится для человека. Вот почему группы Охватывается эквалайзером, как правило, масштабируется логарифмически (например, 100 Гц, 1 кГц и 10 кГц для типичного 3-полосного эквалайзера) и, таким образом, не применяется к равным количестве частоты мусорное ведро.

В случае равномерно разнесенного окна 8 банка, затухание 5 из 8, не имеет слышимого эффекта, отличного от искажения звуковых частот.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top