当前位置:   article > 正文

matlab时域频域信号特征提取资料整合_matlab数据特征提取

matlab数据特征提取

1 前言

最近在做一个项目,需要将声纳信号中的特征都提取出来进行分析。资料查到头秃终于整合出来了些东西,记录一下。

由于不是专业人员,如果发现任何错误请不要大意的附在评论区,我会及时修改,谢谢!

2 思路

思路这段引用自知乎大佬aresmiki的回答,我觉得OK。

1、首先,在特征提取之前需楼主明确是怎样的信号,怎样的应用,怎样的场景,因为针对不同应用和场景选择的特征提取也不近相同。

2、信号特征的提取往往都是用最简单有效的参数表示信号中的信息,这是根本目的。

3、针对不同后端模型需要确定特征维度。

4、开始特征提取前,信号往往需要做一些预处理,如滤波、去均值、去异常等等。

特征提取有哪些方法:

1、拿到时间域一维信号,简单统计和运算可以得到的特征有:均值,方差,均方根,峰值因子,峭度系数,波形因子,裕度因子、脉冲因子

2、估计--分布参数一般服从某一类分布;

3、频域,特征频率,均方频率,重心频率,频率方差

4、小波方法提取的系数,小波滤波后的特征频率等等;

5、信号,谱熵,排列熵,小波熵,EMD熵,包络谱熵等;

6、谱峭度,快速谱峭度、小波谱峭度等;

7、基于数学工具和降维的特征,如PCA,矩阵特征向量,矩阵的秩,特征根,SVD-奇异值、ICA等等;

8、一些基于距离的度量、范数、马氏距离、分形参数,同胚流行等等;

9、任何能表征信号特征的自定义参数均可以,注意有意义有时是结合实际需求的。

3 预处理

matlab的波形预处理还是很人性化的,具体说来“Signal Analyzer”工具箱好像就够用了,至于其他的工具箱大家也可以看看。

这个工具箱在matlab顶上点选【APP】之后能找到,它的教程在官网上也很清楚了,传送门附上:点我传送

这个网站里关于“Signal Analyzer”工具箱的使用教程在【使用Signal Analyzer App】超链接下。其他超链接里的内容也可以逛逛,说不定对你有些启发。

下面的代码可以参考:

  1. %% 初始化
  2. clear
  3. clc
  4. %% 读取文件
  5. [sonar,fs] = audioread('test.wav'); %采样频率
  6. %% 滤波处理
  7. sonar = sonar - mean(sonar); %去直流分量
  8. sonar = lowpass(sonar,0.5,'Steepness',0.85,'StopbandAttenuation',60); %低通滤波
  9. sonar = highpass(sonar,0.5,'Steepness',0.85,'StopbandAttenuation',60); %高通滤波

4 时域特征提取

  1. %% 数据特征提取
  2. [nframes,nchannels] = size(sonar); %采样点数与声道数
  3. time = nframes / fs; %采样时间 = 采样总点数 / 每秒采样点数
  4. %% 双声道时域信息提取
  5. max_data = max(sonar); %最大值
  6. min_data = min(sonar); %最小值
  7. median_data = median(sonar); %中位数
  8. mean_data = mean(sonar); %平均值
  9. pk_data = max_data - min_data; %峰差
  10. avg_data = mean(abs(sonar)); %整流平均值_绝对值的平均值
  11. var_data = var(sonar); %方差
  12. sd_data = std(sonar); %标准差
  13. ku_data = kurtosis(sonar); %峭度
  14. sk_data = skewness(sonar); %偏度
  15. rm_data = rms(sonar); %均方根
  16. %% 左声道时域
  17. l_max = max_data(1);
  18. l_min = min_data(1);
  19. l_median = median_data(1);
  20. l_mean = mean_data(1);
  21. l_pk = pk_data(1);
  22. l_avg = avg_data(1);
  23. l_var = var_data(1);
  24. l_sd = sd_data(1);
  25. l_ku = ku_data(1);
  26. l_sk = sk_data(1);
  27. l_rm = rm_data(1);
  28. l_S = l_rm / l_avg; %均方根因子
  29. l_C = l_pk / l_rm; %峰值因子
  30. l_I = l_pk / l_avg; %脉冲因子
  31. l_xr = mean(sqrt(abs(sonar(1))))^2;
  32. l_L = l_pk/ l_xr; %裕度因子
  33. %% 右声道频域
  34. r_max = max_data(2);
  35. r_min = min_data(2);
  36. r_median = median_data(2);
  37. r_mean = mean_data(2);
  38. r_pk = pk_data(2);
  39. r_avg = avg_data(2);
  40. r_var = var_data(2);
  41. r_sd = sd_data(2);
  42. r_ku = ku_data(2);
  43. r_sk = sk_data(2);
  44. r_rm = rm_data(2);
  45. r_S = r_rm / r_avg; %均方根因子
  46. r_C = r_pk / r_rm; %峰值因子
  47. r_I = r_pk / r_avg; %脉冲因子
  48. r_xr = mean(sqrt(abs(sonar(2))))^2;
  49. r_L = r_pk/ r_xr; %裕度因子

5 频域特征提取

这块写的我也没啥自信了,毕竟是根据网上东拼西凑的资料写出来的。

  1. %% 双声道频域信息提取
  2. [fft_sonar,f_range] = positiveFFT(sonar,fs);
  3. N = length(fft_sonar); %fft采样点数
  4. subplot(5,2,5);
  5. fft_amp = abs(fft_sonar); %振幅(幅频特性)
  6. stem(f_range,fft_amp); %x-正频率;y-振幅
  7. title('频域声纳波形');
  8. fft_phase = angle(fft_sonar); %相频特性
  9. subplot(5,2,6);
  10. plot(f_range,fft_phase);
  11. title('相频特性图')
  12. amp_max = max(fft_amp); %振幅最大值
  13. amp_min = min(fft_amp); %振幅最小值
  14. amp_median = median(fft_amp); %振幅中位数
  15. amp_mean = mean(fft_amp); %振幅平均值
  16. amp_pk = amp_max - amp_min; %振幅峰差
  17. amp_mph = amp_pk * 0.75; %振幅峰值阈值,阈值为75%的振幅峰差
  18. %[amp_pkfs,amp_pks] = findpeaks(fft_amp,'minpeakheight',amp_mph);
  19. %amp_pkfs = amp_pkfs / N * fs/2;
  20. amp_pks = []; %振幅峰值
  21. amp_pkfs = []; %振幅峰值对应的频率
  22. for i = 1:N
  23. if amp_mph < fft_amp(i)
  24. amp_pks = [amp_pks,fft_amp(i)];
  25. amp_pkfs = [amp_pkfs,i / N * fs / 2];
  26. end
  27. end
  28. avg_fs = fs*[1:N] / N;
  29. avg_fft = 2 * fft_amp / N;
  30. amp_fc = sum(avg_fs .* avg_fft) / sum(avg_fft); %重心频率
  31. amp_msf = sum(avg_fs.^2 .* avg_fft) / sum(avg_fft); %均方频率
  32. amp_rmsf = sqrt(amp_msf); %均方根频率
  33. amp_vf = sum((avg_fs - amp_fc).^2 .* avg_fft) / sum(avg_fft); %频率方差
  34. amp_rvf = sqrt(amp_vf); %频率标准差

6 功率谱

  1. %% 双声道功率谱信息提取
  2. power = abs(fft_sonar).^2 / N; %功率 = 傅里叶变换^2 / 区间长度,fft的幂
  3. subplot(5,2,7);
  4. plot(f_range,power);
  5. title('功率谱');
  6. power_y = 10*log10(power); %放大低频
  7. power_y(1) = mean(power_y); %去除直流影响
  8. subplot(5,2,8);
  9. plot(f_range,power_y);
  10. title('放大低频的功率谱');
  11. power_max = max(power); %功率最大值
  12. power_min = min(power); %功率最小值
  13. power_median = median(power); %功率中位数
  14. power_mean = mean(power); %功率平均值
  15. power_snr = 10*log10(power_max / (sum(power) - power_max)); %信噪比
  16. power_obw = obw(sonar,fs); %占用带宽

7 倒谱

  1. %% 双声道倒频谱信息提取
  2. cepstrum = real(ifft(log(abs(fft(sonar(:,1))))));
  3. during_time = 1/fs:1/fs:time;
  4. subplot(5,2,9);
  5. plot(during_time,cepstrum,'color',[29/255 176/255 184/255]);ylim([0 0.01]);
  6. title('左声道倒频谱');
  7. cepstrum = real(ifft(log(abs(fft(sonar(:,2))))));
  8. during_time = 1/fs:1/fs:time;
  9. subplot(5,2,10);
  10. plot(during_time,cepstrum,'color',[86/255 163/255 108/255]);ylim([0 0.01]);
  11. title('右声道倒频谱');

 

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

闽ICP备14008679号