resample
Повторная дискретизация равномерно или неравномерно распределенных данных с новой фиксированной частотой дискретизации.
| Библиотека |
|
Синтаксис
Вызов функции
-
y = resample(x,p,q)— производит повторную дискретизацию входной последовательностиxс частотой дискретизации, вp/qраз превышающей исходную. Функцияresampleприменяет кxСглаживающий фильтр низких частот с конечной импульсной характеристикой (КИХ) и компенсирует задержку, вносимую фильтром. Функция работает по первому измерению массива, размер которого больше1.
-
y = resample(x,tx)— производит повторную дискретизацию значений сигналаx, измеренных в моменты времени, заданные в вектореtx. Функция линейно интерполируетxв вектор равномерно распределенных моментов времени с теми же конечными точками и количеством отсчетов, что иtx. ЗначенияNaNрассматриваются как пропущенные данные и игнорируются.
-
y = resample(x,tx,fs,p,q)— интерполирует входной сигнал на промежуточную равномерную сетку с шагом дискретизации(p/q)/fs. Затем функция фильтрует результат, увеличивая его частоту дискретизации наpи уменьшая наq, что приводит к итоговой частоте дискретизацииfs. Для достижения наилучших результатов убедитесь, чтоfs × q/pкак минимум вдвое больше самой высокой частотной составляющейx.
Аргументы
Входные аргументы
#
x —
входной сигнал
вектор | матрица | N-мерный массив
Details
Входной сигнал, заданный как вектор, матрица или N-мерный массив. Аргумент x может содержать значения NaN при наличии информации о времени. Значения NaN рассматриваются как пропущенные данные и исключаются из повторной дискретизации.
| Типы данных |
|
#
p —
коэффициент повторной дискретизации
положительное целое число
Details
Коэффициент повторной дискретизации, заданный как положительное целое число.
| Типы данных |
|
#
q —
коэффициент повторной дискретизации
положительное целое число
Details
Коэффициент повторной дискретизации, заданный как положительное целое число.
| Типы данных |
|
#
n —
номер соседнего элемента
10 (по умолчанию) | неотрицательное целое число
Details
Номер соседнего элемента, заданный как неотрицательное целое число. Если n = 0, функция resample выполняет интерполяцию по ближайшему соседу. Длина сглаживающего КИХ-фильтра пропорциональна n. Большие значения n обеспечивают более высокую точность за счет увеличения времени вычислений.
| Типы данных |
|
#
beta —
параметр формы окна Кайзера
5 (по умолчанию) | положительный вещественный скаляр
Details
Параметр формы окна Кайзера, заданный как положительный вещественный скаляр. Увеличение аргумента beta расширяет главный лепесток окна, используемого для построения фильтра сглаживания, и уменьшает амплитуду боковых лепестков окна.
| Типы данных |
|
#
b —
коэффициенты КИХ-фильтра
вектор
Details
Коэффициенты КИХ-фильтра, заданные в виде вектора. По умолчанию функция resample проектирует фильтр, используя функцию firls и окно Кайзера. При компенсации задержки функция resample предполагает, что входной аргумент b имеет нечетную длину и линейную фазу. Подробнее см. в разделе Сглаживающий фильтр низких частот.
| Типы данных |
|
#
tx —
моменты времени
неотрицательный вещественный вектор | DateTime
Details
Моменты времени, заданные как неотрицательный вещественный вектор или массив DateTime. Аргумент tx должен монотонно возрастать, но не обязательно быть равномерно распределенным. tx может содержать значения NaN. Эти значения рассматриваются как пропущенные данные и исключаются из повторной дискретизации. Аргумент tx допустим только для входного значения x.
| Типы данных |
|
#
fs —
частота дискретизации
положительный скаляр
Details
Частота дискретизации, заданная как положительный скаляр. Частота дискретизации — это количество отсчетов в единицу времени. Если единицей измерения времени являются секунды, то частота дискретизации указывается в Гц.
| Типы данных |
|
#
method —
метод интерполяции
"linear" (по умолчанию) | "pchip" | "spline"
Details
Метод интерполяции, заданный как "linear", "pchip" или "spline":
-
"linear"— линейная интерполяция; -
"pchip"— кусочно-кубическая интерполяция с сохранением формы; -
"spline"— сплайн-интерполяция с использованием условий «not-a-knot» на концах.
Дополнительную информацию см. на странице interp1.
Входные аргументы «имя-значение»
#
dim —
измерение, по которому выполняется операция
положительный целочисленный скаляр
Details
Измерение, по которому выполняется операция, заданное как положительный целочисленный скаляр. Если аргумент dim не указан, функция resample выполняется по первому измерению массива, размер которого больше 1.
| Типы данных |
|
Примеры
Повторная дискретизация линейной последовательности
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")
Повторная дискретизация многоканального сигнала
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)
Увеличим частоту дискретизации синусоиды на 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)
Изменим форму повторно дискретизированного сигнала так, чтобы время шло по третьему измерению.
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)
Дополнительно
Сглаживающий фильтр низких частот
Details
Для повторной дискретизации сигнала с рациональным коэффициентом p/q функция resample вызывает функцию upfirdn, которая выполняет следующие действия:
Идеальный фильтр сглаживания имеет нормализованную частоту среза рад/отсчет и коэффициент усиления 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.