0

我是信号处理技术的新手,但我正在尝试将快速傅立叶变换应用于每日时间序列,以消除数据中存在的季节性。我正在使用的示例来自这里: http: //www.mathworks.com/help/signal/ug/frequency-domain-linear-regression.html

虽然我了解如何实现示例中编写的代码,但我很难将其适应我的特定应用程序。我想要做的是创建一个预处理函数,使用与上述示例类似的代码对训练数据进行去季节化处理。然后,使用来自样本内数据的相同估计系数,对样本外数据进行去季节化处理,以保持其与样本内数据的独立性。基本上,一旦估计了系数,我将使用相同的系数对每个新数据点进行归一化。我怀疑这类似于估计线性趋势,然后将其从样本内数据中删除,然后对看不见的数据使用相同的线性模型以相同的方式对其进行去趋势化。

显然,当我估计傅立叶系数时,我得到的向量等于样本内数据的长度。样本外数据包含的观测值要少得多,因此直接应用它们是不可能的。

使用这种技术可以进行这种分析,还是我走上了死胡同?我应该如何使用上面示例中的代码来解决这个问题?

4

1 回答 1

0

你想做的当然是可能的,你在正确的轨道上,但你似乎误解了例子中的几点。首先,在示例中显示,该技术相当于时域中的线性回归,利用 FFT 在频域中执行具有相同效果的操作。其次,去除的趋势不是线性的,它等于正弦曲线的总和,这就是为什么FFT用相对整齐的方式识别特定频率分量的原因。

在您的情况下,您似乎对残差感兴趣。因此,最初的方法是按照以下示例进行:

(1) 通过去除 DC 分量(时域数据的平均值)执行粗略的“去趋势”

(2) FFT检查数据,选择包含大部分信号的频道。

然后,您可以使用这些通道在时域中生成趋势并从原始数据中减去该趋势以获得残差。但是,您无需继续使用IFFT。相反,您可以明确地对余弦和正弦分量求和。您以类似于示例最后一步的方式执行此操作,该步骤解释了如何通过时域回归找到幅度,但替换从 FFT 获得的幅度。

以下代码显示了如何执行此操作:

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。确保您始终如一地定义时间原点。此外,这假设数据是真实的(不复杂),如链接到的示例中所示。您必须检查代码以使其适用于复杂数据。

于 2013-10-10T13:58:52.197 回答