程序设计四:音频的分帧

一:需求分析

为了分析读人数据,通常进行分帧处理。在分帧中,往往设置在相邻两帧之间有一部分重叠。其原因是:语音信号是时变的,在短时范围内特征变化较小,所以作为稳态来处理;但超出这短时范围语音信号就有变化了。在相邻两帧之间基音发生了变化,如正好是两个音节之间, 或正好是声母向韵母过渡,等等,这时,其特征参数有可能变化较大,但为了使特征参数平滑地变化,在两个不重叠的帧之间插一些帧来提取特征参数,这就形成了相邻帧之间有重叠部分。

将本地的采样数据.txt读出,分帧以后保存到另一个.txt文件,需要考虑单声道和双声道

wavtxtframe -i yyy.txt -o zzz.txt -framelength 4 -overlap 2

二:参考知识

1.文件知识

本地.txt信息

lanTian2.txt 声道数1 采样率8000 量化位数2的lanTian2.mav的采样值
BAC009S0003W0121.txt 声道数1 采样率16000 量化位数2的BAC009S0003W0121.wav的采样值

2.分帧介绍

wlen为帧长,inc为帧移,重叠部分为overlap,overlap=wlen - inc

信号帧数为:
nf=(N−overlap) /inc =(N−wlen)/inc+1n f=(N-\text { overlap) } / \text { inc }=(N-w l e n) / i n c+1 nf=(N− overlap) / inc =(N−wlen)/inc+1

nf = int(np.ceil((1.0 * signal_length - wlen + inc) / inc))

np.ceil向上取整,所以会导致实际分帧后的长度大于信号本身的长度,所以要对原来的信号进行补零,类似与FFT变换中的数据点不够补零达到采样点的数量。

pad_length = int((nf - 1) * inc + wlen)  # 所有帧加起来总的铺平后的长度
zeros = np.zeros((pad_length - signal_length,))  # 不够的长度使用0填补,类似于FFT中的扩充数组操作#np.concatenate()连接两个维度相同的矩阵
pad_signal = np.concatenate((signal, zeros))  # 填补后的信号记为pad_signal

三:python代码

holiday04.py
import wave
import numpy as np
import sys
import getoptdef enframe(signal, wlen, inc):'''参数含义:signal:原始音频型号nw:每一帧的长度inc:相邻帧的间隔'''signal_length = len(signal)  # 信号总长度if signal_length <= wlen:  # 若信号长度小于一个帧的长度,则帧数定义为1nf = 1else:  # 否则,计算帧数nf = int(np.ceil((1.0 * signal_length - wlen + inc) / inc))#np.ceil计算大于等于改值的最小整数,将小数点后部分删除pad_length = int((nf - 1) * inc + wlen)  # 所有帧加起来总的铺平后的长度zeros = np.zeros((pad_length - signal_length,))  # 不够的长度使用0填补,类似于FFT中的扩充数组操作#np.concatenate()连接两个维度相同的矩阵pad_signal = np.concatenate((signal, zeros))  # 填补后的信号记为pad_signalindices = np.tile(np.arange(0, wlen), (nf, 1)) + np.tile(np.arange(0, nf * inc, inc), (wlen, 1)).T# 相当于对所有帧的时间点进行抽取,得到nf*nw长度的矩阵#tile() 函数,就是将原矩阵横向、纵向地复制展开indices = np.array(indices, dtype=np.int32)  # 将indices转化为矩阵frames = pad_signal[indices]  # 得到帧信号return frames#返回帧信号矩阵def main(argv):try:#opts, args = getopt.getopt(argv, "-h-i:-f:-o:", ["help", "input=", "framelength", "overlap"])opts, args = getopt.getopt(argv, "-h-i:-o:-f:-l:", ["help", "input=", "output=","framelength=","overlap="])except getopt.GetoptError:print('Error: python holiday04.py -i BAC009S0003W0121.txt -o frame02.txt --framelength 200 --overlap 100')print('   or: python holiday04.py -i BAC009S0003W0121.txt -o frame01.txt -f 200 -l 100')sys.exit(2)# 处理 返回值options是以元组为元素的列表。for opt, arg in opts:if opt in ("-h", "--help"):print("为真实还原,输入的参数尽量和原语音一致")print('python holiday04.py -i BAC009S0003W0121.txt -o frame02.txt --framelength 200 --overlap 100')print('or: python holiday04.py -i BAC009S0003W0121.txt -o frame01.txt -f 200 -l 100')sys.exit()elif opt in ("-i", "--input"):input = argelif opt in ("-o", "--output"):output = argelif opt in ("-f", "--framelength"):framelength = int(arg)print(framelength)elif opt in ("-l", "--overlap"):overlap = int(arg)f = open(input)# f = open("wavData(left).txt")# f = open("lanTian2.txt")# wavData(left)line = f.readline()data_list = []while line:# 把切分出的列表的每个值, 把它们转成np.short型, 并返回迭代器num = list(map(np.short, line.split()))  # np.short# 用list函数把map函数返回的迭代器遍历展开成一个列表data_list.append(num)line = f.readline()f.close()wave_data = np.array(data_list)signal = wave_data.TFrame = enframe(signal[0], framelength, overlap)  # signal[0]是为了保证维度一致file = open(output, 'w+')np.savetxt(file,Frame, fmt='%d', delimiter=' ')file.close()if __name__ == "__main__":# sys.argv[1:]为要处理的参数列表,sys.argv[0]为脚本名,所以用sys.argv[1:]过滤掉脚本名。main(sys.argv[1:])#python holiday04.py -i BAC009S0003W0121.txt -o frame02.txt --framelength 200 --overlap 100
#python holiday04.py -i BAC009S0003W0121.txt -o frame01.txt -f 200 -l 100
#python holiday04.py -i lanTian2.txt -o frame01.txt -f 200 -l 100

四:实现结果

1.请求帮助

python holiday04.py -h

2.单参数分帧

  • -i 输入采样值点的文件
  • -o 保存的文件
  • -f 帧长
  • -l 帧移
python holiday04.py -i BAC009S0003W0121.txt -o frame01.txt -f 200 -l 100

3.多参数分帧

  • -i 输入采样值点的文件
  • -o 保存的文件
  • –framelength 帧长
  • –overlap 帧移
python holiday04.py -i BAC009S0003W0121.txt -o frame02.txt --framelength 200 --overlap 100

五:结果分析

以BAC009S0003W0121.txt的内容用本程序将结果保存,再用matlab直接读取原语音BAC009S0003W0121.wav进行对比,结果为一致

1.matlab对比程序

程序4对比.m

%实验要求一:语音分帧显示
clc
clear all
close all[x,Fs]=audioread('G:\python\holiday\BAC009S0003W0121.wav','native');       % 读入数据文件
wlen=200; inc=100;          % 给出帧长和帧移
N=length(x);                    % 信号长度
time=(0:N-1)/Fs;                % 计算出信号的时间刻度
signal=enframe(x,wlen,inc)';     % 分帧
signal=signal';

2.显示结果

2.1 matlab结果

2.2 python生成的frame01.txt

音频处理四:(音频的分帧)相关推荐

  1. ijkplayer播放器剖析(四)音频解码与音频输出机制分析

    ijkplayer播放器剖析系列文章: ijkplayer播放器剖析(一)从应用层分析至Jni层的流程分析 ijkplayer播放器剖析(二)消息机制分析 ijkplayer播放器剖析(三)音频解码与 ...

  2. matlab抗混叠滤波器,试验四音频抗混叠滤波器设计.doc

    试验四音频抗混叠滤波器设计 实验四 音频抗混叠滤波器设计 [实验目的] 学习用Matlab进行滤波器设计仿真. [实验内容] 题目要求:1)设计Butterworth型音频抗混叠滤波器: 2)参数: ...

  3. 【ffmpeg】最全简单实用教程|安装音频视频剪切融合拼接抽帧等

    ffmpeg 实用教程(非常全) FFmpeg Download(Mac) brew ffmpeg 常用操作(最全最简单) 音频 音频转换格式 多个音频混音 改变音量大小 音频淡入淡出 调整音频速率 ...

  4. Android音频开发(四):音频播放模式

    一.Android音频开发(一):音频基础知识 二.Android音频开发(二):录制音频(WAV及MP3格式) 三.Android音频开发(三):使用ExoPlayer播放音频 四.Android音 ...

  5. 音频处理五:(音频的FFT计算)

    程序设计五:音频的FFT计算 完整工程文件: 链接:https://pan.baidu.com/s/1dcoTGhIeDxsRz-RUr2Paxw 提取码:jy48 一:需求分析 通过使用快速傅立叶变 ...

  6. 语音处理的分帧,帧移,加窗,滤波,降噪,合成

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

  7. 音频特征提取——常用音频特征

    作者:桂. 链接:http://www.cnblogs.com/xingshansi/p/6815217.html 前言 主要总结一下常用的音频特征,并给出具体的理论分析及代码. 一.过零率 过零率的 ...

  8. 音频特征于音频信号提取总结

    这里写目录标题 1 语音的产生简介 2 声音特性​ 3. 声音的种类 计算机听觉的应用 4. 什么是音频特征 5 音频特征的类别 5.1 可以从以下几个角度区分 5.2. 常见音频特征举例 6. 音频 ...

  9. 【Android RTMP】安卓直播推流总结 ( 直播服务器搭建 | NV21 图像采集 | H.264 视频编码 | PCM 音频采集 | AAC 音频编码 | RTMP 包封装推流 )

    文章目录 一. 安卓直播推流专栏博客总结 二. 相关资源介绍 三. GitHub 源码地址 四. 整体 Android 直播推流数据到服务器并观看直播演示过程 Android 直播推流流程 : 手机采 ...

最新文章

  1. 【C#串口编程计划】C#通讯类库构建
  2. 银盛通信与深圳邮政达成合作,全城线下代办点突破1000家
  3. 配置Configuration Manager站点和层次架构(2)
  4. K8s 集群节点在线率达到 99.9% 以上,扩容效率提升 50%,我们做了这 3 个深度改造
  5. Python Django 自定义Manager重写objects.create()方法代码示例
  6. 游戏AI研究(三):路径规划
  7. tcp底层连接过程(c语言)
  8. 工具分享 --- tinyPNG,大图片压缩工具
  9. 程序员面试金典 - 面试题 01.07. 旋转矩阵(一次遍历+位运算)
  10. 备战春招:阿里一面,给了几条SQL,问需要执行几次树搜索操作?
  11. mysql查询语句 查询方式
  12. Android获取通讯录速度,在android中获取联系人非常慢
  13. 联想服务器改win7系统教程,联想IdeaCentre720改win7系统教程及BIOS设置方法
  14. python爬虫判断cookie过期_当爬虫遇到cookie失效,怎样处理?
  15. 计算机一级在线模拟试题,全国计算机等级考试一级模拟试题(一)
  16. PCAN监测can总线状态设置
  17. java设置一个内部类child_java的内部类及匿名内部类
  18. 学习神经网络(深度学习)电脑的配置要求
  19. 微信小程序获取用户信息后的解密操作
  20. 如何进行计算机系统安装教程,电脑怎么重装系统:系统安装教程

热门文章

  1. Codeforces Gym 101630J Journey from Petersburg to Moscow (最短路)
  2. python准备_python环境准备
  3. python 枚举相等判断_离散数学实验_python
  4. 客户端相关知识学习(五)之什么是webView
  5. 记一次与iframe之间的抗争
  6. CSS3基础03(3D②) 求粉丝
  7. Linux文件锁flock
  8. 【转】 (C#)利用Aspose.Cells组件导入导出excel文件
  9. 离散信号经过FFT处理后,幅度,相位,功率的计算
  10. RxJava2 源码解析(一)