MATLAB信号包络的提取

一、使用希尔伯特变换计算信号包络

1.函数调用

y=hilbert(x)

2.范例

clear all; clc; close all;

n=-5000:20:5000;            % 样点设置
% 程序第一部分:直接做做希尔伯特变换
N=length(n);                % 信号样点数
nt=0:N-1;                   % 设置样点序列号
x=120+96*exp(-(n/1500).^2).*cos(2*pi*n/600); % 设置信号
Hx=hilbert(x);              % 希尔伯特变换
% 作图
plot(nt,x,'k',nt,abs(Hx),'r');
grid; legend('信号','包络');
xlabel('样点'); ylabel('幅值')
title('信号和包络')
set(gcf,'color','w');

直接对接收到的信号做希尔伯特变换,得到的包络如图所示
MATLAB信号包络的提取_第1张图片
原因是由于直流分量的影响,早生了包络的不理想,下面对信号进行去直流分量的处理,再进行希尔伯特变换。代码如下所示:

clear all; clc; close all;
n=-5000:20:5000;            % 样点设置
% 程序第一部分:直接做做希尔伯特变换
N=length(n);                % 信号样点数
nt=0:N-1;                   % 设置样点序列号
x=120+96*exp(-(n/1500).^2).*cos(2*pi*n/600); % 设置信号
y=detrend(x);                    % 消除直流分量
Hy=hilbert(y);              % 希尔伯特变换
plot(nt,y,'k',nt,abs(Hy),'r');
grid; legend('信号','包络');
xlabel('样点'); ylabel('幅值')
title('信号和包络')
set(gcf,'color','w');

MATLAB信号包络的提取_第2张图片
去直流画出包络后,还要再加上直流分量

clear all; clc; close all;
n=-5000:20:5000;            % 样点设置
% 程序第一部分:直接做做希尔伯特变换
N=length(n);                % 信号样点数
nt=0:N-1;                   % 设置样点序列号
x=120+96*exp(-(n/1500).^2).*cos(2*pi*n/600); % 设置信号
y=detrend(x);                    % 消除直流分量
Hy=hilbert(y);              % 希尔伯特变换
plot(nt,x,'k',nt,abs(Hy)+120,'g');
grid; legend('信号','包络'); hold on;
xlabel('样点'); ylabel('幅值')
title('信号和包络')
set(gcf,'color','w');

如图所示:
MATLAB信号包络的提取_第3张图片

二、用极大值极小值方法计算信号的包络

1.函数调用

[K,V]=v_findpeaks(x,m,w)

2.范例:

clear all; clc; close all;
xx=load('pulsedata0.txt');   % 读入信号
N=length(xx);                % 数据长度
n=1:N;                       % 设置样点序列
% 作图
plot(n,xx,'k'); grid;
xlabel('样点'); ylabel('幅值');
title('原始信号波形图')
set(gcf,'color','w');
% 程序第一部分用hilbert计算信号的包络
x=detrend(xx)
z=hilbert(x);                % 进行希尔伯特变换
plot(n,x,'k'); hold on; grid;
plot(n,abs(z),'r');
xlabel('样点'); ylabel('幅值');
title('消除直流分量用求取包络曲线图')
set(gcf,'color','w');

包络图如下图所示,可以看到虽然已经去掉了直流分量,但包络曲线并不理想。
MATLAB信号包络的提取_第4张图片
此时可采用找极大值和极小值的方法来取上下包络线,利用v_findpeaks函数。代码如下:

clear all; clc; close all;
xx=load('pulsedata0.txt');   % 读入信号
N=length(xx);                % 数据长度
n=1:N;                       % 设置样点序列
x=detrend(xx)
[K1,V1]=v_findpeaks(x,'q',120); % 求极大值位置和幅值
up=spline(K1,V1,n);          % 内插,获取上包络曲线
[K2,V2]=v_findpeaks(x,'v',120);% 求极小值位置和幅值
down=spline(K2,V2,n);        % 内插,获取下包络曲线
plot(n,x,'k'); hold on; grid;
plot(n,up,'r');
plot(n,down,'r');
xlabel('样点'); ylabel('幅值');
title('用求取极大极小值方法获取包络曲线图')
set(gcf,'color','w');

MATLAB信号包络的提取_第5张图片

三、envelope函数

1.函数调用:

MATLAB信号包络的提取_第6张图片

2.范例:

clear all; clc; close all;
n=-5000:20:5000;            % 样点设置
N=length(n);                % 信号样点数
nt=0:N-1;                   % 设置样点序列号
x=120+96*exp(-(n/1500).^2).*cos(2*pi*n/600); % 设置信号
[up,down] = envelope(n,x,'pchip');
% 作图
plot(nt,x,'k',nt,up,'r',nt,down,'g');
xlabel('样点'); ylabel('幅值'); grid;
title('调用envelope函数求取上下包络曲线图')
set(gcf,'color','w');

MATLAB信号包络的提取_第7张图片

四、倒谱法计算语音信号频谱包络

你可能感兴趣的:(MATLAB数字信号处理)