Документация Engee

Util — вспомогательные функции

Начиная с версии 0.6.1 пакета DSP.jl функции fftfreq и rfftfreq перенесены из DSP.jl в AbstractFFTs.jl версии 0.5 и более поздних. Эти функции также доступны в FFTW.jl версии 1.1 и более поздних.

unwrap(m; kwargs...)

Предполагает, что m является последовательностью значений, свернутой внутрь заданного диапазона range (отцентрированного относительно нуля), и выполняет развертывание, определяя точки разрыва. Если в dims передано одно измерение, то предполагается, что m имеет точки разрыва свертки только по этому измерению. Если в dims передан диапазон измерений, например 1:ndims(m), предполагается, что m имеет точки разрыва свертки по всем ndims(m) измерениям.

Распространенным назначением развертывания по одному измерению является измерение фазы во времени, например сравнение последовательных кадров кратковременного преобразования Фурье, каждый из которых свертывается внутрь диапазона (-pi, pi].

Распространенным назначением развертывания по нескольким измерениям является измерение фазы сцены, например получение информации о фазе изображения, каждый пиксель которого свертывается внутрь диапазона (-pi, pi].

Аргументы

  • m::AbstractArray{T, N}: развертываемый массив.

  • dims=nothing: измерения, по которым производится развертывание. Если dims является целым числом, то функция unwrap вызывается для этого измерения. Если dims=1:ndims(m), то m развертывается по всем измерениям.

  • range=2pi: диапазон развертываемого массива.

  • circular_dims=(false, ...): когда элемент этого кортежа имеет значение true, при развертывании границы вдоль соответствующей оси массива считаются связными.

  • rng=GLOBAL_RNG: при развертывании массивов с числом измерений более одного используется случайная инициализация. В этом аргументе пользователь может передать собственный генератор случайных чисел.

unwrap!(m; kwargs...)

Версия unwrap, выполняемая на месте.

unwrap!(y, m; kwargs...)

Развертывает m и сохраняет результат в y; см. описание функции unwrap.

hilbert(x)

Вычисляет аналитическое представление x, , где  — преобразование Гилберта для x по первому измерению x.

nextfastfft(n)

Возвращает ближайшее произведение 2, 3, 5 и 7, больше или равное n. Библиотека FFTW содержит оптимизированные ядра для этих размеров и вычисляет преобразования Фурье для входных данных, являющихся произведением этих размеров, быстрее, чем для других.

pow2db(a)

Преобразует коэффициент мощности в дБ (децибелы) или . Это функция, обратная функции db2pow.

amp2db(a)

Преобразует амплитудный коэффициент в дБ (децибелы) или . Это функция, обратная функции db2amp.

db2pow(a)

Преобразует дБ в коэффициент мощности. Эту функцию также можно вызвать в виде a*dB, то есть 3dB == db2pow(3). Это функция, обратная функции pow2db.

db2amp(a)

Преобразует дБ в коэффициент амплитуды. Эту функцию также можно вызвать в виде a*dBa, то есть 3dBa == db2amp(3). Это функция, обратная функции amp2db.

rms(s)

Возвращает среднее квадратическое сигнала s.

rmsfft(f)

Возвращает среднее квадратическое сигнала s для БПФ f = fft(s). Эквивалентно rms(ifft(f)).

meanfreq(x, fs)

Вычисляет частоту средней мощности x с частотой дискретизации fs, которая определяется следующим образом:

где  — частота Найквиста, а  — спектральная плотность мощности.

finddelay(x, y)

Оценивает запаздывание x относительно y путем нахождения пика их взаимной корреляции.

Выходное запаздывание будет положительным при запаздывании x относительно y, отрицательным при опережении и 0 в противном случае.

Пример

julia> finddelay([0, 0, 1, 2, 3], [1, 2, 3])
2

julia> finddelay([1, 2, 3], [0, 0, 1, 2, 3])
-2
shiftsignal(x, s)

Сдвигает элементы сигнала x во времени на заданное количество отсчетов и заполняет пробелы нулями. Для циклического сдвига используйте circshift.

Пример

julia> shiftsignal([1, 2, 3], 2)
3-element Vector{Int64}:
 0
 0
 1

julia> shiftsignal([1, 2, 3], -2)
3-element Vector{Int64}:
 3
 0
 0

См. также описание shiftsignal!.

shiftsignal!(x, s)

Изменяющая версия shiftsignals(): сдвигает x на s отсчетов и заполняет пробелы нулями на месте.

См. также описание shiftsignal.

alignsignals(x, y)

Использует finddelay() и shiftsignal() для выравнивания x с y по времени. Также возвращает запаздывание x относительно y.

Пример

julia> alignsignals([0, 0, 1, 2, 3], [1, 2, 3])
([1, 2, 3, 0, 0], 2)

julia> alignsignals([1, 2, 3], [0, 0, 1, 2, 3])
([0, 0, 1], -2)

См. также описание alignsignals!.

alignsignals!(x, y)

Изменяющая версия alignsignals(): выравнивает x с y по времени на месте.

См. также описание alignsignals.

kernel = diric(Ω::Real, n::Integer)

Ядро Дирихле, также известное как периодическая sinc-функция, где n должно быть положительным целым числом. Возвращает обычно sin(Ω * n/2) / (n * sin(Ω / 2)), но ±1, когда Ω кратно 2π.

В обычном случае, когда 'n' нечетное, результат эквивалентен , то есть дискретному во времени преобразованию Фурье (ДВПФ) n-точечного фильтра скользящего среднего.

Когда n нечетное или четное, функция имеет период 2π или 4π соответственно. Для n в общем случае формула имеет вид diric(Ω,n) =e^{-i (n-1) Ω/2}/n \sum_{k=0}^{n-1} e^{i k Ω}\, что является вещественной и симметричной функцией от .

На 19.03.2021 в определении в Википедии приводятся разные множители. Представленное здесь определение согласовано со SciPy и другими программными фреймворками.

Примеры

julia> round.(diric.((-2:0.5:2)*π, 5), digits=9)'
1×9 adjoint(::Vector{Float64}) with eltype Float64:
 1.0  -0.2  0.2  -0.2  1.0  -0.2  0.2  -0.2  1.0

julia> diric(0, 4)
1.0