《语音信号处理试验教程》(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的。使用CSDN博客查看帮助文件:

Python语音基础操作–2.1语音录制,播放,读取
Python语音基础操作–2.2语音编辑
Python语音基础操作–2.3声强与响度
Python语音基础操作–2.4语音信号生成
Python语音基础操作–3.1语音分帧与加窗
Python语音基础操作–3.2短时时域分析
Python语音基础操作–3.3短时频域分析
Python语音基础操作–3.4倒谱分析与MFCC系数
Python语音基础操作–4.1语音端点检测
Python语音基础操作–4.2基音周期检测
Python语音基础操作–4.3共振峰估计
Python语音基础操作–5.1自适应滤波
Python语音基础操作–5.2谱减法
Python语音基础操作–5.4小波分解
Python语音基础操作–6.1PCM编码
Python语音基础操作–6.2LPC编码
Python语音基础操作–6.3ADPCM编码
Python语音基础操作–7.1帧合并
Python语音基础操作–7.2LPC的语音合成
Python语音基础操作–10.1基于动态时间规整(DTW)的孤立字语音识别试验
Python语音基础操作–10.2隐马尔科夫模型的孤立字识别
Python语音基础操作–11.1矢量量化(VQ)的说话人情感识别
Python语音基础操作–11.2基于GMM的说话人识别模型
Python语音基础操作–12.1基于KNN的情感识别
Python语音基础操作–12.2基于神经网络的情感识别
Python语音基础操作–12.3基于支持向量机SVM的语音情感识别
Python语音基础操作–12.4基于LDA,PCA的语音情感识别

代码可在Github上下载:busyyang/python_sound_open

自适应差分脉冲编码调制(Adaptive Differential Pulse Code Modulation, ADPCM)结合了ADM的差分信号与PCM的二进制编码的方法,采用预测编码来压缩数据量。体现在使用预测技术减少量化编码器输入信号的冗余度,将差值信号编码以提高效率,降低编码信号速率,广泛应用与语音和图像信号的数字化。

自适应量化

在语音信号量化器中,为了适应信号的动态范围,需要把量化阶距选的足够大,另外为了减少量化噪声,有希望减小量化阶距。语音信号在很宽的范围内幅值变化,为了适应这样的变化,就是使用自适应量化器。也就是让量化阶距与输入信号的幅度变化向匹配,一个等效的方法是,在一个固定的量化器前加入一个自适应的增益控制,是的进入量化器的输入信号方差保持为固定常数。

根据对Δ(n)\Delta (n)Δ(n)和G(n)G(n)G(n)的估计方法不同,自适应量化有两类:1. 输入幅值或方差由输入本身估算——前反馈自适应量化器(AQF);2. 量化阶距根据量化器输出x^(n)\hat x(n)x^(n)来进行自适应调整,或等效用输出码字c(n)c(n)c(n)进行自适应调整——反馈自适应量化器(AQB)。

差值脉冲编码调制

差值脉冲编码调制器(DPCM)是指量化器具有两个以上电平的差值量化系统。与直接量化PCM相比,带固定预测器的DPCM系统在信噪比方面可以有4-11dB的改善。在从没有预测到一阶预测时,预测阶数一直增到4或5得到较小的附加增益,信噪比上的增益意味着可用较少位数得到给定的SNR,其位数少于在使用同样量化器直接对话音波形进行量化时所需要的值。例如对于带均匀固定量化器的差值PCM系统来说,与直接作用在输入端的电平数日相同的量化器相比,差值PCM系统信噪比大约要改善6dB。差值方案具有如PCM那样的性能, 即每增加一位码SNR提高6dB,并且信噪比同样依赖于信号电平。类似地,在差值结构中采用p律量化器可使SNR改善6dB,同时其信噪比特性对输入信号也是不敏感的。

由于讲话者和语音内容不同以及语音通信巾罔有的信号电平变化,若要使输入信号电平
在很宽范嗣内变化时系统仍然能达到最好的性能,需要采用自适应预测和自适应量化,种系统因而被称为ADPCM。

自适应差值脉冲编码调制

预测方程为:
xˉ(n)=∑k=1pak(n)x^(n−k)\bar x(n)=\sum^p_{k=1}a_k(n)\hat x(n-k)xˉ(n)=k=1∑p​ak​(n)x^(n−k)

预测器系数自适应时,通常加色短时间内语音信号的性质保持恒定。采用短时间内方均预测误差最小的准则选择预测器系数,最佳预测其系数满足:
Rn(j)=∑k=1pak(n)Rn(j,k),j=1,2,...,pR_n(j)=\sum_{k=1}^pa_k(n)R_n(j,k),j=1,2,...,pRn​(j)=k=1∑p​ak​(n)Rn​(j,k),j=1,2,...,p

Rn(j)=∑m=−∞∞x(m)w(n−m)x(j+m)w(n−m−j),0⩽j⩽pR_n(j)=\sum_{m=-\infty}^{\infty}x(m)w(n-m)x(j+m)w(n-m-j),0\leqslant j\leqslant pRn​(j)=m=−∞∑∞​x(m)w(n−m)x(j+m)w(n−m−j),0⩽j⩽p

import numpy as npdef adpcm_decoder(code, sign_bit):"""APDCM解码函数:param code::param sign_bit::return:"""l = len(code)y = np.zeros(l)ss2 = np.zeros(l)ss2[0] = 1# 生成步长查找表index = [-1, 4]currentIndex = 0startval = 1endval = 127base = np.exp(np.log(2) / 8)# 近似步长const = startval / basenumSteps = int(round(np.log(endval / const) / np.log(base)))n = [i + 1 for i in range(numSteps)]base = np.exp(np.log(endval / startval) / (numSteps - 1))const = startval / basetabel2 = np.round(const * np.power(base, n))for n in range(1, l):neg = code[n] >= sign_bitif neg:temp = code[n] - sign_bitelse:temp = code[n]temp2 = (temp + 0.5) * ss2[n - 1]if neg:temp2 = -temp2y[n] = y[n - 1] + temp2if y[n] > 127:y[n] = 127elif y[n] < -127:y[n] = -127# 计算新的步长currentIndex += index[int(temp)]if currentIndex < 0:currentIndex = 0elif currentIndex > numSteps:currentIndex = numStepsss2[n] = tabel2[currentIndex]return y / 128def adpcm_encoder(x, sign_bit):"""APDCM编码函数:param x::param sign_bit::return:"""x *= 128l = len(x)# 生成步长查找表index = [-1, 4]currentIndex = 1startval = 1endval = 127base = np.exp(np.log(2) / 8)# 近似步长const = startval / basenumSteps = int(round(np.log(endval / const) / np.log(base)))n = [i + 1 for i in range(numSteps)]base = np.exp(np.log(endval / startval) / (numSteps - 1))const = startval / basetabel2 = np.round(const * np.power(base, n))ss = np.zeros(l)ss[0] = tabel2[0]z = np.zeros(l)code = np.zeros(l)d = np.zeros(l)neg = 0for n in range(1, l):d[n] = x[n] - z[n - 1]if d[n] < 0:neg = 1code[n] += sign_bitd[n] = -d[n]else:neg = 0if d[n] >= ss[n - 1]:code[n] += 1if neg:temp = code[n] - sign_bitelse:temp = code[n]temp2 = (temp + 0.5) * ss[n - 1]if neg:temp2 = -temp2z[n] = z[n - 1] + temp2if z[n] > 127:z[n] = 127elif z[n] < -127:z[n] = -127# 计算新的步长currentIndex += index[int(temp)]if currentIndex < 0:currentIndex = 0elif currentIndex > numSteps:currentIndex = numStepsss[n] = tabel2[currentIndex]return code
from chapter2_基础.soundBase import *
from chapter3_分析实验.lpc import lpc_coefffrom chapter6_语音编码.ADPCM import *plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsedata, fs = soundBase('C6_3_y.wav').audioread()
N = len(data)
time = [i / fs for i in range(N)]  # 设置时间
sig_bit = 2ss = adpcm_encoder(data, sig_bit)
yy = adpcm_decoder(ss, sig_bit)plt.subplot(2, 1, 1)
plt.plot(time, data / np.max(data), 'k')
plt.plot(time, yy / np.max(yy), 'c')
plt.title('ADPCM解码')
plt.legend(['信号', '解码信号'])
plt.subplot(2, 1, 2)
plt.plot(data / np.max(data) - yy / np.max(yy))
plt.title('误差')
plt.show()

Python语音基础操作--6.3ADPCM编码相关推荐

  1. Python语音基础操作--4.3共振峰估计

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  2. Python语音基础操作--2.3声强与响度

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  3. Python语音基础操作--10.2隐马尔科夫模型的孤立字识别

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  4. Python语音基础操作--5.1自适应滤波

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  5. Python语音基础操作--10.1基于动态时间规整(DTW)的孤立字语音识别试验

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  6. Python语音基础操作--3.5线性预测分析

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  7. Python语音基础操作--3.2短时时域分析

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  8. Python语音基础操作--11.2基于GMM的说话人识别模型

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  9. python自相关函数提取基音周期_Python语音基础操作--4.2基音周期检测

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

最新文章

  1. Python 爬虫面试题 102 道
  2. 将所有单个json标注文件合并成一个总的json标注文件(COCO数据集格式)
  3. 天翼云从业认证(1.2)存储的概念、体系结构、块存储、对象存储、文件存储以及 RAID 磁盘管理技术
  4. [20131014] 出现错误,显示事务没有回滚
  5. QT中的QTableView+QTableWidget
  6. win7找回开机密码_电脑密码忘记了?教你四步轻松找回电脑开机密码
  7. 一个RSS阅读器的源码,不敢独享!
  8. C++中对字符串的分割方法
  9. Webstorm全版本汉化包
  10. Excel如何批量根据身份证号码查询出地址
  11. QTableView自定义拖拽行
  12. java强行删除文件(针对进程正在使用的文件的删除)
  13. 上海汉枫电子推出能“听”会“说”的物联网Wi-Fi模块
  14. Jquery锚点缓慢移动到目标位置
  15. 计算机存储容量用K还是KB,计算机中容量单位B、KB、MB、GB和TB的关系
  16. 复试机试【XN2018】
  17. 项目十大管理之成本管理
  18. 解决 Vant中 输入框(Field)组件获取不到输入值
  19. 蓝汛之5365脚位图
  20. Linux 修改远程默认端口 22

热门文章

  1. Prometheus如何集成免费电话和短信告警
  2. 二维码也能成为大英博物馆的展品?
  3. linux怎么创建用户登录,如何创建一个不能登录的Linux用户名
  4. Halcon学习---深度学习篇segment2~训练模型。
  5. 我和小伙伴们一起学Unity3D(六)碰撞与触发器
  6. srt编辑的文件在linux显示乱码,修改.srt格式字幕文件
  7. 【修真院java小课堂】ArrayList浅析
  8. Vue中使用e-icon-picker 图标选择组件
  9. 零配置初始化流程就一直过不去_大华可视对讲系统如何配置,一文了解配置细节...
  10. 2018年北航计算机961考研经验