用于在MATLAB中对数据进行去生化的快速傅里叶变换

时间:2013-10-10 01:41:03

标签: matlab preprocessor filtering signal-processing fft

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

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

显然,当我估计傅立叶系数时,我得到的向量等于样本内数据的长度。样本外数据由更少的观察结果组成,因此不可能直接应用它们。

这种分析是否可以使用这种技术,还是我走在死路?我应该如何使用上面示例中的代码来处理它?<​​/ p>

1 个答案:

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