使用 fft 进行时间序列处理

信息处理 matlab fft
2022-01-28 12:27:09

我有一组真实数据(时间戳和值),样本之间的步长不稳定(5 秒、30 秒等)。数据是车辆油箱随时间的填充百分比。

由于数据的剧烈波动,我需要执行 fft 将我的时间序列转移到频域,选择一个截止点以去除所有噪声,然后再转移回时域。

我的思维过程正确吗?

我想使用 matlab,但我无法弄清楚我与我的数据有什么关系。前 10 行(我有一个包含千分之一数据的文档)如下:

前 10 行

我已经生成了一些具有相同值且时间步长为 0.01 秒的虚拟时间戳数据。在matlab中编写代码后,我得到以下信息:

初始数据

fft 之后

我的代码是:

load input.txt;
plot(input);
figure;
Fs = 1/0.01;
Ts = 1/Fs;
dt = 0:Ts:5-Ts;
x = input(:,1);
y = input(:,2);
nfft = length(y);
nfft2 = 2*nextpow2(nfft);
ff = fft(y,nfft2);
fff = ff(1:nfft2/2);ff
plot(abs(fff));

如果您需要一些数据,请随时与我联系。先感谢您!

2个回答

我的思维过程正确吗?

不。频域滤波很困难,即使你做对了,我也真诚地怀疑低通滤波能否解决你的问题

您的数据非常嘈杂。我看起来有两个噪声源:一个具有大约 20 的“量化”步长加上一些较小的噪声叠加。没有进一步的分析很难说。

你还没有告诉我们,你真正想从分析中得到什么,所以很难给出建议。低通滤波会抹掉你的“加油”瞬变。我猜,你最好的办法是建立一个参数模型并进行分段最小二乘误差拟合,但同样,你需要告诉我们你真正想要实现的目标。

由于数据的剧烈波动,我需要执行 fft 将我的时间序列转移到频域,选择一个截止点以去除所有噪声,然后再转移回时域。

我的思维过程正确吗?

你想做正确的事,但你接近它的方式并不好:FFT'ing 数据然后切断东西会导致不良伪影:为什么通过清零 FFT 箱进行过滤是个坏主意?

您只想过滤(您可以在时域中轻松地做到这一点,成千上万的样本实际上根本没有多少数据)。但是,为了能够进行过滤,通常最好将您的数据插入到一个新的、均匀采样的时基中。

然而,这是我经常通过 FFT 和归零点做的事情;基本上:

  1. 您的时间步长分辨率似乎是 1s。因此,首先分配一个足够大的数组以供您以秒为单位的观察时间,再加上至少2·(1/截止频率)作为结尾或开头的“缓冲区”;完全归零。
  2. 填写您在该数组中实际观察到的时间的值
  3. 现在,对整个数组进行 FFT(不,它的长度不必是 2 的幂)(看到您的数据可能是实值的,您想要一个实数到复数的 FFT)
  4. 大量零和样本之间的“突然”变化导致高频分量;通过使用相同长度和适当形状的窗口向量进行逐点乘法来抑制它们确实会抑制它们。该窗口应该是实值且对称的(对称意味着它与 0 频率对称,这取决于您的 FFT 如何移动,其峰值位于第零个 bin 和最后一个 bin 处)。
  5. 做逆FFT回到时域
  6. 切断您在步骤 1 中添加的填充。