在信号处理的时候,有的时候希望确定信号峰值的大小以及位置,并最好对信号进行分离,可以更好地进行后续处理。本人使用了集中不同的思路和方式来进行位置确定和提取,仅供参考。

注意: 部分程序仅兼容Matlab2016b以后版本

目标

提取和检测如下图类似信号的峰值及位置

方法1

调用的findpeaks函数

参考程序,通过设定合适的峰值参数,可以输出相应的峰值

%% 找到数据中的峰值

clc;

clear;

x = linspace(0,1,1000);

Pos = [1 2 3 5 7 8]/10;

Hgt = [3 4 4 2 2 3];

Wdt = [2 6 3 3 4 6]/100;

for n = 1:length(Pos)

Gauss(n,:) = Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2);

end

Data = sum(Gauss);%产生假设信号

% NPeaks表示返回值中最大的峰值个数

[pks,locs,w,p] = findpeaks(Data,x,...pks为输出峰值,locs为峰值位置

'NPeaks',1,...输出的最大峰值个数

'SortStr','ascend',...输出峰值是否进行排序,升序或降序或不进行排序

'Threshold',0,...峰值之间的最小差值阈值,如数组为[]则未找到符合参数的阈值

'WidthReference','halfprom',...

...'MiniPeakWidth','0',...最小的峰值宽度

'MaxPeakWidth',Inf,...最大的峰值宽度

'Annotate','peaks',...在定义输出后无效

'MinPeakHeight',50);%最小峰值高度

findpeaks(Data,x,'Annotate','extents')

text(locs+.02,pks,num2str((1:numel(pks))'))

方法2

通过求取整个信号的方差和平均值,再使用逻辑与或的方式提取位置和峰值。由于方差即为随机变量和数学期望之间的偏离程度,当极度偏离方差时,信号为突变信号。首先提取位置,通过与方差比较,大于阈值的即为1,小于阈值的即为0,在于信号进行与逻辑运算,即可提取出相对准确的峰值。

clc

clear

Fs=1000;

y=xlsread('Data2','sheet1');

x=y(:,7)';%通道设置

figure('Name','原始混合信号','NumberTitle','off');

plot(x)

jun=mean(x);%求取整个信号的均值

biao=std(x);%求取整个信号的标准差

fang=var(x);%求整个信号的方差

zhong=median(x);%求整个信号的中位数

fai=1;

% x = 0:0.05:50*pi;

% x= signal+rand(1,length(signal))

L=length(x);

T=0.5*(min(x(:))+max(x(:)));

%循环判断与整个信号方差之间的关系

for i=1:L

if(x(i)

方法3

使用VPD方法

%一维峰值检测Matlab实现

clc;

clear

signal = 0:0.05:50*pi;

x = sin(signal);

row_acc=x;

plot(x)

% x = 0:0.05:50*pi;

% x= signal+rand(1,length(signal))

L=length(x);

% Y = fft(x);

% P2 = abs(Y/L);

% P1 = P2(1:L/2+1);% 实信号的功率谱是对称的,只用取一半即可

% P1(2:end-1) = 2*P1(2:end-1);

% f = Fs*(0:(L/2))/L;

%

% plot(f,P1)

% title('原始信号直接进行傅里叶分析')

% grid on

% xlabel('Frequency (Hz)')

% ylabel('Amplitude')

% [c,l] = wavedec(x,2,'db2');

% approx = appcoef(c,l,'db2');

% [cd1,cd2] = detcoef(c,l,[1 2]);

%

% subplot(3,1,1)

% plot(x)

% title('原始信号')

% subplot(3,1,2)

% plot(approx)

% title('应变信号')

% subplot(3,1,3)

% plot(cd3)

% title('冲击信号')

% subplot(4,1,3)

% plot(cd2)

% title('Level 2 Detail Coefficients')

% subplot(4,1,4)

% plot(cd1)

% title('Level 1 Detail Coefficients')

%

% Hd=LowPass_Filter;

% output=filter(Hd,x);

% figure

% plot(output)

%

% blo = fir1(34,0.48,chebwin(35,30));

% outlo = filter(blo,1,x);

%

% 使用峰值检测

% % [pks,locs]=findpeaks(x,'Npeaks',1,'MinPeakHeight',250);

% % jieyue=x(:,[locs-200:L]);

% % figure

% % plot(jieyue)

% % yingbian=x(:,[1:locs-200]);

% % figure

% % plot(yingbian)

% % ylim([-50 300])

% % figure

% % plot(locs,pks)

%

%% VPD方法

%%前三点均值滤波

row_acc = x;

m = length(row_acc);

row_acc1 = linspace(0,0,m);

row_acc1(1) = row_acc(1);

row_acc1(m) = row_acc(m);

for i=2:m-1

row_acc1(i)=(row_acc(i-1) + row_acc(i)+row_acc(i+1))/3;

end

% figure;

% plot(row_acc1);

for i=m-1:-1:2

row_acc(i) = (row_acc1(i-1) + row_acc1(i)+row_acc1(i+1))/3;

end

%%找到局部最小值和局部最大值及其对应的位置,波峰点、波谷点满足:

peaks = linspace(0,0,m);

valleys = linspace(0,0,m);

peakindexs = linspace(0,0,m);

valleyindexs = linspace(0,0,m);

peakindex = 1;

valleyindex = 1;

for i = 2:m-1

if row_acc(i) >row_acc(i-1) && row_acc(i)>=row_acc(i+1)

peaks(peakindex)=row_acc(i);

peakindexs(peakindex)=i;

peakindex = peakindex+1;

end

if row_acc(i) < row_acc(i-1) && row_acc(i)2 && vcount>2

if peakindexs(1) < valleyindexs(1)

peakindex=2;

else

peakindex=1;

end

vindex=1;

end

if peakindex == 2

for i = 1:m-1

peaks(i)=peaks(i+1);

end

pcount = pcount-1;

pindex=1;

end

vpd = linspace(0,0,m);

vpd1 = linspace(0,0,m);

for i=1:pcount

vpd(i) = peaks(i) - valleys(i);

end

dels = linspace(0,0, pcount);

peakindexs1 = linspace(0,0,pcount);

if pcount > 2

lastcount=pcount;

curcount = 1;

while lastcount ~= curcount

lastcount = curcount;

del_count = 0;

for i = 2:pcount-1

if vpd(i) <= 0.7 * (vpd(i-1) + vpd(i)+vpd(i+1)) / 3

dels(i)=1;

end

end

count = 1;

for i = 1:pcount

if dels(i) ~= 1

vpd1(count) = vpd(i);

peakindexs1(count) = peakindexs(i);

count = count+1;

else

del_count = del_count + 1;

dels(i) = 0;

end

end

pcount = pcount - del_count;

for i = 1:pcount

vpd(i) = vpd1(i);

peakindexs(i) = peakindexs1(i);

end

peakindexs(pcount+1) = 0;

vpd(pcount+1) = 0;

indices = linspace(0,0,pcount);

for i = 1:pcount

indices(i) = peakindexs1(i);

end

plot(row_acc,'-o', 'MarkerIndices',indices,'MarkerFaceColor','red','MarkerSize',10);

curcount = pcount;

end

end

% [pks,locs]=findpeaks(row_acc,'Npeaks',1,'MinPeakHeight',20);

% jieyue=row_acc(:,[locs-200:L]);%从触发峰值点左边200处分离

% figure

% plot(jieyue)

% yingbian=x(:,[1:locs-200]);

% figure

% plot(yingbian)

% ylim([-50 300])

%

% % figure

% % plot(locs,pks)

%

Copyright © 2020 by RichardYang. All rights reserved.

仅供参考,严禁转载,感谢。

matlab 峰值提取,Matlab2019b信号峰值检测与提取相关推荐

  1. matlab提取语音信号基频检测,语音信号处理中基频提取算法综述

    [实例简介] 语音信号处理中基频提取算法综述,论述了各种基频检测的算法,对比分析各方法与思想,不错的总结 增刊 张杰等:语音信号处理中基频提取算法综述 101 信号是由频率具有谐波关系的信号组成的,因 ...

  2. baep matlab,ICA与小波去噪相结合提取听觉诱发电位研究.pdf

    • 41 • ELECTRONICS WORLD•探索与观察 ICA与小波去噪相结合提取听觉诱发电位研究 广东工业大学自动化学院 温冰冰 谭程豪 [摘要]听觉诱发电位信号(BAEP)是一种人脑部微弱的 ...

  3. (MATLAB)一维信号峰值检测findpeaks

    (MATLAB)一维信号峰值检测findpeaks 基本介绍 findpeaks函数用法 基本用法 特殊用法 其他 by HPC_ZY 一维信号波峰波谷检测,峰值.峰宽.到达时间计算.MATLAB自带 ...

  4. matlab下对齿轮图片的参数提取

    matlab下对齿轮图片的参数提取 目标:基于matlab对下面图片的各个参数进行提取 图片预处理: 首先读入图片,二值化,用canny算子边缘提取,由于接下来要用与中心提取,细化边缘. 代码: bw ...

  5. 音乐信号音符/乐谱提取

    1 音符提取方法和基本原理 本实验使用时频分析的方法完成音乐信号的音符提取.时频分析选择短时傅里叶变换(STFT)完成.其具体方法是将信号用一定长度的窗进行分割成若干帧,对每一帧分别作傅里叶变换,得到 ...

  6. 【转】使用matlab软件打开一幅图片并且分别提取其中的RGB分量并显示

    使用matlab软件打开一幅图片并且分别提取其中的RGB分量并显示 原创 2015年10月11日 18:55:56 标签: 图片 / 5928

  7. matlab中sign函数的使用(提取符号)

    仅用于记录自己学习过程中遇到的函数 matlab中sign函数的使用,提取符号 一.语法 Y = sign(x) 返回与 x 大小相同的数组 Y,其中 Y 的每个元素是: 1,前提是 x 的对应元素大 ...

  8. 利用python声音处理库librosa提取声音信号的mfcc特征及特征融合

    利用python库librosa提取声音信号的mfcc特征及特征融合 前言 librosa库介绍 librosa 中MFCC特征提取函数介绍 解决特征融合问题 总结 前言 写这篇博文的目的有两个,第一 ...

  9. java 使用串口获取gps_一篇提及如何通过串口读取并提取GPS信号的论文

    一篇提及如何通过串口读取并提取GPS信号的论文 作者:崔杰 梁计春 王国军 目前,在用计算机进行数据传输时,常用的是串行通信方式.在Visual C++的编程中,既可以用Windows API函数进行 ...

  10. 第一周-基于循环谱的水声通信信号特征分析和提取

    基于循环谱的水声通信信号特征分析和提取 对于非合作水声通信信号的检测.调制识别和参数估计,上学期对于每一个步骤都学到了多种方法.首先在信号的检测中,首先通过合适的阵列发布,并且选取最优的权值获得最接近 ...

最新文章

  1. IOS开发网络第一天之06线程之间的通信
  2. 与1000天的我约定
  3. SQLite学习手册(锁和并发控制)
  4. 用.net core 写后端—— c++外的另一种选择?
  5. TypeScript和vuejs 搭建webpack,初次体验
  6. nero4j导入关系数据以及节点操作
  7. sdk环境变量配置不成功
  8. 最简单易懂的10堂算法入门课——算法是什么
  9. 基于Renascence架构的SQL查询引擎设计
  10. WordPress 速度优化的完整指南
  11. 关于大创项目的初期思考2020.11.14
  12. Linux Deepin15.9下更新nvidia显卡驱动
  13. 你可能不知道的 Ps 技巧
  14. 【ER图】数据库实体关系图
  15. 苹果iWork,看上去很美
  16. Windows11创建删除账户以及用户权限的相关问题
  17. 华为手机摄影从入门到精通_华为手机拍照技巧从入门到精通
  18. 关于微信小程序CMS后台集成办公管理功能
  19. 圆形体癣是什么样子的图片_【圆圈状的癣不痛不痒】_原因_起因-大众养生网
  20. html鼠标拖动变换大小案例,js实现鼠标拖拽缩放div实例代码_哒哒_前端开发者

热门文章

  1. INVEST模型生境质量评价之威胁源数据处理
  2. UCF101视频分类之CNN-LSTM-Code总结
  3. 一个VSCode插件实现软妹音程序员鼓励师24小时在线,还能吐槽PM
  4. pix4d操作流程_Pix4d_mapper中文版操作手册.pdf
  5. python cox回归_TCGA+biomarker——多因素Cox回归
  6. js设置css行内样式
  7. MATLAB读取nc文件
  8. Ubuntu显卡驱动安装
  9. 【通俗理解】开漏/开集,线与
  10. CCS软件编译时Relocation Overflow Error报错解决方法