在信号处理中,经常会需要在时间域或频率域寻找峰值和谷值。MATLAB工具箱中已有峰值检测的函数(findpeaks函数),本次将结合函数说明对峰值和谷值的检测。
如果只找一个峰值可以用max函数,而需要寻找多个峰值才用本函数findpeaks。
输入参数中x是被检测的信号序列,pks是被检测到信号中峰值的幅值,loc是被检测到峰值
的位置,是序列的索引号。为了检测到峰值可以设置各种条件,即由属性和对应的参数来限
定。
findpeaks常用调用方式为:
1、[pks,loc] = findpeaks(x); 查找数据中的波峰
2、[pks,loc] = findpeaks(x,’minpeakheight’,mph);设定峰值的最小高度
3、[pks,loc] = findpeaks(x,’minpeakdistance’,mpd);设定两峰值间的最小间隔数
除了matlab自带的检测信号峰值函数外,还有其他函数可检测信号峰值和谷值如:findpeakm函数可以检测信号的峰值和谷值,
函数:findpeakm
功能:寻找待测信号的峰值和谷值
调用格式:
[K,V]=findpeakm(x,m,w)
说明:输入变量x是被测序列;m是方式,选用’q时是用二次曲线内插后寻找峰值,选用v时是寻找谷值;w是在寻找峰值时,两个峰值之间最小间隔的样点数。
findpeakm函数使用案例,从文件sch32.wav中读入双声道的波形,求这两个信号之间的延迟量。程序如下:
clear all; clc; close all;
[xx,fs]=audioread('sch32.wav'); % 读入数据和采样频率
x=xx(:,1); % 双声道数据分别设定为x和y
y=xx(:,2);
N = length(x); % 信号长度
n=0:N-1; % 序列号
[R,lags]=xcorr(y,x); % 计算y和x的互相关函数
[Rmax,K]=max(R); % 在R中找最大值和相应位置
lagk=lags(K);
fprintf('lagk=%4d Rmax=%5.4f\n',lagk,Rmax); % 显示内插前最大延迟量和幅值
[Locs,Val]=findpeakm(R,'q',35); % 用findpeakm函数寻找相关函数中的峰值
Locs=Locs-N; % 修正Logs
fprintf('Mmax=%5.4f Rmax=%5.4f\n',Locs(9),Val(9)); % 显示最大延迟量和幅值
% 作图
subplot 211; plot(n,x,'k');
xlabel('样点'); ylabel('幅值');
title('信号x波形图'); xlim([0 N]);
subplot 212; plot(n,y,'k');
xlabel('样点'); ylabel('幅值');
title('信号y波形图'); xlim([0 N]);
set(gcf,'color','w');
figure
subplot 211; plot(lags,R,'k'); grid; hold on;
plot(Locs,Val,'ro');
axis([min(lags) max(lags) -25 45])
xlabel('延迟量/样点'); ylabel('相关函数幅值');
title('相关函数曲线图');
subplot 212; plot(lags,R,'k'); grid; hold on
plot(Locs,Val,'ro');
axis([-20 20 -25 45]);
xlabel('延迟量/样点'); ylabel('相关函数幅值');
title('相关函数曲线图(最大值)');
set(gcf,'color','w');
运行结果如下:
分析:调用findpeakm函数并选用参数’q’,就是为了能在最大值附近以二次曲线内插的方法比较精确地求出延迟量的数值,从而减小样点离散的影响。
运行程序后得到:内插之前从互相关函数R求出延迟量为lagk=3,对应互相关函数的最大幅值为Rmax=40.0764;而内插以后得到的延迟量为Mmax=2.9121,对应互相关函数的最大幅值为Rmax=40.085。
在已知以样点为单位延迟量后,只要乘以采样周期△t就可以得到延迟的时间。
findpeaks函数使用案例,从数据文件SBSBRIR_x1y0_LS0deg.mat中读入数据,求得到的频谱图所有峰值,程序如下:
clc;
clear;
close all;
load('SBSBRIR_x1y0_LS0deg.mat'); %读入数据
fs=48000;
hL=SBSBRIR.irChOne(:,60);%左耳
hR=SBSBRIR.irChTwo(:,1);%右耳
N=length(hL);
X=fft(hL);
n=1:N/2+1;
freq=(n-1)*fs/N;
Ap=abs(X(n))*2/N;
Ap_db=20*log10(Ap);
%[loc,val]=findpeakm(Ap,'q',1);
[loc,val]=findpeaks(Ap_db);
figure;
plot(freq,Ap_db);hold on;
plot(freq(loc),val,'ro');
运行结果如下:全局图
局部图:
实验数据sch32.wav下载链接如下:
https://download.csdn.net/download/qq_42233059/86406381
实验数据SBSBRIR_x1y0_LS0deg.mat下载链接如下:
https://download.csdn.net/download/qq_42233059/86406384
参考文献:MATLAB数字信号处理85个实用案例精讲——入门到进阶;宋知用(编著)
今天的文章信号峰值检测_信号的最高频率怎么算[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/84780.html