数据预处理常见措施及matlab程序

针对脏乱差的原始数据采取的清洗预处理措施:截断法去除首尾无效数据、数据降采样加速后期特征提取的计算、hample 滤波去除信号数据中存在的骤升尖峰和骤降谷底这类异常值

另外,FFT变换中常见处理还有去均值(去趋势)信号补零

去除首尾无效数据

信号数据的首部有铣削进刀过程导致的信号逐渐变大的数据,相应的图中数据尾部有一段结束铣削退刀造成的逐渐变小的数据,这两段数据为非正常铣削信号数据,因此是需要人工剔除的无效数据。

常用方法:截断法

原理:①求取每次走刀过程首尾部无效数据的临界值:每次走刀原始数据的上四分位值Q。②原始数据的首部从前往后寻找第一个大于等于Q的数据作为进刀结束位置,剔除前面所有小于Q的信号数据;同理,尾部从后往前寻找第一个大于等于Q的数据作为退刀开始位置,剔除后面所有小于Q的数据。

使用函数:

Q=quantile(x,y,z)         % x表示要求的矩阵或者向量;y的取值为表示要求的分位数,如四分之一中位数0.25,四分之三中位数0.75等;z的取值为1或者2,若值为1则表示按列求四分位数,若为2表示按行求四分位数。Q为计算的上四分位值,常用大小为 (1,n).

注:对于向量,Q2=quantile(raw_data,0.75,1)等同于Q3 = prctile(raw_data,75)

举例:

>>  f=[1 2;3 4];
>> quantile(f,0.25,1)

ans =

     1     2

>> quantile(f,0.25,2)

ans =

     1
     3

降采样

在原始采样频率下,若刀具每次走刀采集得来的数据量过于庞大,直接使用容易导致后续计算过于复杂。可以使用降采样的方法来处理数据,加速后期特征提取的计算,同时保证了原始信号每次走刀的数据变化趋势。减少了数据样点,也就是减少运算时间,是在实时处理时常采用的方法。

参考解释

原采样频率为2048HZ,这时信号允许的最高频率是1024HZ(满足尼奎斯特采样定理),但当通过滤波器后使信号的最高频率为16HZ,这时采样频率就可以用到32HZ(满足尼奎斯特采样定理,最低为32HZ,比32HZ高都可以)。从2048HZ降到32HZ,便是每隔64个样本取1个样本。这种把采样频率降下来,就是降采样(downsample)。要注意出现频率混叠的问题,要以一组信号中的最高频率为基准,保证采样频率满足Nyquist定理 。

使用函数:
y = decimate(x,r)        x是样本信号,这里将输入信号x的采样率降低r倍,即在x的数据点中每r个点中,只保留一个点。

对于将采样函数,可参考

(11条消息) matlab采样函数,上采样/下采样,插值/抽取_hi_linda的博客-CSDN博客_matlab 上采样

异常值去除

常见方法:hampel 滤波

原理:①首先过滤寻找信号数据中所有的异常值点。对信号中的每个数据点生成长度固定的滑动窗口,计算窗口段的信号中值,进一步计算每个数据点与此中值偏差的中位数,其中与中位数相差超过两个标准差的离群点即要找的异常值点。②用滑动段的中值取代此段中的异常值

[outX,outPost,xMedian,xSigma] = hampel(x,k,nSigma);

其中,

X:需要进行异常值滤波处理的信号;k:二分之一滑动窗口的长度;nSigma:被归为异常值范围的数据上下界;

outX:hample滤波之后的输出信号;outPost:查找到并经过处理的异常值所在的位置;xMedian:用来替换异常值的滑动窗口的中值;xSigma:每个数据点与观察窗口中值绝对偏差的标准差

如果x是一个矩阵,hampel将x的每一列都看成是独立的通道。

具体可参见:

(10条消息) hampel滤波,去除异常值_LLye^_^的博客-CSDN博客_hampel滤波

原理:

数据清洗之异常值处理的常用方法 - 知乎 (zhihu.com)

去均值(去趋势)

数据去趋势,就是对数据减去一条最优(最小二乘)的拟合直线、平面或曲面,使去趋势后的数据均值为零。可以消除传感器在获取数据时产生的偏移对后期计算产生的影响。从数据中删除趋势可以将分析集中在数据趋势本身的波动上。

y = detrend(x)      % 从 x 的数据中去除最佳直线拟合线
y = detrend(x,n)    % 去除 n 次多项式趋势。n指定为非负整数标量,或指定为 'constant'(等效于 0)或 'linear'(等效于 1)

如果 x 是向量,则 detrend 从 x 的元素中减去趋势。如果 x 是矩阵,则 detrend 分别对每列进行运算,从对应的列中减去每个趋势。

例如,当 n = 0 时,detrend 从 x 中删除均值。当 n = 1 时,detrend 去除线性趋势,这等效于上述语法。当 n = 2 时,detrend 去除二次趋势。

matlab代码

data2=detrend(data,'constant')
Y = fft(data2,N);          % N为信号长度

信号补零

频谱分辨率数值越小,频谱就越精细,分辨率越高,所以,在一个时间里,能采集的点越多越好。
特别是在采样率高的情况下,采样率作为分子,是降低分辨率的一个因素,因此高频采样中,能采集的点越多越好。

在采集点数不足时,有一个方法可以提高频谱分辨率,就是信号补零。注意,这个提高只是视觉上的提高,并没有再物理上有相应的提高。也就是没有的频率成分你补零之后还是没有。

matlab代码 

n=length(data);           % data:信号
N=2^nextpow2(n);

一般如果信号不是2^n的长度,会补零把信号补到2^n的长度,这样是因为2^n长度的傅里叶信号计算会更快更准。 

代码

参见: 

(5条消息) 【“工业大数据预测”系列】——第2篇:异常数据处理_KF_Guan的博客-CSDN博客_大数据处理异常数据

function [pre_data,count1,count2] = CutOut_and_Filter( raw_data )

% *********************************
%         裁剪去除无效数据
% *********************************
data_length = length(raw_data);

Q3 = prctile(raw_data,75);  % 上四分位值

for index = 1:data_length
    if raw_data(index) > Q3
        count_forward = index;
        break
    end
end
for index = 1:data_length
    num = data_length - index;
    if raw_data(num) > Q3
        count_backward = num;
        break
    end
end
data1 = raw_data(count_forward:count_backward);

% *********************************
%       hampel滤波示例代码
% *********************************
[destX,outPos,xMedian,xSigma] = hampel(data1, 10000, 3);

pre_data = destX;
count1 = count_forward;
count2 = count_backward;

end

C1_sample = 315;
C4_sample = 315;
C6_sample = 315;

start_time = clock;

read_Path_C1 = 'C:\Users\Kaifeng Guan\Desktop\My Tool Wear Prediction\dataset\c1\c1\c_1_';
save_Path_C1 = 'C:\Users\Kaifeng Guan\Desktop\My Tool Wear Prediction\Code\new_data\dataset1\c1\c_1_';
for i = 1:C1_sample
    str = num2str(i, "%03d");

    fprintf("Processing C1: %s \n", str);

    read_path = strcat(read_Path_C1, str, ".csv");
    raw_data = csvread(read_path);

    save_path = strcat(save_Path_C1, str);
    mkdir(save_path)
    for j = 1:7
        data1 = raw_data(:, j);
        data2 = CutOut_and_Filter(data1);

        save_path1 = strcat(save_path, "\f", num2str(j), ".csv");
        csvwrite(save_path1, data2)
    end
end

read_Path_C4 = 'C:\Users\Kaifeng Guan\Desktop\My Tool Wear Prediction\dataset\c4\c4\c_4_';
save_Path_C4 = 'C:\Users\Kaifeng Guan\Desktop\My Tool Wear Prediction\Code\new_data\dataset1\c4\c_4_';
for i = 1:C4_sample
    str = num2str(i, "%03d");

    fprintf("Processing C4: %s \n", str);

    read_path = strcat(read_Path_C4, str, ".csv");
    raw_data = csvread(read_path);

    save_path = strcat(save_Path_C4, str);
    mkdir(save_path)
    for j = 1:7
        data1 = raw_data(:, j);
        data2 = CutOut_and_Filter(data1);

        save_path1 = strcat(save_path, "\f", num2str(j), ".csv");
        csvwrite(save_path1, data2)
    end
end

read_Path_C6 = 'C:\Users\Kaifeng Guan\Desktop\My Tool Wear Prediction\dataset\c6\c6\c_6_';
save_Path_C6 = 'C:\Users\Kaifeng Guan\Desktop\My Tool Wear Prediction\Code\new_data\dataset1\c6\c_6_';
for i = 1:C6_sample
    str = num2str(i, "%03d");

    fprintf("Processing C6: %s \n", str);

    read_path = strcat(read_Path_C6, str, ".csv");
    raw_data = csvread(read_path);

    save_path = strcat(save_Path_C6, str);
    mkdir(save_path)
    for j = 1:7
        data1 = raw_data(:, j);
        data2 = CutOut_and_Filter(data1);

        save_path1 = strcat(save_path, "\f", num2str(j), ".csv");
        csvwrite(save_path1, data2)
    end
end

end_time = clock;
etime(end_time, start_time)

参考:数据驱动的刀具磨损状态识别和剩余寿命预测_王文姬

频谱分析-FFT之后的那些事情_尘中远的博客-CSDN博客_做fft变换后0频非常大

你可能感兴趣的:(算法,big,data)