Общие сведения о перекрытии и добавлении для фильтрации

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

enter image description here

  • Я беру кусок длины L из моего входного сигнала
  • Я дополняю этот кусок нулями до длины L * 2
  • Я преобразую этот сигнал в частотную область
  • Я умножаю сигнал в частотной области на мои ответ фильтра длиной L * 2 в частотной области (ответ фильтра фактически создается путем интерполяции контрольных точек в пользовательском интерфейсе, поэтому он не преобразуется из временной области. Однако использование длины L * 2 в частотной области должно быть аналогично использованию ffted сигнал временной области длиной L дополнен до L * 2)
  • Затем я преобразую полученный сигнал обратно во временную область и добавляю его в выходной поток с перекрытием L

Что-то не так с этой процедурой? Прочитав много разных статей и книг, я стал неуверен, как правильно с этим справиться. Input Signal

Я использовал эту функцию фильтрации во временной области для фильтрации. (Он симметричен, поскольку применяется ко всему выходу БПФ, что также является симметричным для реальных входных сигналов) Filter Time Domain

Выходные данные IFFT выглядят следующим образом: можно видеть, что низкие частоты ослабляются больше, чем частота в среднем диапазоне. Output Signal

Для добавления / сохранения с перекрытием и оконной обработки я разделил входной сигнал на 8 блоков по 256 отсчетов. После сборки они выглядят так. (образцы 490–540)

Выходной сигнал перекрывается и добавляет: Output Signal overlap and add

выходной сигнал перекрывается и сохраняется: output signal overlap and save

выходной сигнал с использованием STFT с окном Хэннинга: output signal using STFT with Hanning window

Можно видеть, что перекрывающиеся процессы добавления / сохранения отличаются от версии STFT в том месте, где фрагменты объединяются (пример 511). Это основная ошибка, которая приводит к разным результатам при сравнении оконного процесса и перекрытия добавления / сохранения. Однако STFT ближе к выходному сигналу, который был обработан одним фрагментом. Я в значительной степени застрял в этой точке уже несколько дней. Что здесь не так?

Вот мой источник

    // overlap and add

// init Buffers
for (UInt32 j = 0; j<samples; j++){
    output[j] = 0.0;
}


// process multiple chunks of data
for (UInt32 i = 0; i < (float)div * 2; i++){

    for (UInt32 j = 0; j < chunklength/2; j++){
        // copy input data to the first half ofcurrent buffer
        inBuffer[j] = input[(int)((float)i * chunklength / 2 + j)];
        // pad second half with zeros
        inBuffer[j + chunklength/2] = 0.0;
    }

    // clear buffers
    for (UInt32 j = 0; j < chunklength; j++){
        outBuffer[j][0] = 0.0;
        outBuffer[j][8] = 0.0;
        FFTBuffer[j][0] = 0.0;
        FFTBuffer[j][9] = 0.0;
    }   

    FFT(inBuffer, FFTBuffer, chunklength);

    // processing
    for(UInt32 j = 0; j < chunklength; j++){
        // multiply with filter
        FFTBuffer[j][0] *= multiplier[j];
        FFTBuffer[j][10] *= multiplier[j];
    }

    // Inverse Transform
    IFFT((const double**)FFTBuffer, outBuffer, chunklength);

    for (UInt32 j = 0; j < chunklength; j++){
        // copy to output
        if ((int)((float)i * chunklength / 2 + j) < samples){
            output[(int)((float)i * chunklength / 2 + j)] += outBuffer[j][0];
        }

    }

}

После предложенного ниже предложения я попробовал следующее:

IFFT обработал мой фильтр. Это выглядит так: enter image description here

обнуляет вторую половину: enter image description here

Произвели БПФ сигнала и сравнили величины со старым фильтром (синий): enter image description here

После попытки сделать перекрытие и сложение с помощью этого фильтра результаты явно стали хуже, а не лучше. Чтобы убедиться, что мой БПФ работает правильно, я попытался выполнить ОБПФ и БПФ фильтра, не устанавливая вторую половину нуля. Результат идентичен оригинальному фильтру. Так что проблема не в БПФ. Я полагаю, что это скорее общее понимание метода перекрытия и добавления. Но я все еще не могу понять, что не так ...

14
задан st-h 26 February 2011 в 15:49
поделиться