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】超鏈接下。其他超鏈接裏的內容也可以逛逛,說不定對你有些啓發。

下面的代碼可以參考:

%%  初始化
clear
clc

%%  讀取文件
[sonar,fs] = audioread('test.wav');    %採樣頻率

%%  濾波處理
sonar = sonar - mean(sonar);    %去直流分量
sonar = lowpass(sonar,0.5,'Steepness',0.85,'StopbandAttenuation',60);       %低通濾波
sonar = highpass(sonar,0.5,'Steepness',0.85,'StopbandAttenuation',60);      %高通濾波

4 時域特徵提取

%%  數據特徵提取
[nframes,nchannels] = size(sonar);  %採樣點數與聲道數
time = nframes / fs;   %採樣時間 = 採樣總點數 / 每秒採樣點數

%%  雙聲道時域信息提取
max_data = max(sonar);   %最大值
min_data = min(sonar);   %最小值
median_data = median(sonar);    %中位數
mean_data = mean(sonar);     %平均值
pk_data = max_data - min_data;     %峯差
avg_data = mean(abs(sonar));     %整流平均值_絕對值的平均值
var_data = var(sonar);      %方差
sd_data = std(sonar);    %標準差
ku_data = kurtosis(sonar);      %峭度
sk_data = skewness(sonar);      %偏度
rm_data = rms(sonar);       %均方根

%%  左聲道時域
l_max = max_data(1);
l_min = min_data(1);
l_median = median_data(1);
l_mean = mean_data(1);
l_pk = pk_data(1);
l_avg = avg_data(1);
l_var = var_data(1);
l_sd = sd_data(1);
l_ku = ku_data(1);
l_sk = sk_data(1);
l_rm = rm_data(1);
l_S = l_rm / l_avg;    %均方根因子
l_C = l_pk / l_rm;     %峯值因子
l_I = l_pk / l_avg;    %脈衝因子
l_xr = mean(sqrt(abs(sonar(1))))^2;
l_L =  l_pk/ l_xr;     %裕度因子

%%  右聲道頻域
r_max = max_data(2);
r_min = min_data(2);
r_median = median_data(2);
r_mean = mean_data(2);
r_pk = pk_data(2);
r_avg = avg_data(2);
r_var = var_data(2);
r_sd = sd_data(2);
r_ku = ku_data(2);
r_sk = sk_data(2);
r_rm = rm_data(2);
r_S = r_rm / r_avg;    %均方根因子
r_C = r_pk / r_rm;     %峯值因子
r_I = r_pk / r_avg;    %脈衝因子
r_xr = mean(sqrt(abs(sonar(2))))^2;
r_L =  r_pk/ r_xr;     %裕度因子

5 頻域特徵提取

這塊寫的我也沒啥自信了,畢竟是根據網上東拼西湊的資料寫出來的。

%%  雙聲道頻域信息提取
[fft_sonar,f_range] = positiveFFT(sonar,fs);  
N = length(fft_sonar);      %fft採樣點數
subplot(5,2,5);
fft_amp = abs(fft_sonar);   %振幅(幅頻特性)
stem(f_range,fft_amp);  %x-正頻率;y-振幅
title('頻域聲納波形');
fft_phase = angle(fft_sonar);   %相頻特性
subplot(5,2,6);
plot(f_range,fft_phase);
title('相頻特性圖')

amp_max = max(fft_amp);     %振幅最大值
amp_min = min(fft_amp);     %振幅最小值
amp_median = median(fft_amp);   %振幅中位數
amp_mean = mean(fft_amp);       %振幅平均值
amp_pk = amp_max - amp_min;     %振幅峯差
amp_mph = amp_pk * 0.75;           %振幅峯值閾值,閾值爲75%的振幅峯差
%[amp_pkfs,amp_pks] = findpeaks(fft_amp,'minpeakheight',amp_mph);
%amp_pkfs = amp_pkfs / N * fs/2;
amp_pks = [];   %振幅峯值
amp_pkfs = [];  %振幅峯值對應的頻率
for i = 1:N
    if amp_mph < fft_amp(i)
        amp_pks = [amp_pks,fft_amp(i)];
        amp_pkfs = [amp_pkfs,i / N * fs / 2];
    end
end

avg_fs = fs*[1:N] / N;
avg_fft = 2 * fft_amp / N;

amp_fc = sum(avg_fs .* avg_fft) / sum(avg_fft);     %重心頻率
amp_msf = sum(avg_fs.^2 .* avg_fft) / sum(avg_fft);    %均方頻率
amp_rmsf = sqrt(amp_msf);   %均方根頻率
amp_vf = sum((avg_fs - amp_fc).^2 .* avg_fft) / sum(avg_fft);  %頻率方差
amp_rvf = sqrt(amp_vf);     %頻率標準差

6 功率譜

%%  雙聲道功率譜信息提取
power = abs(fft_sonar).^2 / N;      %功率 = 傅里葉變換^2 / 區間長度,fft的冪
subplot(5,2,7);
plot(f_range,power);
title('功率譜');
power_y = 10*log10(power);      %放大低頻
power_y(1) = mean(power_y);     %去除直流影響
subplot(5,2,8);
plot(f_range,power_y);
title('放大低頻的功率譜');

power_max = max(power);     %功率最大值
power_min = min(power);     %功率最小值
power_median = median(power);       %功率中位數
power_mean = mean(power);           %功率平均值
power_snr = 10*log10(power_max / (sum(power) - power_max));     %信噪比
power_obw = obw(sonar,fs);      %佔用帶寬

7 倒譜

%%  雙聲道倒頻譜信息提取
cepstrum = real(ifft(log(abs(fft(sonar(:,1))))));
during_time = 1/fs:1/fs:time;
subplot(5,2,9);
plot(during_time,cepstrum,'color',[29/255 176/255 184/255]);ylim([0 0.01]);
title('左聲道倒頻譜');
cepstrum = real(ifft(log(abs(fft(sonar(:,2))))));
during_time = 1/fs:1/fs:time;
subplot(5,2,10);
plot(during_time,cepstrum,'color',[86/255 163/255 108/255]);ylim([0 0.01]);
title('右聲道倒頻譜');

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章