resample

Преобразование равномерных или неоднородных данных в новую фиксированную скорость

Описание

пример

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

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

пример

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

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

пример

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

пример

[yTT,b] = resample(xTT,p,q,___) повторяет равномерно выбранные данные в MATLAB® timetable xTT при p/ q умножает исходную частоту дискретизации и возвращает yTT расписания. Можно задать дополнительные аргументы n, beta, или b.

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

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,ty,b] = resample(x,tx,___) возвращается в b коэффициенты антиалиазирующего фильтра.

пример

yTT = resample(xTT) повторяет неоднородно выборочные данные в xTT и возвращает равномерно выбранные данные. yTT имеет те же конечные точки и количество выборок, что и xTT.

[yTT,b] = resample(xTT,___) повторяет неоднородно выборочные данные в xTT а также возвращает коэффициенты антиалиазирующего фильтра в b. Можно задать те же опции аргументов, которые доступны для входа x, tx.

пример

[___] = resample(___,'Dimension',dim) повторяет входной вход по размерности dim.

Примеры

свернуть все

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

fs = 10;
t1 = 0:1/fs:1;
x = t1;
y = resample(x,3,2);
t2 = (0:(length(y)-1))*2/(3*fs);

plot(t1,x,'*',t2,y,'o')
xlabel('Time (s)')
ylabel('Signal')
legend('Original','Resampled', ...
    'Location','NorthWest')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original, Resampled.

При фильтрации resample принимает, что вход последовательность, x, равен нулю до и после выборок. Большие отклонения от нуля в конечных точках x может привести к неожиданным значениям для y.

Покажите эти отклонения путем повторной дискретизации треугольной последовательности и вертикально сдвинутой версии последовательности с ненулевыми конечными точками.

x = [1:10 9:-1:1;
    10:-1:1 2:10]';
y = resample(x,3,2);

subplot(2,1,1)
plot(1:19,x(:,1),'*',(0:28)*2/3 + 1,y(:,1),'o')
title('Edge Effects Not Noticeable')
legend('Original','Resampled', ...
    'Location','South')

subplot(2,1,2)
plot(1:19,x(:,2),'*',(0:28)*2/3 + 1,y(:,2),'o')
title('Edge Effects Noticeable')
legend('Original','Resampled', ...
    'Location','North')

Figure contains 2 axes. Axes 1 with title Edge Effects Not Noticeable contains 2 objects of type line. These objects represent Original, Resampled. Axes 2 with title Edge Effects Noticeable contains 2 objects of type line. These objects represent Original, Resampled.

Создайте синусоидальный сигнал. Задайте частоту дискретизации так, чтобы 16 выборки соответствовали в точности одному периоду сигнала. Нарисуйте диаграмму лист-ствол сигнала. Наложите ступенчатый график для визуализации sample-and-hold.

fs = 16;
t = 0:1/fs:1-1/fs;

x = 0.75*sin(2*pi*t);

stem(t,x)
hold on
stairs(t,x)
hold off

Figure contains an axes. The axes contains 2 objects of type stem, stair.

Использование resample для увеличения частоты сигнала в четыре раза. Используйте настройки по умолчанию. Постройте график результата вместе с исходным сигналом.

ups = 4;
dns = 1;

fu = fs*ups;
tu = 0:1/fu:1-1/fu;

y = resample(x,ups,dns);

stem(tu,y)
hold on
stairs(t,x)
hold off
legend('Resampled','Original')

Figure contains an axes. The axes contains 2 objects of type stem, stair. These objects represent Resampled, Original.

Повторите расчет. Задайте n = 1 так, что сглаживающий фильтр имеет порядок 2×1×4=8. Задайте параметр формы β=0 для окна Кайзера. Вывод фильтра, а также повторно дискретизированного сигнала.

n = 1;
beta = 0;

[y,b] = resample(x,ups,dns,n,beta);

fo = filtord(b)
fo = 8
stem(tu,y)
hold on
stairs(t,x,'--')
hold off
legend('n = 1, \beta = 0')

Figure contains an axes. The axes contains 2 objects of type stem, stair. This object represents n = 1, \beta = 0.

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

Увеличение n до 5 и уйти β=0. Проверьте, что фильтр имеет порядок 40. Постройте график повторно дискретизированного сигнала.

n = 5;

[y,b] = resample(x,ups,dns,n,beta);

fo = filtord(b)
fo = 40
stem(tu,y)
hold on
stairs(t,x,'--')
hold off
legend('n = 5, \beta = 0')

Figure contains an axes. The axes contains 2 objects of type stem, stair. This object represents n = 5, \beta = 0.

Более длинное окно имеет более узкий майнлобе и лучше ослабляет эффекты сглаживания. Это также ослабляет сигнал.

Оставьте порядок фильтра в 2×5×4=40 и увеличить параметр формы до β=20.

beta = 20;

y = resample(x,ups,dns,n,beta);

stem(tu,y)
hold on
stairs(t,x,'--')
hold off
legend('n = 5, \beta = 20')

Figure contains an axes. The axes contains 2 objects of type stem, stair. This object represents n = 5, \beta = 20.

Высокое ослабление бокового желоба приводит к хорошей повторной дискретизации.

Уменьшите порядок фильтра назад к 2×1×4=8 и уходите β=20.

n = 1;

[y,b] = resample(x,ups,dns,n,beta);

stem(tu,y)
hold on
stairs(t,x,'--')
hold off
legend('n = 1, \beta = 20')

Figure contains an axes. The axes contains 2 objects of type stem, stair. This object represents n = 1, \beta = 20.

Более широкий массив генерирует значительные программные продукты при повторной дискретизации.

Сгенерируйте 60 выборки синусоиды и повторно отобразите ее с 3/2 исходной скоростью. Отображение исходных и повторно дискретизированных сигналов.

tx = 0:6:360-3;
x = sin(2*pi*tx/120);

ty = 0:4:360-2;
[y,by] = resample(x,3,2);

plot(tx,x,'+-',ty,y,'o:')
legend('original','resampled')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent original, resampled.

Постройте график частотной характеристики сглаживающего фильтра.

freqz(by)

Figure contains 2 axes. Axes 1 contains an object of type line. Axes 2 contains an object of type line.

Повторно отобразите сигнал на 2/3 исходной скорости. Отобразите исходный сигнал и его повторную дискретизацию.

tz = 0:9:360-9;
[z,bz] = resample(x,2,3);

plot(tx,x,'+-',tz,z,'o:')
legend('original','resampled')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent original, resampled.

Постройте график импульсной характеристики нового lowpass.

impz(bz)

Figure contains an axes. The axes with title Impulse Response contains an object of type stem.

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

a = randn(10,1);
b = randn(10,1);

t = days(1:10);

xTT = timetable(t',[a b]);

Используйте resample функция для увеличения частоты дискретизации с одного раза в день до одного раза в час. Постройте график обоих наборов данных.

yTT = resample(xTT,24,1);

subplot(2,1,1)
plot(xTT.Time,xTT.Var1,'-o')
subplot(2,1,2)
plot(yTT.Time,yTT.Var1,'-o')

Figure contains 2 axes. Axes 1 contains 2 objects of type line. Axes 2 contains 2 objects of type line.

Используйте данные, записанные Галилеем Галилеем в 1610 году, чтобы определить орбитальный период Каллисто, самого внешнего из четырёх крупнейших спутников Юпитера.

«Галилей» наблюдал за движением спутников в течение шести недель, начиная с 15 января. Наблюдения имеют несколько пробелов, потому что Юпитер не был виден в пасмурные ночи. Сгенерируйте datetime массив времени наблюдения.

t = [0 2 3 7 8 9 10 11 12 17 18 19 20 24 25 26 27 28 29 31 32 33 35 37 ...
    41 42 43 44 45]'+1;

yg = [10.5 11.5 10.5 -5.5 -10.0 -12.0 -11.5 -12.0 -7.5 8.5 12.5 12.5 ...
    10.5 -6.0 -11.5 -12.5 -12.5 -10.5 -6.5 2.0 8.5 10.5 13.5 10.5 -8.5 ...
    -10.5 -10.5 -10.0 -8.0]';

obsv = datetime(1610,1,15+t);

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

fs = 1;

[y,ty] = resample(yg,t,fs,3,1);

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

plot(t,yg,'o',ty,y,'.-')
xlabel('Day')

Figure contains an axes. The axes contains 2 objects of type line.

Повторите процедуру с помощью сплайн интерполяции и отображения дат наблюдений. Выразите частоту дискретизации в обратные дни.

fs = 1/86400;

[ys,tys] = resample(yg,obsv,fs,3,1,'spline');

plot(t,yg,'o')
hold on
plot(ys,'.-')
hold off

ax = gca;
ax.XTick = t(1:9:end);
ax.XTickLabel = char(obsv(1:9:end));

Figure contains an axes. The axes contains 2 objects of type line.

Вычислите оценку спектра степени периодограммы равномерно распределенных, линейно интерполированных данных. Выберите длину ДПФ 1024. Сигнал достигает пика в обратном направлении орбитального периода.

[pxx,f] = periodogram(ys,[],1024,1,'power');
[pk,i0] = max(pxx);

f0 = f(i0);
T0 = 1/f0
T0 = 16.7869
plot(f,pxx,f0,pk,'o')
xlabel('Frequency (day^{-1})')

Figure contains an axes. The axes contains 2 objects of type line.

Человек зафиксировал их вес в фунтах в течение високосного 2012 года. Человек не записывал свой вес каждый день, поэтому данные неоднородны. Загрузите данные и сохраните измерения в расписании MATLAB. Используйте вектор datetime, чтобы задать RowTimes.

load weight2012.dat

rowTimes = datetime(2012,1,1:366)';
wt = weight2012(:,2);
xTT = timetable(rowTimes,wt);

Повторно отобразите данные. Результатом является расписание, содержащее равномерно выбранные данные с теми же конечными точками и количеством выборок, что и wt.

yTT = resample(xTT);

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

plot(xTT.rowTimes,xTT.wt,'-o',yTT.Time,yTT.wt,'-*')
xlim(datetime([2012 08 01;2012 08 31]))
legend('origal','resampled')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent origal, resampled.

Повторно отобразите данные с помощью кубической интерполяции.

yTTs = resample(xTT,'pchip');

plot(xTT.rowTimes,xTT.wt,'o',yTTs.Time,yTTs.wt,'-*')
xlim(datetime([2012 08 01;2012 08 31]))

Figure contains an axes. The axes contains 2 objects of type line.

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

fs = 1/86400;
yTTf = resample(xTT,2*fs,'spline');

plot(yTTf.Time,yTTf.wt,'-*')
xlim(datetime([2012 08 01;2012 08 31]))

Figure contains an axes. The axes contains an object of type line.

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

p = 3;
q = 2;

tx = 0:p:300-p;

x = cos(2*pi*tx./(1:5)'/100);

plot(tx,x,'.:')
title('Original')
ylim([-1.5 1.5])

Figure contains an axes. The axes with title Original contains 5 objects of type line.

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

ty = 0:q:300-q;

y = resample(x,p,q,'Dimension',2);

plot(ty,y,'.:')
title('Upsampled')

Figure contains an axes. The axes with title Upsampled contains 5 objects of type line.

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

y = permute(y,[1 3 2]);
size(y)
ans = 1×3

     5     1   150

Уменьшите значение сигнала до его исходной скорости и постройте график.

z = resample(y,q,p,'Dimension',3);

plot(tx,squeeze(z),'.:')
title('Downsampled')

Figure contains an axes. The axes with title Downsampled contains 5 objects of type line.

Входные параметры

свернуть все

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

Пример: cos(pi/4*(0:159))+randn(1,160) является одноканальным вектором-строкой.

Пример: cos(pi./[4;2]*(0:159))'+randn(160,2) является двухканальным сигналом.

Типы данных: double

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

Типы данных: double

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

Типы данных: double

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

Типы данных: double

Конечные импульсные характеристики, заданные как вектор. По умолчанию resample проектирует фильтр используя firls с окном Кайзера. При компенсации задержки resample принимает b имеет нечетную длину и линейную фазу. Для получения дополнительной информации см. раздел «Сглаживание Lowpass фильтра».

Типы данных: double

Входное расписание как минимум с двумя строками, заданное как timetable. Каждая переменная в xTT рассматривается как независимый сигнал. Если переменная в расписании является массивом N -D, тоresample действует по первой размерности.

Примечание

  • RowTimes должен быть либо вектором длительности, либо datetime объект с уникальными и конечными значениями. Нефинитные значения времени рассматриваются как отсутствующие данные и игнорируются.

  • При несортированном значении resample сортировки RowTimes в порядке возрастания.

См. timetable для получения дополнительной информации.

Типы данных: double

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

Типы данных: double | datetime

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

Типы данных: double

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

  • 'linear' - Линейная интерполяция.

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

  • 'spline' - Сплайн интерполяция с использованием не узловых условий.

См. interp1 Страница с описанием для получения дополнительной информации.

Примечание

Если x не изменяется медленно, рассмотрите использование interp1 с 'pchip' метод интерполяции.

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

Типы данных: single | double

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

свернуть все

Повторно дискретизированный сигнал, возвращенный в виде вектора, матрицы или N массива -D. Если x имеет длину N по размерности dim и вы задаете p и q, затем y имеет длину  <reservedrangesplaceholder1> × <reservedrangesplaceholder0>/ q вдоль dim.

Конечные импульсные характеристики, возвращенные как вектор.

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

Повторно дискретизированное расписание, возвращаемое как timetable.

Подробнее о

свернуть все

Сглаживающий Lowpass фильтр

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

  1. Вставьте нули, чтобы увеличить сигнал по p.

  2. Примените конечную импульсную характеристику фильтр сглаживания к усиленному сигналу.

  3. Отбросьте выборки, чтобы уменьшить значение фильтрованного сигнала по q.

Идеальный сглаживающий фильтр имеет нормированную частоту среза f c = π/max (p, q) рад/образец и коэффициент усиления p. Чтобы аппроксимировать антиалиазирующий фильтр, resample использует метод окна Кайзера.

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

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

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

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

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

fc = 1/maxpq;
n = 50;
order = 2*n*maxpq;
beta = 5;

b = fir1(order,fc,kaiser(order+1,beta));
b = p*b/sum(b);
Смотрите Повторно Дискретизацию Равномерно Дискретизированных Сигналов для получения дополнительной информации.

Совет

  • Используйте isregular функция для определения, равномерно ли дискретизировано расписание.

Алгоритмы

resample выполняет проект конечной импульсной характеристики, используя firls, нормализует результат для расчета усиления обработки окна, а затем реализует изменение скорости с помощью upfirdn.

Расширенные возможности

.
Представлено до R2006a