针对脏乱差的原始数据采取的清洗预处理措施:截断法去除首尾无效数据、数据降采样加速后期特征提取的计算、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频非常大