当前位置:   article > 正文

信号频域特征提取 Matlab_matlab频域特征提取

matlab频域特征提取

经过我的大量搜索,简单总结了一下对于时序信号频域特征提取的手段。

首先是对于时域信号进行快速傅里叶变换,使其能够生成频域信号。

频域信号相对于时域信号来说,信号变化更加明晰,便于分析观察。

计算频域特征我见到两类,你们自己选择需要提取哪种参数。

整理不易,觉得有帮助点个赞呀,靓仔,有什么问题我们可以一起探讨。

一、获取频域信号后计算对应的数学统计特征,代码如下:

  1. load('Data.mat') %所有样本,二维矩阵,时域样本
  2. %每列表示:单个样本的采样长度,单个样本采集时长为2.5 s,采样频率为Fs =20 kHz
  3. %所以单个样本的采样长度为2.5*20k =50000
  4. %第一列为第1个样本-状态1,第二列为第2个样本-状态2
  5. features = table; %特征表
  6. sample_number = NUM; %sample_number为样本个数
  7. sample_length = 1:1:210000; %sample_length为单个样本的采样长度
  8. Fs = 50000; %采样频率Fs=20 KHz
  9. t = (1:1:210000)/Fs; %采样时间t=2.5s
  10. b = (1:210000); %实际区间
  11. P1_length = 105000;% 频域长度。为时域下的1/2;长度需要为偶数
  12. frequency_samples= zeros(sample_number,P1_length);%把每个样本samples2都从时域通过傅里叶变换到频域
  13. %frequency_samples为所有样本的频域数据幅值,同样为矩阵
  14. %列数为P1_length,行大小即为样本个数
  15. figure(1)
  16. subplot(211)
  17. plot(t(b),ZD6(1,b))
  18. xlabel('时间/s')
  19. ylabel('时域幅值/A')
  20. title('第1个样本-状态1') %第1个样本-状态1的波形
  21. subplot(212)
  22. plot(t(b),ZD6(2,b))
  23. xlabel('时间/s')
  24. ylabel('时域幅值/A')
  25. title('第2个样本-状态2') %第2个样本-状态2的波形
  26. Fs = 50000;
  27. x = ZD6(1,b);
  28. L = length(x);
  29. y = fft(x);
  30. f = (0:L-1)*Fs/L;
  31. y = y/L;
  32. figure(2)
  33. subplot(411)
  34. plot(t(b),ZD6(1,b))
  35. xlabel('时间/s')
  36. ylabel('时域幅值/A')
  37. title('第1个样本-状态1')
  38. subplot(412)
  39. plot(f,abs(y))
  40. fshift = (-L/2:L/2-1)*Fs/L;
  41. yshift = fftshift(y);
  42. subplot(413)
  43. plot(fshift,abs(yshift))
  44. P2 = abs(fft(x)/L);
  45. P1 = P2(1:L/2);
  46. P1(2:end-1) = 2*P1(2:end-1);
  47. fnew = (0:(L/2-1))*Fs/L;
  48. subplot(414)
  49. plot(fnew,P1)
  50. figure(3)
  51. plot(fnew,P1)
  52. xlim([0 100])
  53. ylabel('频域幅值','FontSize',25)
  54. xlabel('频率/Hz','FontSize',25)
  55. % title('第1个样本-状态1')
  56. for i=1:NUM %把时域每个样本都从时域通过傅里叶变换到频域
  57. Fs = 50000;
  58. x = ZD6(i,b);
  59. L = length(x);
  60. y = fft(x);
  61. f = (0:L-1)*Fs/L;
  62. y = y/L;
  63. fshift = (-L/2:L/2-1)*Fs/L;
  64. yshift = fftshift(y);
  65. P2 = abs(fft(x)/L);
  66. P1 = P2(1:L/2);
  67. P1(2:end-1) = 2*P1(2:end-1);
  68. fnew = (0:(L/2-1))*Fs/L;
  69. frequency_samples(i,:)= P1; %P1为向量,其长度为P1_length
  70. %frequency_samples为所有样本的频域数据幅值,同样为矩阵
  71. %行数为P1_length,列大小即为样本个数
  72. end
  73. for i=1:NUM
  74. v = frequency_samples(i,:);
  75. %频域相关特征
  76. features.Mean = mean(v); %平均值
  77. features.Std = std(v); %标准差
  78. features.Skewness = skewness(v); %偏度
  79. features.Kurtosis = kurtosis(v); %峭度
  80. features.max = max(v); %最大值
  81. features.min = min(v); %最小值
  82. features.Peak2Peak = peak2peak(v); %峰峰值
  83. features.RMS = rms(v); %均方根
  84. features.CrestFactor = max(v)/rms(v); %振幅因数
  85. features.ShapeFactor = rms(v)/mean(abs(v)); %波形因数
  86. features.ImpulseFactor = max(v)/mean(abs(v)); %冲击因数
  87. features.MarginFactor = max(v)/mean(abs(v))^2; %裕度因数
  88. features.Energy = sum(v.^2); %能量
  89. end

二、提取频域的 重心频率均方频率频率方差

下列特征是基于功率谱求解,功率谱内容在我另外博客中有详细介绍

  1. for i=1:num
  2. data1=ZD6(i,:);
  3. % 傅里叶变化获得频谱
  4. [f,result_FFt]=transToFFT(data1,50000);
  5. % 计算频域特征
  6. F1=fc(f,result_FFt); %重心频率
  7. F2=msf(f,result_FFt); %均方频率
  8. F3=vf(f,result_FFt); %频率方差
  9. F4=BandEnergy(f,result_FFt); % 计算350-700Hz频带能量
  10. F5=RPSD(result_FFt); % 相对功率谱熵
  11. T(i,:)=[F1 F2 F3 F4 F5];
  12. end

以上代码为大致轮廓,具体细节可自行了解。

希望有了解的朋友可以评论区共同交流一下,哈哈哈。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/326731
推荐阅读
相关标签
  

闽ICP备14008679号