У меня есть сигнал некоторой длины, скажем, 1000 образцов. Я хотел бы расширить этот сигнал до 5000 отсчетов, отобранных с той же частотой, что и оригинал (т. Е. Я хочу предсказать, каким будет сигнал, если я продолжу дискретизировать его в течение более длительного периода времени). Сигнал состоит из нескольких синусоидальных компонентов, сложенных вместе.
Метод, который впервые пришел ко мне, состоял в том, чтобы взять весь БПФ и расширить его, но это оставляет очень сильный разрыв в кадре 1001. Я также рассмотрел использование только части спектра около пиков, и хотя это, кажется, немного улучшить сигнал, мне не кажется, что фаза гарантированно будет правильной. Каков наилучший метод для расширения этого сигнала?
Вот некоторый код MATLAB, показывающий идеализированный метод того, что я хочу. Конечно, я не буду знать заранее, что существует ровно 3 синусоидальных компонента, а также их точная фаза и частота. Я хочу убедиться, что функция непрерывна, что при переходе к точке 501 нет скачка
vals = 1:50;
signal = 100+5*sin(vals/3.7+.3)+3*sin(vals/1.3+.1)+2*sin(vals/34.7+.7); % This is the measured signal
% Note, the real signal will have noise and not be known exactly.
output_vals = 1:200;
output_signal = 100+5*sin(output_vals/3.7+.3)+3*sin(output_vals/1.3+.1)+2*sin(output_vals/34.7+.7); % This is the output signal
figure;
plot(output_signal);
hold all;
plot(signal);
В основном, учитывая зеленую линию, я хочу найти синюю линию.
Ответы:
В зависимости от исходного материала метод спектральной интерполяции на основе DCT, описанный в следующей статье, выглядит многообещающим:
Вот одна из фигур из бумаги, показывающая пример интерполяции:
Применение метода для восстановления потерянных сегментов ( например, 4.2. Синтез потерянных периодов основного тона ), вероятно, наиболее актуально для экстраполяции. Другими словами, возьмите кусок существующего исходного материала, представьте, что между ребром и выбранным вами произвольным сегментом есть потерянный сегмент, а затем «восстановите» «недостающую» часть (и, возможно, отбросьте часть, которую вы использовали в конце). Похоже, что еще более простое применение метода будет работать для бесшовного зацикливания исходного материала ( например, 3.1. Интерполяция спектральной амплитуды ).
источник
Я думаю, что вы ищете линейное кодирование с предсказанием (иначе известное как авторегрессивное скользящее среднее ). LPC экстраполирует временной ряд, сначала подгоняя линейную модель к временному ряду, в котором предполагается, что каждая выборка представляет собой линейную комбинацию предыдущих выборок. После подгонки этой модели к существующему временному ряду ее можно запустить вперед, чтобы экстраполировать дополнительные значения при сохранении стационарного (?) Спектра мощности.
Вот небольшой пример в Matlab, использующий
lpc
функцию для оценки коэффициентов LPC.Конечно, в реальном коде вы будете использовать
filter
для реализации экстраполяции, используя коэффициенты LPCa
в качестве фильтра БИХ и предварительно загружая известные значения временных рядов в состояние фильтра; что-то вроде этого:Вот вывод:
Это делает разумную работу, хотя прогноз почему-то угасает со временем.
Я на самом деле не знаю много о моделях AR, и было бы интересно узнать больше.
-
РЕДАКТИРОВАТЬ: @china и @Emre правы, метод Бург, кажется, работает намного лучше, чем LPC. Просто путем изменения
lpc
вarburg
в приведенном выше коде дает следующие результаты:Код доступен здесь: https://gist.github.com/2843661
источник
a=lpc(x,N)
наa=arburg(x,N)
. Для (сухого) обсуждения алгоритмов AR см. Почему Yule-Walker не должен использоваться для авторегрессионного моделированияx
(P
измерения) дляlpc
(илиarburg
) при оценке коэффициентов модели. Для экстраполяции по исходному вопросу вы должны основывать эту оценку только на первыхM
измерениях. Предоставление меньшего количества временных точек приводит к плохой экстраполяции, но все еще работает достаточно хорошо.1-D «Экстраполяция» довольно проста с помощью метода БУРГА для оценки коэффициентов ЛП. Как только коэффициенты LP становятся доступными, можно легко вычислить выборки времени, применяя фильтр. Сэмплы, которые предсказываются с помощью Бургса, являются очередными сэмплами вашего входного временного сегмента.
источник
Если вы абсолютно уверены, что в сигнале есть только несколько частотных компонентов, вы можете попробовать алгоритм MUSIC , чтобы выяснить, какие частоты содержатся в вашем сигнале, и попытаться работать оттуда. Я не совсем уверен, что это можно сделать, чтобы работать отлично.
Кроме того, поскольку ваши данные полностью детерминированы, вы можете попытаться создать своего рода нелинейный предиктор, обучить его, используя существующий набор данных, и позволить ему экстраполировать остальные.
В общем, это проблема экстраполяции. Возможно, вы захотите Google что-то вроде экстраполяции цены Фурье .
источник