信号处理中简单实用的方法——提取信号中的包络

2023-11-01

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

在求某一信号包络时用得最多的是希尔伯特变换,但并不是希尔伯特变换适用于所有信号求包络的情况。这是因为对于包络没有一个很严格的定义,在求包络时不同的情况会有不同的要求。下面将介绍用希尔伯特变换求取信号的包络。

对MATLAB中自带的希尔伯特变换的函数介绍如下。
名称:hilbert
功能:把序列x(n)作希尔伯特变换为y(n),又把x(n)和y(n)构成解析信号的序列z(n)=x(n)+jy(n)

调用格式:
z=hilbert(x)
说明:函数hilbert不是单纯地把x(n)作希尔伯特变换得到y(n),而是得到y(n)后与x(n)
共同构成解析信号序列z(n),并可以对z(n)直接求模值和相角。
案例1、设信号x(n)=120+96e^[(n/1500)^2]*cos(2π*n/600),n=-5000:20:5000,求该信号的包络线。设置信号后直接调用hilbert函数求信号的包络,运行第一部分程序如下:

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');
pause

 运行结果如下:

 

运行程序第一部分后得上图,从图中可以看出通过hilbert函数求信号所得的包络似乎不是信号的包络,而是原有的信号,这是为什么呢?之所以会得到这样一个不理想的包络线完全是直流分量造成的,故对原始信号消除直流分量后再通过hilbert函数求信号的包络。
第二部分程序如下:

% 程序第二部分:消除直流后做希尔伯特变换
y=x-120;                    % 消除直流分量
Hy=hilbert(y);              % 希尔伯特变换
% 作图
figure(2)
plot(nt,y,'k',nt,abs(Hy),'r');
grid; legend('信号','包络');
xlabel('样点'); ylabel('幅值')
title('信号和包络')
set(gcf,'color','w');
figure(3);
plot(nt,x,'k',nt,abs(Hy)+120,'r');
grid; legend('信号','包络'); hold on;
xlabel('样点'); ylabel('幅值')
title('信号和包络')
set(gcf,'color','w');
pause

 运行结果如下:

同时把包络线加上直流分量后叠加在原始信号上,修改了上图的不正确包络线,得下图:

这说明如果信号有直流分量,可以先消除直流分量求出信号的包络线,再在包络线上叠加直流分量恢复原始信号的包络线。

二、用倒谱法来计算语音信号频谱的包络

语音信号频谱的包络线对语音分析来说是比较重要的,它反映了人类发声器官的共振结构,从频谱的包络可提取共振峰参数(频率和带宽)。在语音分析中常用倒谱方法来提取语音信号频谱的包络线。

倒谱(Cepstrum)分析的实质就是对幅值谱取对数后再做一次频谱分析,所以又称为二次频谱分析。

我们知道,若两个信号在频域有不同的频带,则可以通过滤波把这两个信号分离开。同样在倒谱域中,当两个信号在倒谱域中占有不同的倒频率时,也可以通过倒滤波(Lifter)把这两个信号在倒频域上分离。
声带产生的脉冲序列振动频率较高,而口腔是通过肌肉运动发声的,振动频率较低,所以二者在倒谱中处于不同的倒频带内。通过倒滤波把这两个信号分离,可以分别得到激励脉冲在频域的响应和声道在频域的响应。一般把声道在频域的响应称为语音信号频谱的包络线,通过该包络线可提取语音共振峰的信息。

案例2、 从文件su1.txt读入语音数据,求取该语音信号的频谱包络线。程序清单如下:

clear all; clc; close all;
y=load('su1.txt');                            % 读入数据
fs=16000; nfft=1024;                          % 采样频率和FFT的长度
time=(0:nfft-1)/fs;                           % 时间刻度
nn=1:nfft/2; ff=(nn-1)*fs/nfft;               % 计算频率刻度
Y=log(abs(fft(y)));                           % 取幅值的对数
z=ifft(Y);                                    % 按式(4-3-16)求取倒谱
mcep=29;                                      % 分离声门激励脉冲和声道冲击响应
zy=z(1:mcep+1);
zy=[zy' zeros(1,1024-2*mcep-1) conj(zy(end:-1:2))']; % 构建声道冲击响应的倒谱序列
ZY=fft(zy);                                   % 计算声道冲击响应的频谱
% 作图
plot(ff,Y(nn),'k'); hold on;                  % 画出信号的频谱图
plot(ff,real(ZY(nn)),'k','linewidth',2.5);    % 画出包络线
grid; hold off; ylim([-4 5]);
title('信号频谱和声道冲击响频谱(频谱包络)')
ylabel('幅值'); xlabel('频率/Hz'); 
legend('信号频谱','频谱包络')
set(gcf,'color','w');

运行结果如下:

 

实验数据su1.txt下载链接如下:

https://mp.csdn.net/mp_download/manage/download/UpDetailed

参考文献:MATLAB数字信号处理85个实用案例精讲——入门到进阶;宋知用(编著)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

信号处理中简单实用的方法——提取信号中的包络 的相关文章

  • matlab中类库的全局变量

    我有一些matlab声明的类 我如何声明所有类中都可见的常量 例如 这些常量可以是在所有类的方法中使用的物理常量 首先想到的是使用全局变量 还有更好的办法吗 最好在单独的文件中声明这些常量 包含常量的类是执行此操作的一种很好的干净方法 请参
  • 检测植物图片中的所有分支

    我想知道有什么可以检测下图中的所有绿色树枝 目前我开始应用 Frangi 过滤器 options struct FrangiScaleRange 5 5 FrangiScaleRatio 1 FrangiBetaOne 1 FrangiBe
  • 如何使用 MATLAB 的 substruct 函数创建表示使用“end”的引用的结构?

    我想使用substruct http www mathworks com help matlab ref substruct html函数创建一个结构体以供使用subsref 目的是使用索引字符串subsref而不是通常的 符号 因为我正在
  • 访问图像的 Windows“标签”元数据字段

    我正在尝试进行一些图像处理 所以现在我正在尝试读取图像 exif 数据 有 2 个内置函数可用于读取图像的 exif 数据 问题是我想读取图像标签 exifread and imfinfo这两个函数都不显示图像标签 Is there any
  • 图像处理 - 使用 opencv 进行服装分割

    我正在使用 opencv 进行服装特征识别 第一步 我需要通过从图像中移除脸部和手来分割 T 恤 任何建议表示赞赏 我建议采用以下方法 Use 阿德里安 罗斯布鲁克的用于检测皮肤的皮肤检测算法 谢谢罗莎 格隆奇以获得他的评论 在方差图上使用
  • 如何在MATLAB中显示由三个矩阵表示的图像?

    我有 3 个相同大小的 2D 矩阵 假设 200 行和 300 列 每个矩阵代表三种 基本 颜色 红色 绿色和蓝色 之一的值 矩阵的值可以在 0 到 255 之间 现在我想组合这些矩阵以将它们显示为彩色图像 200 x 300 像素 我怎样
  • MATLAB 列含义的内存分析

    我正在使用 MATLAB 配置文件来使用命令观察内存 profile memory on profile clear my code profile report and i got this table 1 我想问一下什么意思 已分配内存
  • 如何知道Matlab中系统命令执行过程中经过的时间?

    我有一个运行系统脚本的 Matlab 代码 该脚本可能会因命令运行而停止 我想知道是否有一种方法可以让程序知道它是否花费了很长时间并执行其他操作 这是代码 tic status cmdout system iperfcmd The prog
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • scipy distance_transform_edt 函数如何工作?

    https docs scipy org doc scipy 0 14 0 reference generated scipy ndimage morphology distance transform edt html https doc
  • 在不知道大小的情况下在Matlab中预分配空间?

    我正在构建一个向量X在 Matlab 中 通过将循环过程中每次迭代的结果连接起来 我现在正在做的是 X for j 1 N do something that delivers a vector A X X A end 不可能先验地预测 A
  • 小矩阵乘以大矩阵

    我试图将小矩阵 假设为 2x2 中的每个元素与大矩阵 假设为 4x4 中的每个位置逐个元素相乘 所以我想要 1 2 3 4 1 0 3 0 1 0 1 2 3 4 0 0 0 0 0 0 x 1 2 3 4 1 0 3 0 1 2 3 4
  • 在 MATLAB 2014b 及更高版本中使用画家渲染器进行三角形分割面片

    MATLAB 的新图形引擎 HG2 无法使用画家渲染器正确打印补丁 hist randn 1 1000 colorbar Location SouthOutside print test pdf dpdf 生成的补丁 无论是由hist or
  • MATLAB:按扩展名从文件夹加载文件

    将具有相同扩展名的文件夹中的所有文件加载到 MATLAB 中的最简单方法是什么 我以前的解决方案 Will load a file if its filename is provided USAGE Best save data to a
  • 在Matlab中,如何改变轴方向?

    我一直在 Matlab 中编写一个脚本来绘制 3D 图像 方法是使用plot3 轴在此区间内运行 x 1 gt 0 y 0 01 gt 0 z 0 gt 1 结果如下图所示 现在我想更改轴的方向 并使用此轴方向重新绘制图形 x 0 gt 1
  • matlab常量匿名函数仅返回一个值而不是一个数组

    我在网上查了好几天了 没有找到什么 希望能帮到你 我有一个像这样的匿名函数 f x y sin 2 pi x cos 2 pi y cos 2 pi x sin 2 pi y 需要对一系列点进行评估 例如 x 0 0 1 1 y 0 0 1
  • 如何为伪随机数生成器设置自定义种子

    我需要在使用的地方进行一些测试randn伪随机数生成器 我如何自己设置种子 以便每次运行此测试时都会得到相同的结果 是的 我知道这有点奇怪 但这就是问题所在 我找到了RANDSTREAM对象具有seed属性 但它是只读的 有什么方法可以用它
  • 使用 mle() 估计自定义分布的参数

    我有以下代码 我希望估计自定义分布的参数 有关分发的更多详细信息 https stackoverflow com q 56522903 4930944 然后使用估计的参数 我想看看估计的 PDF 是否类似于给定数据的分布 它应该与给定数据的
  • 如何使用 Mikolajczyk 的特征检测器/描述符评估框架?

    我正在尝试使用事实上的标准评估我的 SURF 描述符实现的正确性Mikolajczyk 等人的框架 阿尔 http www robots ox ac uk vgg research affine 我使用 OpenCV 来检测和描述 SURF
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub

随机推荐

  • c++开篇——自引用指针this

    c 中 有一个特别的指针this 也叫自引用指针 这个指针的巧妙之处在于它永远指向的是当前对象 由此便可以访问当前对象的所有成员 这样一来许多问题就得到了巧妙的解决 注意 this 是一个指针 要用 gt 来访问成员变量或成员函数 当调用到
  • Java实现多线程有几种方式(满分回答)

    目录 JDK8 创建的线程的两种方式 orcle文档解释 方式一 继承Thread类 方式二 实现Runnable接口 同时用两种的情况 其他间接创建方式 Callable接口 线程池 JDK8 创建的线程的两种方式 orcle文档解释 o
  • allegro界面简单介绍一

    1 view界面 2 Visibility Views 显示图层选择 Planes 平面层 Plan 规划布线 Etch 铜皮 走线 Via 过孔 Pin 焊盘pin脚 Drc 错误标记 All 全部显示 3 如何打开层设置 4 设置不同的
  • BootLoader简介——linux内核的引导

    1 BootLoader 在CPU上电启动时 一般连内存控制器都没有初始化过 根本无法在主存中运行程序 更不可能处在Linux内核启动环境中 为了初始化CPU及其他外设 使得Linux内核可以在系统主存中运行 并让系统符合Lintix内核启
  • Python:利用cv2模块识别手势

    简介 OpenCV是一个基于BSD许可 开源 发行的跨平台计算机视觉库 可以运行在Linux Windows Android和Mac OS操作系统上 它轻量级而且高效 由一系列 C 函数和少量 C 类构成 同时提供了Python Ruby
  • Java 依据文件名后缀,获取Content-Type/Mime类型

    枚举类代码MimeTypeEnum import org apache commons lang3 StringUtils import lombok Getter 依据文件后缀名返回ContentType author zzg Gette
  • Java基础--接口(Interface)

    有时必须从几个类中派生出一个子类 继承它们所有的属性和方法 但是 Java不支持多重继承 有个接口 就可以得到多重继承的效果 接口 interface 是抽象方法和常量值的定义的集合 从本质上讲 接口是一种特殊的抽象类 这种抽象类中只包含常
  • 结构方程模型

    结构方程模型 SEM 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 结构方程模型 SEM 前言 一 什么是结构方程模型 二 在LISREL中使用结构方程模型 1 LISREL介绍 2 LISREL操作 总结 前
  • 2259. 移除指定数字得到的最大结果、字符串

    版本1 class Solution public string removeDigit string number char digit 记录字符出现的位置 int pos0 1 获取第一次字符出现的位置 int i 0 for i lt
  • Keil MDK error :L6031U

    之前编译都是OK 早上重新编译遇到这个样的错误 ASM 2 axf error L6031U Could not open scatter description file ASM 2 sct No such file or directo
  • idea中解决spring配置文件命名空间(namespace)出现红色问题

    在配置dubbo项目时 开始时经常出现dubbo错误 如下图 修改方式已经出现在提示中了 具体这个更改 1 解压dubbo 2 5 4 jar这样的包 具体看你使用的版本 选择 META INF文件夹 解压要到你的目录下 见下图 2 ide
  • imaplib.abort: socket error:EOF 解决方法

    解决方法 设置重复登录 def login self serv None while True try serv imaplib IMAP4 SSL self imap server 993 r d serv login self user
  • ubuntu18安装caffe(CPU)

    1 前言 历时不知多少天 终于在自己电脑上配置好了caffe环境 2 所需环境 1 ubuntu18 04 2 python3 6 默认是只有3 6 3 安装 3 1切换清华源 cp etc apt sources list etc apt
  • chrome浏览器F12调式,修改替换js文件

    在F12模式下 有时可以直接修改js源码 Ctrl S 保存就可以了 但是有时这种方法会不起作用 这里介绍本地替换js的方式 案例 比如csdn想复制别人的一段文字并保留样式 但是字符长度大于140就不起作用了 1 通过右键定位需要修改的j
  • ELK-日志服务【redis-配置使用】

    目录 环境 1 redis配置 2 filebeat配置 3 对接logstash配置 4 验证 5 安全配置 第一种 kibana nginx访问控制 6 第二种 在ES 主节点 配置TLS 7 kibana配置密码 8 logstash
  • 晨光文具去年赚5亿,连2000元都拿来理财

    只要走出学校大门 在不多于500米半径范围内 你都能轻松找到晨光文具的门店 大到一线城市 小到三四线县城 经过20年苦心经营 晨光文具已经做到了这种格局 在这种格局背后 是晨光系7 2万家零售终端的缜密布局 20年来 在国内书写工具以及学生
  • 07:和为给定数

    总时间限制 1000ms 内存限制 65536kB 描述 给出若干个整数 询问其中是否有一对数的和等于给定的数 输入 共三行 第一行是整数n 0 lt n lt 100 000 表示有n个整数 第二行是n个整数 整数的范围是在0到10 8之
  • Linux Suse firewall 查看,关闭,启动

    查看 linux chkconfig list grep i fire 关闭 linux SuSEfirewall2 stop 启动 linux SuSEfirewall2 stop
  • 最小生成树以及Kruskal算法,Prime算法

    一 最小生成树 连通图 在无向图中 若从顶点v1到顶点v2有路径 则称顶点v1与顶点v2是连通的 如果图中任 意一对顶点都是连通的 则称此图为连通图 强连通图 在有向图中 若在每一对顶点vi和vj之间都存在一条从vi到vj的路径 也存在一条
  • 信号处理中简单实用的方法——提取信号中的包络

    一 用希尔伯特变换计算信号的包络 在求某一信号包络时用得最多的是希尔伯特变换 但并不是希尔伯特变换适用于所有信号求包络的情况 这是因为对于包络没有一个很严格的定义 在求包络时不同的情况会有不同的要求 下面将介绍用希尔伯特变换求取信号的包络