Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab滤波加速度测量数据中的电尖峰_Matlab_Filter_Noise - Fatal编程技术网

Matlab滤波加速度测量数据中的电尖峰

Matlab滤波加速度测量数据中的电尖峰,matlab,filter,noise,Matlab,Filter,Noise,我有一个受电尖峰影响的加速度数据集 我正在寻找一种很好的方法来过滤或减少这些峰值,因为需要在这些数据上计算FFT的滚动窗口和其他统计指标,如峰度和偏度。我不能简单地删除这些异常值或用NaN替换它们。 采样2000[hz] 到目前为止,我已经在MATLAB 2012b上进行了尝试: 小波去噪(Haar小波) 中值滤波器 轻视和教化方法 你能建议一个适当的方法来处理这些数据吗 我建议进行一些局部平滑处理。通过定义阈值并平均所有低于和高于的值 Af = data.example1; % Thres

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

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

到目前为止,我已经在MATLAB 2012b上进行了尝试:

  • 小波去噪(Haar小波)
  • 中值滤波器
  • 轻视和教化方法
你能建议一个适当的方法来处理这些数据吗


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

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;
Af=data.example1;
%阈值
Tl=-0.6;
To=0.6;
峰值=查找(AfTo);
Af(峰)=(Af(峰-1)+Af(峰+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
Af=data.example1;
%阈值
Tl=-0.6;
To=0.6;
%初始化
峰值=查找(AfTo);
计数器=0;
而~是空的(峰值)
峰值=查找(AfTo);
Af(峰)=(Af(峰-1)+Af(峰+1))/2;
计数器=计数器+1;
结束
经过6次迭代后,您会得到以下结果:
我建议进行一些局部平滑处理。通过定义阈值并平均所有低于和高于的值

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;
Af=data.example1;
%阈值
Tl=-0.6;
To=0.6;
峰值=查找(AfTo);
Af(峰)=(Af(峰-1)+Af(峰+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
Af=data.example1;
%阈值
Tl=-0.6;
To=0.6;
%初始化
峰值=查找(AfTo);
计数器=0;
而~是空的(峰值)
峰值=查找(AfTo);
Af(峰)=(Af(峰-1)+Af(峰+1))/2;
计数器=计数器+1;
结束
经过6次迭代后,您会得到以下结果:

我使用了matlab中心文件交换中的文件,对类似问题有很好的效果,尽管我看到您也尝试过

我采取的另一种方法是将峰值视为统计异常值,并使用which-use删除它们。(NIST网站因显而易见的原因关闭,因此以下是版本)

编辑后添加:我错了。我的鄙视算法不是来自我上面链接的文件交换函数。它实际上是从一篇期刊文章中提取出来的(代码列在论文的补充信息中,但他们没有将代码发布到文件交换中)。该文件是:

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

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

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

我使用了matlab中心文件交换中的文件,对于类似的问题效果非常好,尽管我看到您也尝试过

我采取的另一种方法是将峰值视为统计异常值,并使用which-use删除它们。(NIST网站因显而易见的原因关闭,因此以下是版本)

编辑后添加:我错了。我的鄙视算法不是来自我上面链接的文件交换函数。它实际上是从一篇期刊文章中提取出来的(代码列在论文的补充信息中,但他们没有将代码发布到文件交换中)。该文件是:

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

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


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

一位主持人将这个问题与-这就是为什么这里看起来有点混乱的原因。这个答案考虑了第二个问题中的其他问题

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

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)

一位主持人将这个问题与-这就是为什么这里看起来有点混乱。这个答案考虑了第二个问题中的其他问题

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

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)

对于其他可能需要这个的人,这里是我最后使用的。这是数据文件

感谢@thewaywewalk

全部清除、clc、clf、tic
aa=csvread(strcat('/tmp/example_data_with_peak.txt'),5,0);%将跳过前5行文字和零
图(1);
地块(aa)
Af=aa;
%阈值
Tl=-平均值(绝对值(aa))*10
To=平均值(绝对值(aa))*10
%初始化
[peaks_r,peaks_c]=查找(AfTo);
峰值=查找(AfTo);
计数器=0;
而~是空的(峰值)
峰值=查找(AfTo);
尝试
Af(峰)=(Af(峰-1)+Af(峰+1))/2;
抓住
如果峰值(1)
    if ( abs(y2-y(i)) > cutoff_far && abs(y1-y2) < cutoff_close )
    if ( abs(y2-y(i)) > 10*abs(y1-y2) )