一、使用希尔伯特变换计算信号包络
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');
直接对接收到的信号做希尔伯特变换,得到的包络如图所示
原因是由于直流分量的影响,早生了包络的不理想,下面对信号进行去直流分量的处理,再进行希尔伯特变换。代码如下所示:
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');
去直流画出包络后,还要再加上直流分量
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');
如图所示:
二、用极大值极小值方法计算信号的包络
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');
包络图如下图所示,可以看到虽然已经去掉了直流分量,但包络曲线并不理想。
此时可采用找极大值和极小值的方法来取上下包络线,利用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');
三、envelope函数
1.函数调用:
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');
四、倒谱法计算语音信号频谱包络
转载:https://blog.csdn.net/tapangjue3478/article/details/109115765
查看评论