2

我有一个受电尖峰影响的加速度数据集。

我正在寻找一种过滤或减少这些尖峰的好方法,因为需要根据这些数据计算 FFT 的滚动窗口和其他统计指标,如峰度和偏度。我不能简单地删除这些异常值或用 NaN 替换它们。采样 2000[hz]

到目前为止,我已经尝试过 MATLAB 2012b:

  • 小波去噪(Haar 小波)
  • 中值滤波器
  • Despike 和迭代方法

你能建议一种处理这些数据的适当方法吗?

下载示例数据集

4

5 回答 5

2

我会建议一些局部平滑。通过定义阈值和平均所有低于和高于的值。

Af = data.example1;
% Thresholds
Tl = -0.6;
To = 0.6;

peaks = find( Af < Tl | Af > To);
Af(peaks) = ( Af(peaks-1) + Af(peaks+1) ) / 2;

这种方法的问题是您的大纲有时最多包含 6 个样本。因此,您需要使用 while 循环在多个步骤中进行平滑处理:

Af = data.example1;
% Thresholds
Tl = -0.6;
To = 0.6;

% initialisation
peaks = find( Af < Tl | Af > To);
counter = 0;

while ~isempty(peaks)
    peaks = find( Af < Tl | Af > To);
    Af(peaks) = ( Af(peaks-1) + Af(peaks+1) ) / 2;
    counter=counter+1;
end

经过 6 次迭代后,您将得到以下结果: 在此处输入图像描述

于 2013-10-03T13:14:03.400 回答
1

我已经使用了despiking来自 matlab 中央文件交换的文件,对于类似的问题效果非常好,尽管我看到你也尝试过。

我采用的另一种方法是将尖峰视为统计异常值,并使用此函数删除它们,该函数使用Rosner 的许多异常值测试。(NIST 站点因明显原因而关闭,因此这里是Google 缓存版本)

编辑补充:我错了。我的去尖算法不是来自我上面链接的文件交换功能。它实际上是从期刊文章中提取的(代码在论文的补充信息中列出,但他们没有将代码发布到文件交换中)。论文是:

去除噪声的实用方法:尖峰、非平稳准周期噪声和基线漂移的应用

Delphine Feuerstein、Kim H. Parker 和 Martyn G. Boutelle

肛门。化学,2009 年,81 (12),第 4987–4994 页

由于版权归美国化学学会和作者所有,我这里不能复制代码,但是如果你有大学图书馆的账号,你可以下载一份。如果你不这样做,我留下了文件交换版本的链接,但我没有使用它,所以我不能保证它的有效性。

于 2013-10-03T16:24:46.467 回答
1

版主将这个问题与这个问题合并——这就是为什么这里看起来有点乱。该答案考虑了第二个问题中的其他问题!

以下不是一个完全干净的解决方案,代码是从我以前的答案中采用的,但是我为您的情况添加了一个例外,因此您无需手动删除数据开头和/或结尾的值。它只丢弃这些不应该引起问题的无效值。

Af = csvread(strcat('example_data_with_peak.txt'),5,0); 

% Thresholds
Tl = -0.04;
To = 0.04;

% initialisation
peaks = find( Af < Tl | Af > To);
counter = 0;

while ~isempty(peaks)
    peaks = find( Af < Tl | Af > To);
    try
        Af(peaks) = ( Af(peaks-1) + Af(peaks+1) ) / 2;
    catch
        if peaks(1) == 1
            Af(1) = 0;
        else
            Af(end) = 0;
        end
    end   
    counter=counter+1;
end

figure(2);
plot(Af)

在此处输入图像描述

为了确定阈值,您可以使用这样的方法,但它也很暴力:

thresh = 15*mean(abs(findpeaks(Af)));
于 2013-12-17T15:12:19.823 回答
0

对于其他可能需要这个的人,这就是我最终使用的。这是数据文件数据文件链接

感谢@thewaywewalk

Matlab 过滤加速度数据中的电子尖峰

clear all, clc,clf,tic
aa=csvread(strcat('/tmp/example_data_with_peak.txt'),5,0); %will skip the first 5 rows that are text and zeros
figure(1);
plot(aa)
Af=aa;
% Thresholds
Tl = -mean(abs(aa))*10
To =mean(abs(aa))*10

% initialisation
[peaks_r,peaks_c] = find( Af < Tl | Af > To);
peaks = find( Af < Tl | Af > To);

counter = 0;

while ~isempty(peaks)
    peaks = find( Af < Tl | Af > To);
    try
        Af(peaks) = ( Af(peaks-1) + Af(peaks+1) ) / 2;
    catch
        if peaks(1) == 1
            Af(1) = 0;
        else
            Af(end) = 0;
        end
    end   
    counter=counter+1;
end
counter
figure(2);
plot(Af)

这是之前和之后的图像。

之前和之后

于 2013-12-17T16:57:36.120 回答
0

我发现对于单点尖峰的特定问题(当宇宙射线在曝光期间释放单个 CCD 单元时,CCD 探测器中会出现这种问题),以下算法非常有效:

  N=length(y);
  for i=[3:1:N-2]
    # calculate the means of two nearest neighbours, and two next-nearest neighbours
    y1=(y(i-1)+y(i+1))/2;
    y2=(y(i-2)+y(i+2))/2;
    # if those two means are close, but the current point is far off, it's a spike
    if ( abs(y2-y(i)) > cutoff && abs(y1-y2) < cutoff)
       z(i)=y2;
    endif
  endfor

为良好的截止选择选择最佳策略是一个单独的问题。我倾向于根据 CCD 中的典型暗计数将其设置为固定值。人们还可以对“接近”和“远离”使用单独的级别,如下所示:

    if ( abs(y2-y(i)) > cutoff_far && abs(y1-y2) < cutoff_close )

还可以选择不同的标准,例如两个平均值之间的差异比尖峰数据的差异小 X 倍:

    if ( abs(y2-y(i)) > 10*abs(y1-y2) )

比单点尖峰更宽的峰在此过程中不受干扰。

使用 CCD 检测器的去尖峰拉曼光谱示例

于 2019-12-09T23:57:21.843 回答