经过我的大量搜索,简单总结了一下对于时序信号频域特征提取的手段。
首先是对于时域信号进行快速傅里叶变换,使其能够生成频域信号。
频域信号相对于时域信号来说,信号变化更加明晰,便于分析观察。
计算频域特征我见到两类,你们自己选择需要提取哪种参数。
一、获取频域信号后计算对应的数学统计特征,代码如下:
load('Data.mat') %所有样本,二维矩阵,时域样本
%每列表示:单个样本的采样长度,单个样本采集时长为2.5 s,采样频率为Fs =20 kHz
%所以单个样本的采样长度为2.5*20k =50000
%第一列为第1个样本-状态1,第二列为第2个样本-状态2
features = table; %特征表
sample_number = NUM; %sample_number为样本个数
sample_length = 1:1:210000; %sample_length为单个样本的采样长度
Fs = 50000; %采样频率Fs=20 KHz
t = (1:1:210000)/Fs; %采样时间t=2.5s
b = (1:210000); %实际区间
P1_length = 105000;% 频域长度。为时域下的1/2;长度需要为偶数
frequency_samples= zeros(sample_number,P1_length);%把每个样本samples2都从时域通过傅里叶变换到频域
%frequency_samples为所有样本的频域数据幅值,同样为矩阵
%列数为P1_length,行大小即为样本个数
figure(1)
subplot(211)
plot(t(b),ZD6(1,b))
xlabel('时间/s')
ylabel('时域幅值/A')
title('第1个样本-状态1') %第1个样本-状态1的波形
subplot(212)
plot(t(b),ZD6(2,b))
xlabel('时间/s')
ylabel('时域幅值/A')
title('第2个样本-状态2') %第2个样本-状态2的波形
Fs = 50000;
x = ZD6(1,b);
L = length(x);
y = fft(x);
f = (0:L-1)*Fs/L;
y = y/L;
figure(2)
subplot(411)
plot(t(b),ZD6(1,b))
xlabel('时间/s')
ylabel('时域幅值/A')
title('第1个样本-状态1')
subplot(412)
plot(f,abs(y))
fshift = (-L/2:L/2-1)*Fs/L;
yshift = fftshift(y);
subplot(413)
plot(fshift,abs(yshift))
P2 = abs(fft(x)/L);
P1 = P2(1:L/2);
P1(2:end-1) = 2*P1(2:end-1);
fnew = (0:(L/2-1))*Fs/L;
subplot(414)
plot(fnew,P1)
figure(3)
plot(fnew,P1)
xlim([0 100])
ylabel('频域幅值','FontSize',25)
xlabel('频率/Hz','FontSize',25)
% title('第1个样本-状态1')
for i=1:NUM %把时域每个样本都从时域通过傅里叶变换到频域
Fs = 50000;
x = ZD6(i,b);
L = length(x);
y = fft(x);
f = (0:L-1)*Fs/L;
y = y/L;
fshift = (-L/2:L/2-1)*Fs/L;
yshift = fftshift(y);
P2 = abs(fft(x)/L);
P1 = P2(1:L/2);
P1(2:end-1) = 2*P1(2:end-1);
fnew = (0:(L/2-1))*Fs/L;
frequency_samples(i,:)= P1; %P1为向量,其长度为P1_length
%frequency_samples为所有样本的频域数据幅值,同样为矩阵
%行数为P1_length,列大小即为样本个数
end
for i=1:NUM
v = frequency_samples(i,:);
%频域相关特征
features.Mean = mean(v); %平均值
features.Std = std(v); %标准差
features.Skewness = skewness(v); %偏度
features.Kurtosis = kurtosis(v); %峭度
features.max = max(v); %最大值
features.min = min(v); %最小值
features.Peak2Peak = peak2peak(v); %峰峰值
features.RMS = rms(v); %均方根
features.CrestFactor = max(v)/rms(v); %振幅因数
features.ShapeFactor = rms(v)/mean(abs(v)); %波形因数
features.ImpulseFactor = max(v)/mean(abs(v)); %冲击因数
features.MarginFactor = max(v)/mean(abs(v))^2; %裕度因数
features.Energy = sum(v.^2); %能量
end
二、提取频域的 重心频率、均方频率、频率方差,代码如下:
for i=1:num
data1=ZD6(i,:);
% 傅里叶变化获得频谱
[f,result_FFt]=transToFFT(data1,50000);
% 计算频域特征
F1=fc(f,result_FFt); %重心频率
F2=msf(f,result_FFt); %均方频率
F3=vf(f,result_FFt); %频率方差
F4=BandEnergy(f,result_FFt); % 计算350-700Hz频带能量
F5=RPSD(result_FFt); % 相对功率谱熵
T(i,:)=[F1 F2 F3 F4 F5];
end
以上代码为大致轮廓,具体细节可自行了解。
我也是刚接触,也想问一下,这两类特征参数,有什么差别么,哪个更为有效呢?希望有了解的朋友可以共同交流一下,哈哈哈。