БПФ с нулевым дополнением в Джулии

Как я могу рассчитать fft, дополненный нулями, до определенной длины в Джулии? Естественно, я могу добавлять нули к моему вектору, но это кажется неудобным.

Я не могу найти ничего об этом в документах, и вызов methods(fft), похоже, не вызывает никаких соответствующих сигнатур методов. Я также не могу найти ничего подходящего для plan_fft.


person DNF    schedule 27.09.2016    source источник


Ответы (2)


Я не думаю, что есть какие-либо аргументы ключевого слова, чтобы сделать это или что-то в этом роде, если это то, что вы искали?

Функции nextpow2() и nextprod() полезны для получения размера массива для ввода в fft(). Затем вы можете создать массив нулей более эффективного размера и заполнить его своими данными. Или вы можете добавить разницу между идеальным размером и размером вашего массива в свой массив (первый лучше, если вы вычисляете много fft, поскольку тогда вы можете повторно использовать входной массив, просто заполняя его каждый раз).

Однострочник из комментариев datpad = [dat; zeros(eltype(dat), nextprod(length(dat)) - length(dat)]

http://docs.julialang.org/en/release-0.5/stdlib/math/?highlight=fft#signal-processing Если вы еще не проверили это!

person Alexander Morley    schedule 27.09.2016
comment
Это удивительно, учитывая, что в Matlab и Numpy параметр отступа занимает центральное место. Заполнение вручную неудобно в REPL и выделяет дополнительную память. Я предполагаю, что реализация моего собственного метода-оболочки с нулевыми прокладками является решением. - person DNF; 27.09.2016
comment
Да, если вы собираетесь часто использовать в REPL, то, вероятно, это правильный путь. Вы можете сделать это в одну строку, хотя datpad = [dat; zeros(eltype(dat), nextprod(length(dat)) - length(dat)] - person Alexander Morley; 27.09.2016

Если не ошибаюсь, Юлия использует FFTW для FFT. Я не помню, чтобы видел что-нибудь в руководстве FFTW об автоматическом выполнении БПФ с нулевым дополнением без манипулирования входными данными.

Если вас не интересует скорость и вы используете БПФ только как сокращение для дискретного преобразования Фурье (ДПФ), вы можете выполнить ДПФ с функцией ДПФ выборки произвольного частотного бина или просто запустить преобразование вручную. Это больше не будет операция O( N log N ), но она позволяет избежать ручного заполнения вашего исходного вектора данных, и вы можете разместить выборку преобразования по мере необходимости, например. избыточная выборка интересующих вас частей спектра или исключение частей, которые вам не нужны.

Например, чтобы создать матрицу ДПФ, которая производит выборку с частотой f:

M = exp( -2im*pi * f/Fs * (0:N-1)' )

где Fs — частота дискретизации вектора данных, а N — длина вектора данных. f также является вектором значений частоты. Применить с умножением матриц:

y = M * x

Если матрица ДПФ становится слишком большой, просто применяйте каждую ее строку в цикле.

person aquaticapetheory    schedule 09.10.2016