#matlab #signal-processing #fft
#matlab #обработка сигналов #бпф
Вопрос:
Сегодня, пытаясь заставить свой код на C (используя нашу библиотеку FFT) выдавать те же результаты, что и Matlab, я, наконец, нашел проблему и решение.
В Matlab вычисление обратных коэффициентов для сетки амплитудно-частотной характеристики выполняется следующим образом (фрагмент кода из внутренней функции fir2() Matlab):
%H contains 8192 points of AFR data
Hconj = [H conj(H(npt-1:-1:2))]; % Fourier transform of real series
ht = real(ifft(Hconj)); % Symmetric real series
в результате мы получаем обратно 16384 ячейки, и вторую половину из них можно выбросить, но первую половину позже можно использовать в качестве коэффициентов FIR.
Но если я сделаю то же самое в Ooura, используя функцию Real DFT rdft (), я получу коэффициенты, которые создают зеркальный эффект в результирующем AFR, все частоты на графике AFR делятся на 2.
Итак, мне пришла в голову идея: в моем коде на C я увеличил значение H в два раза (16384 точки) и заполнил их все частотными данными без зеркалирования. И вуаля! это сработало, теперь я получил 16384 балла, отбросил все после 8192 баллов, и теперь результирующий AFR соответствует Matlab.
Я был убежден, что все стандартные реализации FFT нуждаются в этом зеркалировании. Является ли это просто причудой Ooura, что ему НЕ требуется зеркальное отображение данных на входе, или, может быть, происходит что-то еще?
Ответ №1:
«Реальный» БПФ часто выполняет внутреннее зеркальное отображение, автоматически используя комплексные сопряженные входные данные для зеркальных значений. Стандартный FFT / IFFT не делает этого, потому что он имеет в два раза больше степеней свободы (например, для получения сложного вывода или, скажем, сложного фильтра домена из IFFT) реализации FFT / IFFT, ограниченной выводом только в реальном режиме.
Размер шага БПФ в частотной ячейке определяется его длиной. Половина длины дает половину размера шага частоты, как в вашем первоначальном испытании.