matlab如何实现分峰,分峰拟合,将一条曲线分为单独的小峰
clc,clear,close all;fclose all;
datapath = 'E:\done2\';
datFiles = dir([datapath, '*.txt']);
numFiles = length(datFiles);
data1 = [];
for i = 1:numFiles
data = load([datapath,datFiles(i).name]);
data1 = [data1,data];
end
x=1:350;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???% % 一共130個
[b,a]=butter(6,1/30/0.5,'low');? ?? ?? ?% % 想做低通濾波,讓數(shù)據(jù)更平穩(wěn)一些
% % 按你說的,如果間距不大,就當(dāng)成一個峰
datalow=filtfilt(b,a,data1);? ?? ?? ?? ? % % 做低通濾波
[min_datalow,~]=min(datalow);? ?? ?? ? % % 尋找各列的最小值
datalow=datalow-min_datalow;? ?? ?? ???% % 以數(shù)據(jù)最小值為基準(zhǔn)
datalow(1,:)=datalow(2,:)+0.1;? ?? ?? ?? ???% % 為了克服數(shù)據(jù)端點的影響
datalow(end,:)=datalow(end-1,:)+0.1;? ?? ???% % 即使如此,兩端依然可能受到影響
subplot(2,1,1),hold on;
[min_data1,~]=min(data1);? ?? ?? ? % % 尋找各列的最小值
plot(x,data1-min(data1),'-g','linewidth',2);? ?? ?% % 原始數(shù)據(jù)
plot(x,datalow,'-r','linewidth',1);? ?? ?? ?? ? % % 低通濾波數(shù)據(jù)
peaks_pick_all = [];? ?? ?? ?? ?? ?? ?? ?% %用于存儲分出的五個峰的矩陣
for i=1:numFiles? ?? ?? ?? ?? ?? ?? ?? ? % % 循環(huán)遍歷每個峰
data4everpeaks = datalow(:,i);
[~,locs]=findpeaks(-data4everpeaks);
for ii=1:length(locs)-1;? ?? ?? ?? ? % % 這個地方有點意思,注意是否要減一? ?? ?? ?? ?% % 循環(huán)遍歷每個峰
temp=nan(size(data4everpeaks));? ?? ?% % 截取每一段峰
temp(locs(ii):locs(ii+1))=data4everpeaks(locs(ii):locs(ii+1));
idx=find(~isnan(temp));
ft=fittype('gauss1');? ?? ?? ?? ?? ?? ?? ???% % 用鐘型線去做擬合
% % 當(dāng)然可以選擇其他擬合方式
fitobject=fit(idx,temp(idx),ft);? ?? ?? ?? ?% % 擬合并畫圖
vvv=fitobject.a1*exp(-((x-fitobject.b1)./fitobject.c1).^2); % % 存儲每個峰的信息
peaks_pick_all=[peaks_pick_all,vvv'];
plot(fitobject.a1*exp(-((x-fitobject.b1)./fitobject.c1).^2),'-b','linewidth',1)
end
end
[max_peaks_pick_all,peaks_position]=max(peaks_pick_all);
peaks_area = trapz(peaks_pick_all);? ?? ?? ?? ?% % 求解分出的峰的峰面積
aaa = [peaks_pick_all(:,1)+peaks_pick_all(:,2)+peaks_pick_all(:,3)+peaks_pick_all(:,4)+peaks_pick_all(:,5)]??% % 擬合峰的疊加
subplot(2,1,2)
plot(aaa);
總結(jié)
以上是生活随笔為你收集整理的matlab如何实现分峰,分峰拟合,将一条曲线分为单独的小峰的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络渗透测试实验1
- 下一篇: matlab人脸追踪,求大神帮助我这个菜