你想做的当然是可能的,你在正确的轨道上,但你似乎误解了例子中的几点。首先,在示例中显示,该技术相当于时域中的线性回归,利用 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
。确保您始终如一地定义时间原点。此外,这假设数据是真实的(不复杂),如链接到的示例中所示。您必须检查代码以使其适用于复杂数据。