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

resample

Повторная дискретизация равномерно или неравномерно распределенных данных с новой фиксированной частотой дискретизации.

Библиотека

EngeeDSP

Синтаксис

Вызов функции

  • y = resample(x,p,q) — производит повторную дискретизацию входной последовательности x с частотой дискретизации, в p/q раз превышающей исходную. Функция resample применяет к x Сглаживающий фильтр низких частот с конечной импульсной характеристикой (КИХ) и компенсирует задержку, вносимую фильтром. Функция работает по первому измерению массива, размер которого больше 1.

  • y = resample(x,p,q,n) — использует фильтр сглаживания порядка 2 × n × max(p,q).

  • y = resample(x,p,q,n,beta) — определяет параметр формы окна Кайзера, используемого для проектирования фильтра низких частот.

  • y = resample(x,p,q,b) — фильтрует x, используя коэффициенты фильтра, заданные в аргументе b.

  • y = resample(x,tx) — производит повторную дискретизацию значений сигнала x, измеренных в моменты времени, заданные в векторе tx. Функция линейно интерполирует x в вектор равномерно распределенных моментов времени с теми же конечными точками и количеством отсчетов, что и tx. Значения NaN рассматриваются как пропущенные данные и игнорируются.

  • y = resample(x,tx,fs) — использует полифазный фильтр сглаживания для повторной дискретизации сигнала с равномерной частотой дискретизации, заданной в аргументе fs.

  • y = resample(x,tx,fs,p,q) — интерполирует входной сигнал на промежуточную равномерную сетку с шагом дискретизации (p/q)/fs. Затем функция фильтрует результат, увеличивая его частоту дискретизации на p и уменьшая на q, что приводит к итоговой частоте дискретизации fs. Для достижения наилучших результатов убедитесь, что fs × q/p как минимум вдвое больше самой высокой частотной составляющей x.

  • y = resample(x,tx,___,method) — определяет метод интерполяции вместе с любыми аргументами из предыдущих синтаксисов этой группы. Метод интерполяции может быть "linear", "pchip" или "spline".

  • y,ty = resample(x,tx,___) — возвращает в ty моменты времени, соответствующие повторно дискретизированному сигналу.

  • y,b = resample(x,p,q,___) — также возвращает коэффициенты фильтра, примененного к x во время повторной дискретизации.

  • y,ty,b = resample(x,tx,___) — возвращает коэффициенты фильтра сглаживания в аргумент b.

  • ___ = resample(___,Dimension=dim) — производит повторную дискретизацию входных данных по измерению dim.

Аргументы

Входные аргументы

# x — входной сигнал
вектор | матрица | N-мерный массив

Details

Входной сигнал, заданный как вектор, матрица или N-мерный массив. Аргумент x может содержать значения NaN при наличии информации о времени. Значения NaN рассматриваются как пропущенные данные и исключаются из повторной дискретизации.

Типы данных

Float32, Float64

# p — коэффициент повторной дискретизации
положительное целое число

Details

Коэффициент повторной дискретизации, заданный как положительное целое число.

Типы данных

Float32, Float64

# q — коэффициент повторной дискретизации
положительное целое число

Details

Коэффициент повторной дискретизации, заданный как положительное целое число.

Типы данных

Float32, Float64

# n — номер соседнего элемента
10 (по умолчанию) | неотрицательное целое число

Details

Номер соседнего элемента, заданный как неотрицательное целое число. Если n = 0, функция resample выполняет интерполяцию по ближайшему соседу. Длина сглаживающего КИХ-фильтра пропорциональна n. Большие значения n обеспечивают более высокую точность за счет увеличения времени вычислений.

Типы данных

Float32, Float64

# beta — параметр формы окна Кайзера
5 (по умолчанию) | положительный вещественный скаляр

Details

Параметр формы окна Кайзера, заданный как положительный вещественный скаляр. Увеличение аргумента beta расширяет главный лепесток окна, используемого для построения фильтра сглаживания, и уменьшает амплитуду боковых лепестков окна.

Типы данных

Float32, Float64

# b — коэффициенты КИХ-фильтра
вектор

Details

Коэффициенты КИХ-фильтра, заданные в виде вектора. По умолчанию функция resample проектирует фильтр, используя функцию firls и окно Кайзера. При компенсации задержки функция resample предполагает, что входной аргумент b имеет нечетную длину и линейную фазу. Подробнее см. в разделе Сглаживающий фильтр низких частот.

Типы данных

Float32, Float64

# tx — моменты времени
неотрицательный вещественный вектор | DateTime

Details

Моменты времени, заданные как неотрицательный вещественный вектор или массив DateTime. Аргумент tx должен монотонно возрастать, но не обязательно быть равномерно распределенным. tx может содержать значения NaN. Эти значения рассматриваются как пропущенные данные и исключаются из повторной дискретизации. Аргумент tx допустим только для входного значения x.

Типы данных

Float32, Float64, DateTime

# fs — частота дискретизации
положительный скаляр

Details

Частота дискретизации, заданная как положительный скаляр. Частота дискретизации — это количество отсчетов в единицу времени. Если единицей измерения времени являются секунды, то частота дискретизации указывается в Гц.

Типы данных

Float32, Float64

# method — метод интерполяции
"linear" (по умолчанию) | "pchip" | "spline"

Details

Метод интерполяции, заданный как "linear", "pchip" или "spline":

  • "linear" — линейная интерполяция;

  • "pchip" — кусочно-кубическая интерполяция с сохранением формы;

  • "spline" — сплайн-интерполяция с использованием условий «not-a-knot» на концах.

Дополнительную информацию см. на странице interp1.

Если x не меняется медленно, рассмотрите возможность использования функции interp1 с методом интерполяции "pchip".

Входные аргументы «имя-значение»

# dim — измерение, по которому выполняется операция
положительный целочисленный скаляр

Details

Измерение, по которому выполняется операция, заданное как положительный целочисленный скаляр. Если аргумент dim не указан, функция resample выполняется по первому измерению массива, размер которого больше 1.

Типы данных

Float32, Float64

Выходные аргументы

# y — сигнал с повторной дискретизацией
вектор | матрица | N-мерный массив

Details

Сигнал с повторной дискретизацией, возвращаемый в виде вектора, матрицы или N-мерного массива. Если входной аргумент x имеет длину по измерению dim, а также указаны аргументы p и q, то выходной аргумент y имеет длину по измерению dim.

# b — коэффициенты КИХ-фильтра
вектор

Details

Коэффициенты КИХ-фильтра, возвращаемые в виде вектора.

# ty — выходные данные
неотрицательный вещественный вектор

Details

Выходные данные, возвращаемые в виде неотрицательного вещественного вектора. Аргумент ty применяется только к входному значению x.

Примеры

Повторная дискретизация линейной последовательности

Details

Произведем повторную дискретизацию простой линейной последовательности с частотой 3/2 от исходной 10 Гц. Построим графики исходной последовательности и последовательности с повторной дискретизацией на одном рисунке.

import EngeeDSP.Functions: resample

using Plots

fs = 10
t1 = 0:1/fs:1
x = t1

result = resample(x, 3, 2)
y = result.y

t2 = (0:(length(y)-1)) * 2 / (3 * fs)

plot(t1, x,
     seriestype = :scatter,
     marker = :xcross,
     markerstrokecolor = :blue,
     label = "Original",
     xlabel = "Time (s)",
     ylabel = "Signal",
     legend = :topleft)
plot!(t2, y,
      seriestype = :scatter,
      marker = :circle,
      markerstrokewidth = 1,
      markerstrokecolor = :orange,
      markercolor = :white,
      label = "Resampled")

resample 1

Повторная дискретизация многоканального сигнала

Details

Сгенерируем пятиканальный синусоидальный сигнал со 100 отсчетами. Время увеличивается по столбцам, а частота — по строкам. Построим график сигнала.

import EngeeDSP.Functions: resample

using Plots

p = 3
q = 2

tx = 0:p:300-p

x = [cos.(2π * tx ./ (freq * 100)) for freq in 1:5]
x = hcat(x...)

plot(tx, x,
     marker = :circle,
     markersize = 2,
     linestyle = :dot,
     seriestype = :path,
     title = "Original",
     ylims = (-1.5, 1.5),
     legend = false)

resample 2

Увеличим частоту дискретизации синусоиды на 3/2 по второму измерению. Наложим повторно дискретизированный сигнал на график.

ty = 0:q:300-q
result = resample(x, p, q)
y = result.y

plot(ty, y,
     marker = :circle,
     markersize = 2,
     linestyle = :dot,
     seriestype = :path,
     title = "Upsampled",
     ylims = (-1.5, 1.5),
     legend = false)

resample 2 1

Изменим форму повторно дискретизированного сигнала так, чтобы время шло по третьему измерению.

y = reshape(y, 1, size(y, 1), size(y, 2))
y = permutedims(y, [3, 1, 2])
size(y)
(5, 1, 150)

Понизим частоту дискретизации сигнала до исходной и построим график.

result_z = resample(y, q, p, Dimension=3)
z = result_z.y
z = dropdims(z, dims=2)

plot(tx, z',
     marker = :circle,
     markersize = 2,
     linestyle = :dot,
     seriestype = :path,
     title = "Downsampled",
     ylims = (-1.5, 1.5),
     legend = false)

resample 2 2

Дополнительно

Сглаживающий фильтр низких частот

Details

Для повторной дискретизации сигнала с рациональным коэффициентом p/q функция resample вызывает функцию upfirdn, которая выполняет следующие действия:

  1. Вставляет нули для повышения дискретизации сигнала на p.

  2. Применяет к сигналу с повышенной дискретизацией КИХ-фильтр сглаживания.

  3. Отбрасывает отсчеты для понижения дискретизации отфильтрованного сигнала на q.

Идеальный фильтр сглаживания имеет нормализованную частоту среза рад/отсчет и коэффициент усиления p. Для аппроксимации фильтра сглаживания функция resample использует метод окна Кайзера.

  • Порядок фильтра равен 2 × n × max(p,q). Значение n по умолчанию равно 10.

  • Окно Кайзера имеет параметр формы beta, который определяет компромисс между шириной перехода и затуханием в полосе задерживания. Значение beta по умолчанию равно 5.

  • Коэффициенты фильтра нормализованы для учета коэффициента усиления окна.

В качестве примера спроектируем фильтр сглаживания для повторной дискретизации сигнала до частоты дискретизации, в 3/2 раза превышающей исходную:

p = 3
q = 2
maxpq = max(p, q)

fc = 1 / maxpq
n = 10
order = 2 * n * maxpq
beta = 5

b = fir1(order, fc, kaiser(order + 1, beta))
b = p * b / sum(b)

Алгоритмы

Функция resample выполняет КИХ-проектирование с помощью функции firls, нормализует результат для учета коэффициента усиления окна, а затем реализует изменение частоты дискретизации с помощью функции upfirdn.