语音处理加窗分帧

news2024/11/29 10:54:11

语音处理加窗分帧

一、分帧

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

二、帧移

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

三、加窗

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

四、滤波

我们知道,我们处理的语音其实是一种声波,声波是一种物质波。滤波的字面意思理解为过滤一些不同频
率的波。根据傅里叶变换,我们知道任意波可以分解为几种正弦波和余弦波的叠加,从概率论的角度,滤
波即加权。 滤波的作用就是给不同的信号分量不同的权重。最简单的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.coloradmin.cn/o/474047.html

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

相关文章

从FPGA说起的深度学习(八)-数据并行性

这是新的系列教程,在本教程中,我们将介绍使用 FPGA 实现深度学习的技术,深度学习是近年来人工智能领域的热门话题。 在本教程中,旨在加深对深度学习和 FPGA 的理解。 用 C/C 编写深度学习推理代码高级综合 (HLS) 将 C/C 代码转换为…

11款专家级渗透测试工具

导语:在本文中,我们将深入研究渗透测试员用来挫败客户防御系统的工具。 渗透测试员,有时也称“道德黑客”,他们本质上是安全专家,负责对客户的网络或系统发起模拟攻击,以寻找潜在漏洞。他们的目标是展示恶意…

电脑技巧:Windows系统原版纯净软件必备的两个网站

目录 一、MSDN我告诉你 二、helloWindows 三、总结 Windows系统是个人电脑使用最广泛的操作系统,大家可能会遇到下载Windows镜像、SQLServer、Office等官方软件,会遇到各种各样捆绑、广告软件,甚至还有可能电脑被植入病毒的风险。该如何避…

代码随想录算法训练营第四十五天|70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

文章目录 70. 爬楼梯 (进阶)322. 零钱兑换279.完全平方数 今天的题一道是求装满背包的可能情况;另两道都是求装满背包的所需的最小物品数目,不用考虑是组合还是排序问题 70. 爬楼梯 (进阶) 背包问题,求装满…

设置苹果电脑vsode在新窗口中打开文件

0、前言 最近切换到mac电脑工作,又得重新安装一些工具软件并设置。虽然这些设置并表示啥复杂的设置,但是久了不设置还是会忘记。于是记录之,也希望给能帮助到需要的人。 我们使用vscode阅读或者编辑文件时,有时候希望同时打开多…

RabbitMQ 01 概述

什么是消息队列 进行大量的远程调用时,传统的Http方式容易造成阻塞,所以引入了消息队列的概念,即让消息排队,按照队列进行消费。 它能够将发送方发送的信息放入队列中,当新的消息入队时,会通知接收方进行处…

MySQL的JSON 数据类型

概述: MySQL提供了一个专门用于存储JSON数据的数据类型:JSON。JSON数据类型允许您在MySQL数据库中存储和操作JSON格式的数据。 以下是关于JSON数据类型的一些基本操作和函数: 创建表: 要在表中创建一个JSON类型的列&#xff0…

C/C++每日一练(20230429)

目录 1. 螺旋矩阵 🌟🌟 2. 戳气球 🌟🌟🌟 3. 实现五则运算 🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1…

从0搭建Vue3组件库(十):如何搭建一个 Cli 脚手架

本篇文章将实现一个名为create-easyest脚手架的开发,只需一个命令npm init easyest就可以将整个组件库开发框架拉到本地。 创建 Cli 包 首先,我们在 packages 目录下新建 cli 目录,同执行pnpm init进行初始化,然后将包名改为create-easyest 这里需要知道的是当我们执行npm in…

layui框架实战案例(21):layui上传的哪些事(layui.upload组件、 file文件域、php后台上传)

上传的哪些事 一、核心方法与基础参数选项二、使用upload组件1.调用layui.upload2.文件上传进度条3.弹出进度条4.完整核心代码5.效果预览6.后台上传代码7.附带参数data 一、核心方法与基础参数选项 upload.render({elem: #uploadlicense//指向容器选择器, url: ?mIndex&ai…

Python每日一练(20230429)

目录 1. 地下城游戏 🌟🌟🌟 2. 杨辉三角 II 🌟 3. 旋转数组 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

HCIA-RS实验-路由配置-静态路由缺省路由(2)

接上文HCIA-RS实验-路由配置-静态路由&缺省路由 继续完成缺省路由;其他原截图就不再一一截图,有需要往回看一篇。 关闭上一篇的接口shutdown(重新启动) 上一篇在R2关闭的接口2 需要重新启动,输入 undo shutdown…

React--》Redux Toolkit的使用讲解

目录 Redux Toolkit redux toolkit的基本使用 RTK代码模块化 RTK QUERY的使用 useQuery参数 Redux Toolkit Redux Toolkit是Redux的工具包,简称RTK,可以帮助我们处理使用Redux过程中的重复性工作,简化Redux中的各种操作,当然…

< 每日小技巧: 基于Vue状态的过渡动画 - Transition 和 TransitionGroup>

》基于Vue状态的过渡动画 - Transition 和 TransitionGroup &#x1f449; 一、Vue Transition 简介> Transition 和 TransitionGroup 之间的区别 &#x1f449; 二、<Transition> 组件> 触发 <Transition> 组件的场景&#xff1a;> 基于 CSS 的过渡效果&…

LeetCode:面试题 02.07. 链表相交

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 题解目录 一、&#x1f331;[面试题 02.07. 链表相交](https://leetcode.cn/problems/in…

Python可视化学习——使用JSON进行数据转换、pyecharts模块调用以及可视化案例的介绍(可视化案例数据暂无),柱状图及动态柱状图的构建

数据可视化 可视化效果一&#xff1a;2020年印美日新冠累计确诊人数 2020年是新冠疫情爆发的一年&#xff0c;随着疫情的爆发&#xff0c;国内外确诊人数成了大家关心的热点&#xff0c;相信大家都有看过类似的疫情报告.本案例对印度美国日本三个国家确诊人数的进行了可视化处…

术数基础背诵口诀整理

物象对应 五行方位天干神兽季节气候星宿生成数脏器木东甲乙青龙春风岁八肝火南丙丁朱雀夏热荧惑七心土中戊己&#xff1f;长夏湿镇五脾金西庚辛白虎秋燥太白九肺水北壬癸玄武冬寒辰六肾 口诀&#xff1a;东方甲乙青龙木&#xff0c;南方丙丁朱雀火&#xff0c;戊己勾陈腾蛇土&…

第一章 Java基础 50 道面试题

文章目录 前言匿名内部类访问的局部变量为什么必须要用final修饰? Java基础1、jdk和jre有什么区别&#xff1f;2、final在Java中有什么作用&#xff1f;3、有常量类了为什么还要使用枚举类&#xff1f;4、为什么使用包装类&#xff1f;5、和equals的区别是什么&#xff1f;6、…

Mysql-最左前缀法则以及索引失效情况

最左前缀法则 如果索引了多列&#xff08;联合索引&#xff09;&#xff0c;要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始&#xff0c;并且不跳过索引中的列。如果跳跃某一列&#xff0c;索引将会部分失效(后面的字段索引失效)。 以 tb_user 表为例&#xff…

前端面试题(持续更新中)

【1】null和undefined的区别 同&#xff1a; 1.都是js的基本类型&#xff0c;保存在栈中&#xff0c;表示“无、没有”的意思。 2.if语句中的null和undefined都是false。 var a undefined var b null if (!a) {console.log(undefined is false); } if (!b) {console.log(null…