语音处理加窗分帧

语音处理加窗分帧

一、分帧

语音数据和视频数据不同,本没有帧的概念,但是为了传输与存储,我们采集的音频数据都是一段一段
的。为了程序能够进行批量处理,会根据指定的长度(时间段或者采样数)进行分段,结构化为我们编程
的数据结构,这就是分帧。

二、帧移

由于我们常用的信号处理方法都要求信号是连续的,也就说必须是信号开始到结束,中间不能有断开。然
而我们进行采样或者分帧后数据都断开了,所以要在帧与帧之间保留重叠部分数据,以满足连续的要求,
这部分重叠数据就是帧移。

三、加窗

介绍帧移的时候我们说了,我们处理信号的方法都要求信号是连续条件,但是分帧处理的时候中间断开
了,为了满足条件我们就将分好的帧数据乘一段同长度的数据,这段数据就是窗函数整个周期内的数据,
从最小变化到最大,然后最小。

四、滤波

我们知道,我们处理的语音其实是一种声波,声波是一种物质波。滤波的字面意思理解为过滤一些不同频
率的波。根据傅里叶变换,我们知道任意波可以分解为几种正弦波和余弦波的叠加,从概率论的角度,滤
波即加权。 滤波的作用就是给不同的信号分量不同的权重。最简单的loss pass filter, 就是直接把低
频的信号给0权重,而给高频部分1权重。对于更复杂的滤波,比如维纳滤波, 则要根据信号的统计知识来
设计权重。

当允许信号中较高频率的成分通过滤波器时,这种滤波器叫做高通滤波器。
当允许信号中较低频率的成分通过滤波器时,这种滤波器叫做低通滤波器。
当只允许信号中某个频率范围内的成分通过滤波器时,这种滤波器叫做带通滤波器。
当不允许信号中某个频率范围内的成分通过滤波器时,这种滤波器叫做带阻滤波器。

五、降噪

从统计信号处理的角度,降噪可以看成滤波的一种。降噪的目的在于突出信号本身而抑制噪声影响。从这
个角度,降噪就是给信号一个高的权重而给噪声一个低的权重。维纳滤波就是一个典型的降噪滤波器。

六、合成

在语音处理过程,先分帧,再在频域分成各个子带处理,处理后转成时域,合成语声。从描述上看,
语音合成就是和分帧相反的过程,保证信号数据经过我们变换处理后能够回到原来的状态。把每帧各个子
带转换成时间序列后相互叠加合成为一帧数据。

七、具体理解

1、为什么要进行分帧加窗操作?

语音信号为非平稳信号,其统计属性是随着时间变化的,以汉语为例,一句话中包含很多生母和韵母,不同的拼音,发音的特点很明显是不一样的;但是,语音又具有平稳的属性,比如汉语里的一个声母或者韵母,往往只会持续几十到几百毫秒,这一个发音单元里,语音信号表现出明显的稳定性、规律性,在进行语音识别时,对于一句话识别的过程也是以较小的发音单元(音素、字、字节)为单位进行识别的,因此可以用滑动窗来提取短时片段,也即进行分帧加窗操作。

2、如何进行分帧加窗操作?

2.1 相关术语

帧长:一帧语音信号的长度,长度可以用多种方式表示,如果用时间表示,一帧信号通常取在15ms-30ms之间,经验值为25ms(论文上大多数人用)。帧长为25ms的一帧信号指的是时长有25毫秒的语音信号。也可以用信号的采样点数来表示,如果一个信号的采样率为16kHz,则一帧信号由 16kHz * 25ms = 400个采样点组成。

帧移:指的是每次分帧时移动的距离,以第一帧信号的起始点开始移动一个帧移,开始下一帧。同样也可以用两种方式表示,用时间表示,常设为10ms,用采样点表示,16kHz采样率的信号帧移一般为160个采样点。

加窗:分帧后每一帧的开始和结束都会出现间断,因此分割的帧越多,与原始信号的误差就越大,加窗就是为了解决这个问题,使成帧后的信号变得连续,并且每一帧都会表现出周期函数的特性。常见的窗函数有:矩形窗、汉明窗、汉宁窗等,在语音信号处理中,通常使用汉明窗,其公式如下:

img

2.2 分帧加窗的具体操作

首先要根据信号长度、帧移、帧长计算出该信号一共可以分的帧数,帧数的计算公式如下:
帧数 = (信号长度-帧长)➗帧移 +1
具体的分帧操作如下图所示:

img

加窗操作比较简单,仅需将分帧的每一帧信号一次与窗函数进行相乘即可,其中窗函数可以从numpy里直接调用。
在分帧操作时,会遇到最后剩下的信号长度不够一帧的情况,此时需要将对这一段信号进行补零操作,使之达到一帧的长度,或者可以直接将之抛弃,因为最后一帧处于句子最末尾部分,大部分为静音片段。

3 分帧加窗的代码实现

以下是实现分帧加窗的具体代码:

def enframe(signal, frame_len=frame_len, frame_shift=frame_shift, win=np.hamming(frame_len)):
    """
    calculate the number of frames: 
    frames = (num_samples -frame_len) / frame_shift +1
    """

    num_samples = signal.size
    num_frames = np.floor((num_samples - frame_len) / frame_shift)+1  

    # calculate the numbers of frames
    frames = np.zeros((int(num_frames),frame_len))   # (num_frames,frame_len)

    # Initialize an array for putting the frame signals into it
    for i in range(int(num_frames)):
        frames[i,:] = signal[i*frame_shift:i*frame_shift + frame_len]
        frames[i,:] = frames[i,:] * win

    return frames

其中需要注意以下几点:

  • ①signal代表经过预加重后的信号,frame_len为帧长,frame_shift为帧移。
  • ②np.hamming(frame_len)实现了汉明窗函数。
  • ③上面的代码中,如果计算出信号长为5.2帧,则取为5帧,因为最后一帧一般都是静音信号,可以省略。初始化一个存放帧信号的数组frames,然后依次将- signal信号里的数据按照分帧操作赋值给frames。
  • ④如果输入信号的采样率为16kHz,帧长为400个采样点,帧移为160个采样点,则经过分帧加窗后得到的数组的形状为(帧数行,帧长列)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Javaweb | 转发、重定向

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 转发 转发与页面跳转 转发 转发的作用在服务器端,将请求发送给服务器上的其他资源,以共同完成一次请求的处理 页面跳转 使用forward跳转时&am…

拍卖小程序开发:从需求分析到设计实现

在当今数字时代,拍卖小程序已经成为了一个重要的销售和交易工具。拍卖小程序的开发不仅能够提供高效的销售渠道,还能够为用户提供全新的购物体验。因此,开发一个拍卖小程序成为了许多商家的首要任务。 拍卖小程序的开发可以帮助商家拓展销售…

Linux下实现共享内存的两种机制(附源码)

START Hello 大家好。 今天来讲一下Linux进程通信中重要的通信方式:共享内存作为Linux软件开发攻城狮,进程间通信是必须熟练掌握的重要技能,而共享内存是在程序开发中常用的也是重要的一种进程间通信方式。 下面我们就来聊一聊Linux下进程间…

pytest自动化框架之allure测试报告的用例描述设置

allure测试报告的用例描述相关方法;如下图 allure标记用例级别severity 在做自动化测试的过程中,测试用例越来越多的时候,如果执行一轮测试发现了几个测试不通过,我们也希望能快速统计出缺陷的等级。 pytest结合allure框架可以对…

每日学术速递4.26

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.AutoNeRF: Training Implicit Scene Representations with Autonomous Agents 标题:AutoNeRF:使用自主代理训练隐式场景表示 作者:Pierre Marz…

SaaS云HIS系统源码功能介绍

SaaS云HIS首页功能:包括工作计划、预警、主功能菜单、医院机构公告。 一、工作计划 1.值班概况:值班日期、值班时间、值班科室(内科、外科等) 2.待处理患者:内科人数、外科人数等 病历统计:入院病历、出…

华为面试题:1+4=5,2+5=12,3+6=21,问8+11=?网友:幼儿园级别

面试,一直都是职场人士绕不过去的坎,对于有的人来说,或许更擅长日常的工作,在面试环节可谓是自己的薄弱环节,但对于有的人来说,相比于工作,更擅长应付面试! 最近,有一位…

《面向基于人工智能的学习健康系统,使用心电图进行人群水平的死亡率预测》阅读笔记

目录 一、摘要 二、十个问题 Q1论文试图解决什么问题? Q2这是否是一个新的问题? Q3这篇文章要验证一个什么科学假设? Q4有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员? Q5论文中提到…

过来人转本考试后的感悟和经验,真的很受用

过来人转本考试后的感悟和经验,真的很受用!转本不仅是分数的较量,也是信息收集、时间管理、学习能力、毅力等等的较量。同学们在转本中难免会遇见一些困难,为了避免走弯路,一起来看看过来人的感悟和经验吧!…

项目范围控制:如何控制项目范围的变化?

一个成功的项目需要在进度、成本和质量之间取得平衡。控制项目交付范围是实现这个平衡的关键。然而,项目范围是会变化的,因此控制项目范围变化是必要的。 如何控制项目范围的变化? 1、了解项目的交付范围 项目经理、团队成员、利益相关者和…

verilog手撕代码3——序列检测和序列发生器

文章目录 前言一、序列检测器1.1 重复序列检测1.1.1 序列缓存对比/移位寄存器法1.1.2 状态机法 1.2 非重复序列检测 二、序列发生器2.1 移位寄存器法2.2 反馈法2.3 计数器法 前言 2023.4.25 2023.4.26 学习打卡,天气转晴 一、序列检测器 1.1 重复序列检测 1.1.1 …

等级保护、风险评估和安全测评分别是什么?

2022-06-17 15:17 迈入“等保2.0时代”以后,我国对于等级保护的要求更为严格和具体。等级保护、风险评估和安全测评这三个词,也因此总是出现在人们的视野之中,还总是被混淆。那这三者究竟分别是什么呢?如何区分它们?它…

【Bus】编写一个Demo虚拟的总线-设备-驱动模型

文章目录 1. 前言2. 总线驱动模型三要素2.1 总线2.2 设备2.3 驱动 3. Demo Code3.1 virt_bus_core.c3.2 virt_device.c3.3 virt_driver.c 4. 工程代码下载地址5. 参考资料 1. 前言 Linux平台为了驱动的可重用性,虚拟了很多的虚拟总线。很经典的就是platform总线&am…

如何编写高质量代码、提高编程效率?

一、 前言 高质量代码是指在满足功能需求的基础上,具备高性能、安全、可扩展、易维护、可测试等特点的代码。它不仅可以提高开发效率和代码质量,更能有效减少代码维护成本,促进团队协作和项目成功。因此,编写高质量代码对程序员来…

【Java】什么是SOA架构?与微服务有什么关系?

文章目录 服务化架构微服务架构 我的一个微服务项目,有兴趣可以一起做 服务化架构 我们知道,早期的项目,我们都是把前后端的代码放在同一个项目中,然后直接打包运行这个项目,这种项目我们称之为单体项目,比…

【Vue】Vue-cli,创建项目设置自定义默认配置

Vue2.0,Vue-cli项目配置 步骤一,打开文件夹,导航栏输入cmd,打开命令行窗口步骤二,输入命令步骤三,选择第三个自定义新建项目步骤四,选择需要的项目模块,空格选择完,回车步…

密码学|AES加密算法|学习记录

AES简介 AES加密是分组加密的一种 明文长度为固定的128位 密钥可长度为128,192,256位 128bit16字节,在AES中我们将数据用4x4字节的矩阵表示。(注排列顺序为先从上到下再从左到右) AES的一般步骤 对于上图最终轮区…

CASAIM高精度自动化三维扫描系统检测塑料件,自动检测形位公差

随着塑料工业的迅速发展,以及塑料制品在航空、航天、电子、机械、船舶和汽车等工业部门的推广应用,对塑料件的质量要求也越来越高。 为了检测塑料件的尺寸偏差以及测量关键部位的3D尺寸和形位公差,对影响总成零件精度的产品、工装、工艺进行精…

第十章_Redis集群(cluster)

是什么 定义 由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供在多个Redis节点间共享数据的程序集。 官…
最新文章