赞
踩
经过我的大量搜索,简单总结了一下对于时序信号频域特征提取的手段。
首先是对于时域信号进行快速傅里叶变换,使其能够生成频域信号。
频域信号相对于时域信号来说,信号变化更加明晰,便于分析观察。
计算频域特征我见到两类,你们自己选择需要提取哪种参数。
整理不易,觉得有帮助点个赞呀,靓仔,有什么问题我们可以一起探讨。
- 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
以上代码为大致轮廓,具体细节可自行了解。
希望有了解的朋友可以评论区共同交流一下,哈哈哈。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。