【Matlab】语音信号分析与处理实验报告

news2024/11/8 14:15:02

一、目的

使用Matlab分析与设计实验,理解与掌握以下知识点:
1、信号的采样、频谱混叠
2、信号的频谱分析
3、信号的幅度调制与解调方法
4、理想滤波器的时域和频域特性
5、数字滤波器的设计与实现

二、内容

1、录制一段个人的语音信号
2、采用合适的频率,对录制的信号进行采样,画出采样前后语音信号的时域波形和频谱图
3、给原始语音信号加噪声,画出加噪声后的语音信号的时域波形和频谱图
4、在频域内进行分析和设计一个理想带通传输信道
5、对3所述的语音信号进行幅度调制,画出调制后的语音信号的时域波形和频谱图
6、利用4给出的理想带通信道对信号进行传输
7、在接收端对接收到的信号进行解调,画出解调后的语音信号的时域波形和频谱图
8、设计性能良好的滤波器对7得到的信号进行滤波,画出滤波后的语音信号的时域波形和频谱图
9、对原始(加噪声前)语音信号进行回放,并与8所得到滤波后的语音信号进行对比(时域波形、频谱图、听觉等)

三、系统架构设计

图1:系统架构设计

四、设计原理及步骤

1. 降采样

语音信号是一种模拟信号,但它在存储到计算机中时会被转化为数字信号,此时的采样频率比较高。在实际使用时,我们并不需要这么高的采样频率。因此,需要对语音信号进行降采样。
在确定降采样频率时,必须要考虑到两点。其一,根据奈奎斯特理论,采样频率必须高于声音信号最高频率的两倍,这样才能把数字信号表示的声音还原成为原来的声音。在实际应用中,一般取信号频率上限的35倍作为采样频率。在正常情况下,人声带发出的声音在3003400 Hz[1],因此对于单纯的语音信号来说,采样频率大于10.2kHz即可。其二,考虑到后面有调制与解调的过程,且载波频率必须小于采样频率的一半,因此适当将采样频率提高为21kHz。
降采样前后的语音信号的时域波形和频谱图如下:
图2:原始语音信号的时域波形和频谱图
图3:降采样后的语音信号的时域波形和频谱图

2. 高斯白噪声

高斯白噪声是分析信道加性噪声的理想模型,它的瞬时值服从高斯分布,而它的功率谱密度服从均匀分布。在Matlab中,wgn函数可以用于产生高斯白噪声,而awgn函数可以用于在某一信号中加入指定信噪比的高斯白噪声。信噪比是指一个电子设备或者电子系统中信号与噪声的比例。一般来说,信噪比越大,混在信号里的噪声越小,声音回放的音质越高,否则相反。
此外,在Matlab中也可以使用randn函数来产生高斯白噪声。这种方法利用了高斯白噪声的幅度分布服从高斯分布的特点,可以方便地指定它的均值和方差。
加入高斯白噪声后的语音信号的时域波形和频谱图如下:
图4:加噪声后的语音信号的时域波形和频谱图

3. 调制

使用振幅调制(AM)的方法对加噪声后的语音信号进行调制:将语音信号与一直流信号相加,再与载波信号相乘。与双边带调制(DSB)相比,振幅调制可在接收端省去本地载波,降低接收机的成本。
振幅调制后的语音信号的时域波形和频谱图如下:
图5:振幅调制后的语音信号的时域波形和频谱图
图5中的两个频谱图在本质上是一样的。其中,频谱图2是对频谱图1的纵坐标范围加以限制得到的。从图中我们可以发现,由于载波信号是一个cos函数,它的傅里叶变换是冲激函数的形式,有非常大的能量,在频谱图中的幅度远远大于其他频率的信号。因此,振幅调制虽然可以降低接收机的成本,但付出的代价是要使用价格昂贵的发射机,提供足够强的信号Acos(w0t)的附加功率。但这也是合算的,因为往往对于大批的接收机来说,只有一个发射机。

4、理想带通传输信道的设计

也即设计一个理想带通滤波器。带通滤波器是指能通过某一频率范围内的频率分量,但将其他的频率分量衰减到极低水平的滤波器。一个理想的带通滤波器应该有一个完全平坦的通带,在通带内没有放大或者衰减,并且在通带之外所有频率都被完全衰减掉。因此,理想的带通滤波器不能使用Matlab中的Filter Designer工具箱直接进行设计。可以使用窗函数(矩形窗boxcar)法设计FIR滤波器,也可以在频域中直接对语音信号的频谱进行操作。
语音信号通过理想带通传输信道进行传输后,其时域波形和频谱图如下:
图6:经理想带通信道传输后的语音信号的时域波形和频谱图

5. 解调

对振幅调制(AM)的信号进行解调有很多种方法。如果载波信号是确定的,则通常可以采用同步检波的方式。这种方式的信噪比最好,对信号中混入的噪声的抑制能力也最强[3]。上文中提到的双边带调制(DSB)的信号也可以使用这种方法进行解调。但是,当载波信号未知时,同步检波的方法就不再适用了。此时,利用调幅信号的包络反映调制信号波形变化的这一特点,可以使用包络检波的方法进行解调。在本次作业中,为更加贴近实际情况,选择使用包络检波的方法。
包络检波是基于滤波检波的振动信号处理方法,尤其对初期故障和信噪比较低的故障信号识别能力强[2]。将一段时间长度的高频信号的峰值点连线,就可以得到分别位于上方和下方的两条线,这两条线就叫做包络线。而上方的包络线减去调制时加入的直流分量,就可以方便地得到原始信号。
此外,必须注意到的是,由于包络检波器的非线性解调作用,导致包络检波存在着门限效应。在信噪比较小的情况下,调制信号无法与噪声分开,有用信号被淹没在噪声之中,检波器的输出信噪比急剧下降,解调效果很差。由于2中在加入高斯白噪声时选择的信噪比较大,因此可以使用包络检波的方法来进行解调。
图7:解调后的语音信号的时域波形和频谱图
图7中的两个频谱图在本质上是一样的。其中,频谱图2是对频谱图1的纵坐标范围加以限制得到的。观察结果可以发现,解调后的频谱图中出现了一些原本并不存在的高频分量(还有少部分意外的频率分量是低频的)。这可能是由包络检波中的“插值”步骤引起的,因为插值过程存在着一定的随机性,插值结果可能不够“光滑”。上图在计算时使用的是三次样条插值方法(spline),这是Matlab支持的所有插值方法中最光滑的插值方法。下面对不同插值方法得到的频谱图进行简单对比。
图8:临近插值(nearest)
图9:分段线性插值(linear)
图10:三次多项式插值(cubic)
显然,在Matlab的这四种插值方法中,对于本课题来讲,三次样条插值方法(spline)的效果最好。

6. 滤波去噪

根据5中的分析可知,解调过程导致频谱图中产生了一些原本并不存在的高频信号,因此首先应该设计低通滤波器来滤除这些高频信号。对于低通滤波器来说,低频信号能够正常通过,而超过截止频率的高频信号则被阻隔、减弱。观察原始语音信号的频谱图可以发现,该语音信号的能量大多集中在2kHz以内,因此低通滤波器的截止频率可以设置为2kHz。该低通滤波器可以使用Matlab中的Filter Designer工具箱直接进行设计。设计时,Filter Order可选择Minimum Order(最小阶数)。
此外,要滤除高斯白噪声则比较困难。因为高斯白噪声的频谱是遍布在整个语音信号的频谱中的,通常的低通、高通、带通或者带阻滤波器都无法很好地将它滤除。通过搜集资料得知,高斯白噪声可以通过均值滤波、自适应滤波、卡尔曼滤波和维纳滤波等方式滤除。在本课题中选择维纳滤波器来滤除高斯白噪声。
维纳滤波器是一种以最小平方为最优准则的线性滤波器。在一定的约束条件下,其输出可以与一给定函数的差的平方达到最小,通过数学运算最终变为一个托布利兹方程的求解问题[4]。维纳滤波器与神经网络有一定的相似性,它们在使用时都分为两个阶段,一个是训练阶段,另一个是工作阶段。训练阶段的目的是求出维纳滤波器在特定环境下的系数。当得到满意的系数后,即可进入工作阶段,且在工作阶段该系数不会再改变。在工作阶段,则可以对真正待处理的信号进行去噪处理。
经过实验发现,仅使用维纳滤波器对语音信号滤波一次的效果并不令人满意,仍有较多的噪声残留。因此,为保证有效地滤除噪声,对语音信号进行两次维纳滤波。
经过低通滤波和两次维纳滤波后的语音信号的时域波形和频谱图如下:
图11:滤波去噪的语音信号的时域波形和频谱图

7. 语音信号回放

对原始的语音信号和滤波后的语音信号分别进行回放。从听觉的角度来说,滤波后的语音信号中仍然混有部分噪声,且语音信号本身也被削弱了。这可能是因为在使用维纳滤波去除高斯白噪声时,由于它遍布整个频域,导致语音信号也受到了一定的影响。从时域波形来看,可以比较明显地发现噪声并没有被完全地滤除,且原本的语音信号波形也发生了轻微的变化。而从频谱图来看,则可以比较明显地发现6中的低通滤波成功地滤掉了所有高于2kHz的信号,低于2kHz的信号则被比较完整地保留下来了。

总结

从总体上来看,虽然已经较好地完成了作业要求,但仍然有改进的空间。首先,在解调部分使用了包络检波的方法,出现了一些原本并不存在的高频分量。虽然在后期已经使用了低通滤波器进行滤除,但仍然对原始语音信号造成了一定的影响。如果时间允许,应该对其他的解调方式进行探索、尝试和研究,并进一步分析高频分量出现的原因。其次,经过对调制、传输、解调和去噪等过程的模拟后,语音信号本身也被削弱了,可以考虑加入语音信号增强的环节以保证语音信号的质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/672002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity3D制作一个会移动的方块(还不会移动照相机)

学习Unity3D这么久了,如果你还不会制作一个按下WASD就可以移动的方块的话,那么你的学习将没有一点成就感,我学习的时候,我决定先学习移动,这样我就会对Unity更加感兴趣,学习起来的动力会更为充足 先创建一…

Nseeus安装及使用教程

Nessus是一款目前使用较多的系统漏洞扫描与分析软件 文章目录 Nessus下载安装使用启动:https://localhost:8834/ Nessus Nessus是一款目前使用较多的系统漏洞扫描与分析软件 下载 下载链接:https://www.tenable.com/downloads/nessus 安装 傻瓜式安装 使用 最…

Baumer工业相机堡盟工业相机如何使用新版本NEOAPI SDK控制相机数据流的开启和关闭(C++)

Baumer工业相机堡盟工业相机如何使用新版本NEOAPI SDK控制相机数据流的开启和关闭(C) Baumer工业相机Baumer工业相机NEOAPI SDK的技术背景Baumer工业相机使用NEOAPISDK控制相机数据流的方式1.引用合适的类文件2.使用NEOAPISDK控制相机数据流的方式2.使用…

Xshell 连接虚拟机Ubuntu系统失败解决方案

背景知识: Xshell 是一个强大的安全终端模拟软件,可以进行远程登录,它支持 SSH1, SSH2, 以及 Microsoft Windows 平台的 TELNET 协议。 xshell通过ip连接,所以需要知道虚拟机的IP地址 使用XShell的主要目的是在Windows环境下登…

leetcode111. 二叉树的最小深度(java)

二叉树的最小深度 leetcode111. 二叉树的最小深度题目描述 DFS 深度优先遍历解题思路代码演示 BFS 广度优先遍历解题思路代码演示 往期经典 leetcode111. 二叉树的最小深度 来源:力扣(LeetCode) 链接:https://leetcode.cn/problem…

基于立创EDA的原理图设计

目录 学习目标 一、开发中原理图的作用 1.1 原理图 1.2 产品开发原理图设计阶段 1.3 原理图中的具体工作内容 二、 立创EDA软件使用基础 2.1 立创EDA电路设计软件 2.2 新建工程 2.3 设计元件原理图封装 三、项目实战(单片机最小系统) 学习目标…

Kaggle 比赛总结:BirdCLEF 2023

赛题名称:BirdCLEF 2023赛题任务:识别音景中的鸟叫声赛题类型:语音识别 https://www.kaggle.com/competitions/birdclef-2023文章目录 一、比赛背景二、比赛任务三、评价方法四、优胜方案4.1 第一名4.2 第二名4.3 第三名4.4 第四名4.5 第五名…

SpringCloud Alibaba入门2之用户子模块开发

在上一章的基础上进行子模块的开发SpringCloud Alibaba入门之创建多模块工程_qinxun2008081的博客-CSDN博客 一、引入SpringBoot 我们在父项目统一管理引入的jar包的版本。我们采用父项目中以depencyMangement方式引入spring-boot,子项目依赖parent父配置即可。 &…

CTFshow-pwn入门-前置基础pwn29-pwn31

什么是PIE 由于ASLR是一种操作系统层面的技术,而二进制程序本身是不支持随机化加载的,便出现了一些绕过方法,例如ret2plt、GOT劫持、地址爆破等。于是,人们于2003年引入了位置无关可执行文件(Position-Independent Ex…

24. Vue防抖,禁止double click

Vue 防抖 如果按钮不做防抖限制,用户手滑或者其他场景大概率会出现重复调用接口的情况,比如编辑角色时,多次点击submit,会出现非预期请求。 为避免重复点击问题,可以加一个自定义组件将按钮禁用一段时间。 监听click时…

详解Java锁对象

1、Synchronized 1.1、synchronized特性 1、互斥 synchronized会起到互斥效果,某个线程执行到某个对象的synchronized中时,其他线程如果也执行到同一个对象synchronized就会阻塞等待。 *进入synchronized修饰的代码块,就相当于加锁。 *退…

10.安装dashboard

有了之前我们部署的 keystone 、 glance 、 nova 、 neutron 服务之后,我们就可以启动云主机了,但是如果只是使用命令来操作OpenStack 的话非常不方便,我们使用OpenStack 搭建云平台就是为了把底层所有资源整合在一起,然后以一种方…

html5前端学习2

一篇思维题题解: 第五周任务 [Cloned] - Virtual Judge (vjudge.net) http://t.csdn.cn/SIHdM 快捷键: CtrlAltDown 向下选取 CtrlAltUp 向上选取(会出现多个光标,可以同时输入) CtrlEnter …

linux 内核资源配置--cgroups详解以及在docker中的应用

一、Cgroup 概述 1.1、cgroups 是什么 Linux cgroup (Control Groups)是 Linux 内核提供的一种机制,用于限制进程组使用的资源(如 CPU、内存、磁盘 I/O 等)。通过将进程组划分为层次结构,并将资源限制应用…

【操作系统】2、进程与线程

【重要考点】 1. 进程与线程 进程与线程的基本概念 进程与线程的状态 转换 ——五态图,七态图 线程的实现: 内核级 用户级 进程与线程的组织和控制 进程间通信IPC: 共享内存、消息传递、管道 2.CPU调度与上下文切换 调度的基本概念 调度的实…

39.SpringCloud—配置管理nacos、远程调用Feign、服务网关Gateway

目录 一、SpringCloud。 (1)Nacos配置管理。 (1.1)统一配置管理。 (1.2)配置热更新(自动更新,不需要重启服务)。 (1.3)多环境配置共享。 &a…

【C++篇】初识C++

友情链接:C/C系列系统学习目录 知识点内容正确性以C Primer(中文版第五版)、C Primer Plus(中文版第六版)为标准,同时参考其它各类书籍、优质文章等,总结归纳出个人认为较有逻辑的整体框架&…

E. Tracking Segments - 二分+前缀和

分析&#xff1a; 记录所有区间和给定的每一次的询问&#xff0c;二分询问的最小满足条件&#xff0c;可以通过前缀和来计算区间内有几个1。 代码&#xff1a; #include <bits/stdc.h>#define x first #define y secondusing namespace std;typedef long long ll; type…

​面试官疯了:while(true)和for(;;)哪个性能好?

△Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 427 篇原创分享 作者 l Hollis 来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09; while(true)和for(;;)都是做无限循环的代码&#xff0c;他俩有啥区别呢&#xff1f; 我承认这个问题有点无聊&#…

四、Docker镜像

学习参考&#xff1a;尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、Docker镜像1.1 概念1.2 UnionFS&#xff08;联合文件系统&#xff09;1.3 Docker镜像加载原理1.4 重点理解 二、docker commit 命令2.1 是什么&#xff1f;2.2 命令…