resample

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

Описание

пример

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

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

пример

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® xTT в pQ раз от исходной частоты дискретизации и возвращает расписание yTT. Можно задать дополнительные аргументы n\beta, или b.

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

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

y = resample(x,tx,fs,p,q) интерполирует входной сигнал к промежуточной регулярной координатной сетке с демонстрационным интервалом (pQ)/fs. Функция затем фильтрует результат сверхдискретизировать его p и проредите его q, получившийся в итоговой частоте дискретизации fs. Для лучших результатов обеспечьте тот fs × qP является по крайней мере вдвое более большим, чем самая высокая частотная составляющая 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 выборок соответствуют точно одному периоду сигнала. Чертите диаграмму стебель-листья сигнала. Наложите ступенчатый график для визуализации производить-и-содержать.

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.

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

Увеличьте 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.

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

Оставьте порядка фильтра в 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.

Шире mainlobe генерирует значительные артефакты после передискретизации.

Сгенерируйте 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.

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

Галилео наблюдал движение спутников в течение шести недель, начиная 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.

Вычислите оценку спектра мощности периодограммы однородно расположенных с интервалами, линейно интерполированных данных. Выберите длину DFT 1 024. Сигнал достигает максимума при инверсии орбитального периода.

[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

Downsample сигнал назад к его исходному уровню и графику это.

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 расширяется mainlobe окна раньше проектировал фильтр сглаживания и уменьшает амплитуду боковых лепестков окна.

Типы данных: 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 имеет длину ⌈N × pQ вдоль dim.

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

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

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

Больше о

свернуть все

Сглаживание фильтра Lowpass

Передискретизировать сигнал рациональным факторным pQ, resample вызовы upfirdn, который концептуально выполняет эти шаги:

  1. Вставьте нули, чтобы сверхдискретизировать сигнал p.

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

  3. Отбросьте выборки, чтобы проредить отфильтрованный сигнал q.

Идеальный фильтр сглаживания нормировал частоту среза f c = π / макс. (pQ) рад/отсчет и усиление p. Аппроксимировать фильтр сглаживания, resample использует метод окна Кайзера.

  • Порядком фильтра является 2 × n × макс. (pQ). Значение по умолчанию 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