2013-10-10 3 views
0

Я очень новичок в методах обработки сигналов, но я пытаюсь применить быстрое преобразование Фурье к ежедневному временному ряду, чтобы удалить сезонность, присутствующую в данных. Пример, с которым я работаю, отсюда: http://www.mathworks.com/help/signal/ug/frequency-domain-linear-regression.htmlБыстрое преобразование Фурье для дезанализации данных в MATLAB

Хотя я понимаю, как реализовать код, как написано в примере, мне трудно адаптировать его к конкретному приложению. То, что я пытаюсь сделать, это создать функцию предварительной обработки, которая дезасонализирует данные обучения с использованием аналогичного кода в приведенном выше примере. Затем, используя те же оценочные коэффициенты из данных в выборке, dessasonalize данные вне образца, чтобы сохранить свою независимость от данных в выборке. В принципе, как только коэффициенты будут оценены, я нормализую каждую новую точку данных, используя те же коэффициенты. Я подозреваю, что это похоже на оценку линейного тренда, а затем удаление его из данных в выборке, а затем использование той же линейной модели по невидимым данным, чтобы таким образом снизить ее.

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

Возможно ли такое исследование, используя эту технику, или я иду по тупиковой дороге? Как мне подойти к этому, используя код в приведенном выше примере?

ответ

0

Что вы хотите сделать, конечно, возможно, вы на правильном пути, но, похоже, вы неправильно поняли несколько пунктов в этом примере. Во-первых, в примере показано, что метод является эквивалентом линейной регрессии во временной области, используя БПФ для выполнения в частотной области операции с тем же эффектом. Во-вторых, удаляемая тенденция не линейная, она равна сумме синусоидов, поэтому FFT используется для идентификации отдельных частотных составляющих относительно аккуратным способом.

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

(1) Выполните грубые «удаление тренда» путем удаления составляющей постоянного тока (среднее значение данных во временной области)

(2) БПФ и проверьте данные, выберите частотные каналы, которые содержат большую часть сигнала.

Вы можете использовать эти каналы для генерации тренда во временной области и вычесть из исходных данных для получения остатков. Однако вам не нужно продолжать, используя IFFT. Вместо этого вы можете явно суммировать компоненты косинуса и синуса. Вы делаете это так же, как на последнем шаге примера, который объясняет, как найти амплитуды с помощью регрессии во временной области, но подставляя амплитуды, полученные из БПФ.

Следующий код показывает, как вы можете сделать это:

tim = (time - time0)/timestep; % <-- acquisition times for your *new* data, normalized 
NFpick = [2 7 13]; % <-- channels you picked to build the detrending baseline 

% Compute the trend 
mu = mean(ts); 
tsdft = fft(ts-mu); 
Nchannels = length(ts);  % <-- size of time domain data 
Mpick = 2*length(NFpick); 
X(:,1:2:Mpick) = cos(2*pi*(NFpick-1)'/Nchannels*tim)'; 
X(:,2:2:Mpick) = sin(-2*pi*(NFpick-1)'/Nchannels*tim)'; 

% Generate beta vector "bet" containing scaled amplitudes from the spectrum 
bet = 2*tsdft(NFpick)/Nchannels; 
bet = reshape([real(bet) imag(bet)].', numel(bet)*2,1) 
trend = X*bet + mu; 

Чтобы удалить эту тенденцию просто делать

detrended = dat - trend; 

где dat ваши новые данные, полученные в разы tim. Убедитесь, что вы последовательно определяете время. Кроме того, предполагается, что данные real (не сложно), как в примере, связанном с. Вам нужно будет изучить код, чтобы он работал для сложных данных.

Смежные вопросы