В этом примере показано, как восстановить недостающие данные через интерполяцию, сгладив фильтрацию и авторегрессивное моделирование.
С появлением дешевого оборудования сбора данных у вас часто есть доступ к сигналам, которые быстро производятся равномерно. Это позволяет вам получать прекрасное приближение к базовому сигналу. Но что происходит, когда данные, которые вы измеряете, грубо производятся или в противном случае недостающие значительные фрагменты? Как вы выводите значения сигналов в точках, промежуточных выборки, которые вы знаете?
Линейная интерполяция является безусловно наиболее распространенным методом выведения значений между произведенными точками. По умолчанию, когда вы строите вектор в 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
выполняет интерполяцию. Это может быть выполнено с методом Linear 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.
Вы видели несколько способов восстановить недостающие данные из его соседних демонстрационных значений с помощью интерполяции, передискретизируя и авторегрессивного моделирования.
Интерполяция и передискретизация работают на медленно различные сигналы. Передискретизация с фильтрами сглаживания часто делает лучшее задание при восстановлении сигналов, которые состоят из низкочастотных компонентов. Для восстановления больших разрывов в колеблющихся сигналах авторегрессивное моделирование около разрыва может быть особенно эффективным.
Для получения дополнительной информации об универсальной и неоднородной передискретизации смотрите