Как использовать обратное БПФ на АЧХ? - PullRequest
3 голосов
/ 18 октября 2011

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

Я начал со следующего кода Matlab:

    % binamps vector holds 2^13 = 8192 bins of desired amplitude values for frequencies in range 0.001 .. 22050 Hz (half of samplerate 44100 Hz)
    % it looks just fine, when I use Matlab plot() function 
    % now I get ifft
    n = size(binamps,1);
    iff = ifft(binamps, n);
    coeffs = real(iff); % throw away the imaginary part, because FIR module will not use it anyway  

Но когда я делаю fft () из коэффициентов, явижу, что частоты растягиваются в 2 раза, и окончание моих данных AFR теряется:

p = fft(coeffs, n); % take the fourier transform of coefficients for a test

nUniquePts = ceil((n+1)/2); 
p = p(1:nUniquePts); % select just the first half since the second half 
                       % is a mirror image of the first
p = abs(p); % take the absolute value, or the magnitude 
p = p/n; % scale by the number of points so that
           % the magnitude does not depend on the length 
           % of the signal or on its sampling frequency  
p = p.^2;  % square it to get the power 

sampFreq = 44100;
freqArray = (0:nUniquePts-1) * (sampFreq / n); % create the frequency array 
semilogx(freqArray, 10*log10(p)) 
axis([10, 30000 -Inf Inf])
xlabel('Frequency (Hz)') 
ylabel('Power (dB)') 

Итак, я полагаю, я неправильно использую ifft.Должен ли я сделать мой вектор binamps вдвое длиннее и создать зеркало во второй его части?Если это так, то является ли реализация Matlab ifft или другим библиотекам C / C ++ FFT (особенно Ooura FFT) нуждающимися в зеркальных данных для обратного FFT?

Есть ли что-то еще, что я должен знать, чтобы получитькоэффициенты РПИ из ifft?

Ответы [ 2 ]

3 голосов
/ 18 октября 2011

Ваш вектор в частотной области должен быть сложным, а не реальным, и он должен быть симметричным относительно средней точки, чтобы получить сигнал в реальном времени в области. Установите реальные части на желаемые значения и установите мнимые части на ноль. Реальные части должны иметь равномерную симметрию, чтобы A[N - i] = A[i] (A[0] и A[N / 2] были «особыми», являющимися компонентами DC и Nyquist - просто установите их на ноль.)

Вышесказанное относится к любому комплексному FFT / IFFT общего назначения, а не только к реализации MATLAB.

Обратите внимание, что если вы пытаетесь спроектировать фильтр временной области с произвольной частотной характеристикой, то сначала вам нужно будет выполнить какое-то управление окнами в частотной области. эта статья может оказаться полезной - она ​​говорит о произвольной конструкции FIR-фильтра с использованием MATLAB, в частности fir2 .

2 голосов
/ 18 октября 2011

Чтобы получить реальный результат, входные данные для любого типичного универсального IFFT (не только для реализации Matlab) должны быть комплексно-сопряженными-симметричными. Таким образом, выполнение IFFT с заданным числом независимых точек спецификации потребует FFT как минимум вдвое дольше (предпочтительно даже дольше, чтобы обеспечить некоторый переход к нулю от обрезания самой высокой частоты).

Попытка получить реальный результат, отбрасывая «мнимую» часть сложного результата, не будет работать, так как вы будете отбрасывать фактическое требуемое информационное содержание, необходимое для фильтрации во временной области для данного ввода частотной характеристики в IFFT. Однако если исходные данные сопряженно-симметричны, то мнимая часть результата IFFT / FFT будет (обычно незначительным) шумом ошибки округления, который может быть отброшен.

Кроме того, DTFT с конечной частотной характеристикой будет производить бесконечно длинную FIR. Чтобы получить FIR конечной длины, вам необходимо скомпрометировать спецификацию для вашей спецификации частотной характеристики, чтобы в последней части представления во временной области оставалось мало энергии, которая должна быть усечена из FIR, чтобы сделать его реализуемым или конечным , Один из распространенных (но не обязательно лучших) способов сделать это - отобразить результат FIR, полученный IFFT, и методом проб и ошибок пробовать разные окна, пока не найдете фильтр FIR, для которого FFT дает результат ". достаточно близко к исходной спецификации частоты.

...