В этом примере показано, как восстановить отсутствующие данные с помощью интерполяции, сглаживающей фильтрации и авторегрессионного моделирования.
С появлением дешевого оборудования для сбора данных вы часто получаете доступ к сигналам, которые быстро отбираются через регулярные промежутки времени. Это позволяет получить точное приближение к базовому сигналу. Но что происходит, когда данные, которые вы измеряете, грубой выборки или иным образом не хватает значительных частей? Как вывести значения сигналов в точках между выборками, которые вы знаете?
Линейная интерполяция является наиболее распространенным методом вывода значений между точками выборки. По умолчанию при построении вектора в MATLAB отображаются точки, соединенные прямыми линиями. Для аппроксимации истинного сигнала необходимо выполнить выборку сигнала с очень высокой степенью детализации.
В этом примере отбирают образец синусоиды с тонким и грубым разрешением. При построении графика тонко отобранная синусоида очень сильно напоминает истинную непрерывную синусоиду. Таким образом, можно использовать его как модель «истинного сигнала». На графике ниже выборки сигнала грубой выборки показаны в виде окружностей, соединенных прямыми линиями.
tTrueSignal = 0:0.01:20; xTrueSignal = sin(2*pi*2*tTrueSignal/7); tSampled = 0:20; xSampled = sin(2*pi*2*tSampled/7); plot(tTrueSignal,xTrueSignal,'-', ... tSampled,xSampled,'o-') legend('true signal','samples')

Просто извлекать промежуточные образцы так же, как plot выполняет интерполяцию. Это может быть выполнено линейным способом interp1 функция.
tResampled = 0:0.1:20; xLinear = interp1(tSampled,xSampled,tResampled,'linear'); plot(tTrueSignal,xTrueSignal,'-', ... tSampled, xSampled, 'o-', ... tResampled,xLinear,'.-') legend('true signal','samples','interp1 (linear)')

Проблема линейной интерполяции заключается в том, что результат не очень гладкий. Другие методы интерполяции могут создавать более плавные аппроксимации.
Многие физические сигналы похожи на синусоиды тем, что они непрерывны и имеют непрерывные производные. Реконструировать такие сигналы можно с помощью кубической сплайн-интерполяции, обеспечивающей непрерывность первой и второй производных интерполированного сигнала в каждой точке данных:
xSpline = interp1(tSampled,xSampled,tResampled,'spline'); plot(tTrueSignal,xTrueSignal,'-', ... tSampled, xSampled,'o', ... tResampled,xLinear,'.-', ... tResampled,xSpline,'.-') legend('true signal','samples','interp1 (linear)','interp1 (spline)')

Кубические шлицы особенно эффективны при интерполяции сигналов, которые состоят из синусоид. Однако существуют и другие способы, которые можно использовать для получения большей точности физических сигналов, которые имеют непрерывные производные вплоть до очень высокого порядка.
resample функция в панели инструментов обработки сигналов предоставляет другой метод заполнения недостающих данных. resample может восстанавливать синусоидальные составляющие низкой частоты с очень низким искажением.
xResample = resample(xSampled, 10, 1); tResample = 0.1*((1:numel(xResample))-1); plot(tTrueSignal,xTrueSignal,'-', ... tResampled,xSpline,'.', ... tResample, xResample,'.') legend('true signal','interp1 (spline)','resample')

Как и другие методы, resample имеет некоторые трудности при восстановлении конечных точек. С другой стороны, центральная часть восстановленного сигнала очень хорошо согласуется с истинным сигналом.
xlim([6 10])

resample может вмещать неравномерно дискретизированные сигналы. Метод лучше всего работает, когда сигнал дискретизируется с высокой скоростью.
В следующем примере мы создадим медленно движущуюся синусоиду, удалим образец и увеличим изображение в окрестности отсутствующего образца.
tTrueSignal = 0:.1:20; xTrueSignal = sin(2*pi*2*tTrueSignal/15); Tx = 0:20; Tmissing = Tx(10); Tx(10) = []; x = sin(2*pi*2*Tx/15); Xmissing = sin(2*pi*2*Tmissing/15); [y, Ty] = resample(x,Tx,10,'spline'); plot(tTrueSignal, xTrueSignal, '-', ... Tmissing,Xmissing,'x ', ... Tx,x,'o ', ... Ty,y,'. ') legend('true signal','missing sample','remaining samples','resample with ''spline''') ylim([-1.2 1.2]) xlim([6 14])

Восстановленная синусоида достаточно хорошо отслеживает форму истинного сигнала с незначительной ошибкой вблизи отсутствующего образца.
Однако resample плохо работает при большом разрыве в сигнале. Например, рассмотрим затухшую синусоиду, средняя часть которой отсутствует:
tTrueSignal = (0:199)/199; xTrueSignal = exp(-0.5*tTrueSignal).*sin(2*pi*5*tTrueSignal); tMissing = tTrueSignal; xMissing = xTrueSignal; tMissing(50:140) = []; xMissing(50:140) = []; [y,Ty] = resample(xMissing, tMissing, 200, 'spline'); plot(tTrueSignal,xTrueSignal,'-', ... tMissing,xMissing,'o',... Ty,y,'.') legend('true signal','samples','resample with ''spline''')

Здесь resample обеспечивает непрерывность восстановленного сигнала и наличие непрерывных производных вблизи недостающих точек. Однако она не может адекватно восстановить недостающую часть.
Как можно видеть выше, одной фильтрации и кубической интерполяции может быть недостаточно для устранения больших зазоров. Однако при определенных видах дискретизированных сигналов, таких как те, которые возникают при наблюдении колебательных явлений, часто можно вывести значения отсутствующих выборок на основе данных, непосредственно предшествующих или следующих за промежутком.
fillgaps функция может заменить отсутствующие образцы (указано NaN) в другом равномерно дискретизированном сигнале путем подгонки авторегрессионной модели к выборкам, окружающим зазор, и экстраполяции в зазор из обоих направлений.
tTrueSignal = (0:199)/199; xTrueSignal = exp(-.5*tTrueSignal).*sin(2*pi*5*tTrueSignal); gapSignal = xTrueSignal; gapSignal(50:140) = NaN; y = fillgaps(gapSignal); plot(tTrueSignal,xTrueSignal,'-', ... tTrueSignal,gapSignal,'o', ... tTrueSignal,y,'.') legend('true signal','samples','reconstructed signal')

Метод работает, потому что авторегрессивные сигналы имеют информацию, которая распределена по многим выборкам. Для полного восстановления полного сигнала требуется лишь несколько выборок в любом сегменте.
Этот тип реконструкции может быть адаптирован для оценки отсутствующих выборок более сложных сигналов. Рассмотрим дискретизированный аудиосигнал выщипанной гитарной строки после удаления шестисот семплов сразу после взлома:
[y,fs] = audioread('guitartune.wav'); x = y(1:3500); x(2000:2600) = NaN; y2 = fillgaps(x); plot(1:3500, y(1:3500), '-', ... 1:3500, x, '.', ... 1:3500, y2, '-') legend('original signal','samples','reconstructed signal',... 'Location','best')

Довольно просто заполнить данные в пределах промежутка, когда известно, что сигнал вблизи промежутка может быть смоделирован одним авторегрессионным процессом. Можно уменьшить проблемы, когда сигнал состоит из непостоянного авторегрессионного процесса, ограничивая область, в которой вычисляются параметры модели. Это полезно, когда вы пытаетесь заполнить пробел в пределах «звонкого» периода одного резонанса, который приходит непосредственно перед или после другого, более сильного, резонанса.
x = y(350001:370000); x(6000:6950) = NaN; y2 = fillgaps(x); y3 = fillgaps(x,1500); plot(1:20000, y(350001:370000), '-', ... 1:20000, x, '.', ... 1:20000, y2, '-', ... 1:20000, y3, '-') xlim([2200 10200]) legend('original signal','samples','fillgaps (all)','fillgaps (localized)',... 'Location','best')

На приведенном выше графике в форме сигнала отсутствует участок непосредственно перед большим резонансом. Как и прежде, fillgaps используется для экстраполяции в область зазора с использованием всех доступных данных. Второй вызов fillgaps использует только 1500 образцов с обеих сторон зазора для выполнения моделирования. Это уменьшает эффект последующего захвата гитары после образца 7500.
Вы видели несколько способов восстановления отсутствующих данных из соседних значений выборки с помощью интерполяции, повторной выборки и авторегрессионного моделирования.
Интерполяция и повторная выборка работают для медленно изменяющихся сигналов. Повторная выборка с сглаживающими фильтрами часто позволяет лучше восстанавливать сигналы, состоящие из низкочастотных компонентов. Для восстановления больших промежутков в колебательных сигналах особенно эффективным может быть авторегрессивное моделирование вблизи промежутка.
Дополнительные сведения о равномерной и неравномерной повторной выборке см. в разделе