Восстановление Недостающих данных

Этот пример показывает, как восстановить недостающие данные через интерполяцию, сгладив фильтрацию и авторегрессивное моделирование.

Введение

С появлением дешевого оборудования сбора данных у вас часто есть доступ к сигналам, которые быстро выбираются равномерно. Это позволяет вам получать прекрасное приближение к базовому сигналу. Но что происходит, когда данные, которые вы измеряете, грубо выбираются или в противном случае недостающие значительные фрагменты? Как вы выводите значения сигналов в точках, промежуточных выборки, которые вы знаете?

Линейная интерполяция

Линейная интерполяция является безусловно наиболее распространенным методом выведения значений между выбранными точками. По умолчанию, когда вы строите вектор в 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 в Signal Processing Toolbox обеспечивает другой метод, чтобы заполнить недостающие данные. 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 использует только 1 500 выборок по обе стороны от разрыва, чтобы выполнить моделирование. Это смягчает последствие последующего мужества гитары после демонстрационных 7500.

Сводные данные

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

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

Дополнительные материалы для чтения

Для получения дополнительной информации об универсальной и неоднородной передискретизации смотрите