Что делать, если n_samples и size_input не совпадают в реализации fftw

Я использую fftw3 lib для вычисления преобразования Фурье в С++. Мне приходится каждый раз вызывать его с другим входным массивом. Я инициализирую свой массив (называемый «вводом» в коде) только один раз с размером MAX_ELEMS, а затем использую его в качестве входных данных для функции fftw_plan (изменение содержимого и его размера) при каждом вызове. Однако я каждый раз меняю свои n_samples в соответствии с фактическим размером моего массива (количество допустимых выборок данных в массиве). Я хотел знать, вызовет ли это какие-либо проблемы с моей реализацией - выполнением/точностью.

fftw_plan fftw_plan_dft_r2c_1d(int n_samples,
                                double *in, fftw_complex *out,

person sleeping_dragon    schedule 15.10.2012    source источник


Ответы (1)


В идеале вы хотите выбрать определенный размер БПФ и придерживаться его по двум причинам:

  • создание/уничтожение планов занимает много времени по сравнению с самим БПФ, поэтому вы теряете любое преимущество в скорости от использования FFTW, если вы создаете/уничтожаете план для каждого выполняемого БПФ.
  • разрешение по частоте будет разным для каждого размера БПФ, что может затруднить интерпретацию последовательных выходных данных.

В идеале вы должны использовать фиксированный размер БПФ, чтобы создать/уничтожить план только один раз.

Если ваш поток данных является непрерывным, просто выберите подходящий размер БПФ, N, и накапливайте отсчеты в буфере, пока у вас не будет N отсчетов для обработки, и сохраняйте остальные, пока у вас снова не будет N отсчетов.

Если ваши данные несмежные, выберите разумный размер FFT, N, а затем, когда вы получите ‹ N выборок, вы можете дополнить ввод нулями. Когда вы получаете> N образцов, вы можете отбросить лишние образцы.

Во всех случаях, конечно, вы должны применить подходящую оконную функцию до БПФ.

person Paul R    schedule 15.10.2012
comment
Пол Р: Но содержимое моего массива меняется на каждой итерации, а fftw_plan принимает массив в качестве входных данных? Как мне это решить. Как и в первый (и единственный) раз, когда я инициализирую план, какой входной массив я передаю? - person sleeping_dragon; 16.10.2012
comment
Вы просто повторно используете один и тот же буфер (буферы) - не имеет значения, что содержимое менялось каждый раз, когда вы выполняете БПФ. - person Paul R; 16.10.2012
comment
Ok. Я это сделал. Инициализировал все массивы в заголовочном файле моего класса. Затем, когда я инициализирую объект этого класса, я назначаю пространство, определяю размер и составляю планы ffftw. Затем каждый раз, когда мне нужно преобразование Фурье, я выполняю планы (с включенным флагом измерения). Теперь я получаю следующую ошибку сегментации. pastebin.com/sYs0YA3z. Любая идея, где я ошибаюсь. И это происходит во время инициализации, даже до того, как я вызову методы execute. - person sleeping_dragon; 17.10.2012
comment
Решено. Спасибо! Я делал одну очень маленькую ошибку, пропуская нулевой размер по плану. Просмотрел 3 часа! :( - person sleeping_dragon; 17.10.2012