为什么要用MFCC?即使不应用于人类语音领域
理解Mel频谱图
语音合成中的Mel谱和MFCC谱无区别
一些参数
pre_emphasis = 0.97 #经过预加重处理后的结果为y(n))=x(n)-ax(n-1),这里取a=0.97
NFFT = 512 #窗宽
nfilt = 40 #滤波器数
num_ceps = 12 #L阶梅尔参数默认

大体过程

  1. #–预先处理y(n))=x(n)-ax(n-1)
  2. #–将信号转为帧
  3. #–定义函数对原信号的每一帧进行变换,应该是为了消除关联性
  4. #–加上汉明窗
  5. #–傅立叶变换得到幅度谱,功率谱等于每一点的幅度平方/NFFT
  6. #–将频率转换为Mel
  7. #–DCT变换
  8. #–升倒谱系数
    一个音频最终得到一个(77,13)的mfcc系数阵,77个帧(帧数和你所定的帧大小和信号长度有关),每帧13阶系数(一个对数系数,12个梅尔倒谱系数)

代码主要使用了https://www.cnblogs.com/dylancao/p/9790707.html
但是我自己加了一阶系数,原代码没有保留对数系数,改了下

   #!/usr/bin/python# -*- coding: UTF-8 -*-import numpy
import scipy.io.wavfile
from matplotlib import pyplot as plt
from scipy.fftpack import dctpre_emphasis = 0.97   #经过预加重处理后的结果为y(n))=x(n)-ax(n-1),这里取a=0.97
NFFT = 512   #窗宽
nfilt = 40   #滤波器数
num_ceps = 12  #L阶梅尔参数
low_freq_mel = 0
sample_rate,signal=scipy.io.wavfile.read('D:/日本/藤村流程/reference/IDMT-ISA-ELECTRIC-ENGINE/train_cut/engine1_good/pure_0.wav')  #采样频率,信号print(sample_rate,len(signal))#读取前3.5s 的数据
#signal=signal[0:int(3.5*sample_rate)]
print(signal.shape)#--预先处理将信号转为帧emphasized_signal = numpy.append(signal[0], signal[1:] - pre_emphasis * signal[:-1])   #第一个信号signal[0]不进行处理
print('em_signalshape', emphasized_signal.shape)
frame_size=0.025
frame_stride=0.01
frame_length,frame_step=frame_size*sample_rate,frame_stride*sample_rate ##帧长#帧移
signal_length=len(emphasized_signal)  #处理后的信号
frame_length=int(round(frame_length)) #四舍五入后取整
frame_step=int(round(frame_step))
num_frames=int(numpy.ceil(float(numpy.abs(signal_length-frame_length))/frame_step))  #一共多少个帧,分帧完成
print('帧数',num_frames)#--定义函数对原信号的每一帧进行变换,应该是为了消除关联性
pad_signal_length=num_frames*frame_step+frame_length
z=numpy.zeros((pad_signal_length-signal_length))
pad_signal=numpy.append(emphasized_signal,z)indices = numpy.tile(numpy.arange(0, frame_length), (num_frames, 1)) + numpy.tile(numpy.arange(0, num_frames * frame_step, frame_step), (frame_length, 1)).Tframes = pad_signal[numpy.mat(indices).astype(numpy.int32, copy=False)]
print('framelengtth', frame_length)#--加上汉明窗
frames *= numpy.hamming(frame_length) #8列# frames *= 0.54 - 0.46 * numpy.cos((2 * numpy.pi * n) / (frame_length - 1))  # Explicit Implementation **
print('frameshape', frames.shape)#--傅立叶变换和功率谱mag_frames = numpy.absolute(numpy.fft.rfft(frames, NFFT))  # Magnitude 幅度of the FFT
print(mag_frames.shape)
pow_frames = ((1.0 / NFFT) * ((mag_frames) ** 2))  # Power Spectrum #功率谱等于每一点的幅度平方/NFFT
print('功率谱shape', pow_frames.shape)
energy = numpy.sum(pow_frames, 1)  # 对每一帧的能量谱进行求和
energy = numpy.where(energy == 0, numpy.finfo(float).eps, energy)  # 对能量为0的地方调整为eps,这样便于进行对数处理#--将频率转换为Melhigh_freq_mel = (2595 * numpy.log10(1 + (sample_rate / 2) / 700))
mel_points = numpy.linspace(low_freq_mel, high_freq_mel, nfilt + 2)  # Equally spaced平均分配nfilt个三角滤波器 in Mel scale
hz_points = (700 * (10**(mel_points / 2595) - 1))  # Convert Mel to Hzbin = numpy.floor((NFFT + 1) * hz_points / sample_rate)  #滤波器组的中心频率fbank = numpy.zeros((nfilt, int(numpy.floor(NFFT / 2 + 1))))   #滤波器组传递初始化for m in range(1, nfilt + 1):f_m_minus = int(bin[m - 1])   # left下限f_m = int(bin[m])             # center中心f_m_plus = int(bin[m + 1])    # right上限for k in range(f_m_minus, f_m):fbank[m - 1, k] = (k - bin[m - 1]) / (bin[m] - bin[m - 1])for k in range(f_m, f_m_plus):fbank[m - 1, k] = (bin[m + 1] - k) / (bin[m + 1] - bin[m])
filter_banks = numpy.dot(pow_frames, fbank.T)  #滤波器组(能量谱,传递函数)
filter_banks = numpy.where(filter_banks == 0, numpy.finfo(float).eps, filter_banks)  # Numerical Stability
filter_banks = 20 * numpy.log10(filter_banks)  # dB对数
print('fileterbanks.shape',filter_banks.shape)#--DCT
mfcc = dct(filter_banks, type=2, axis=1, norm='ortho')[:,  : (num_ceps + 1)]  #DCT离散余弦变换,第一个之后用能量的对数来代替
(nframes, ncoeff) = mfcc.shape#升倒谱系数
n = numpy.arange(ncoeff)
cep_lifter =22 #默认为22
lift = 1 + (cep_lifter / 2) * numpy.sin(numpy.pi * n / cep_lifter) #升倒谱系数
mfcc *= lift  #*
log13 = numpy.log(energy)
mfcc [:,0] = numpy.log(energy)#filter_banks -= (numpy.mean(filter_banks, axis=0) + 1e-8)
mfcc -= (numpy.mean(mfcc, axis=0) + 1e-8)
print('mfcc',mfcc)
print('mfcc。shape=(帧数,阶数)',mfcc.shape)
plt.plot(filter_banks)plt.show()

不懂待改动的点
另外MFCC还有一个delta动态特征的过程,暂时没管。
另外还看到有的MFCC算了这些:13个MFCC+13个一阶微分系数+13个加速系数,一共39个系数
不知道这多出来的系数是个啥子意思。。。

更新
发现另外26个系数还是很有用的,于是加上…
一阶13个系数就是对原13个系数进行求微分的操作…
二阶对一阶求。
作用如下:The MFCC feature vector describes only the power spectral envelope of a single frame, but it seems like speech would also have information in the dynamics i.e. what are the trajectories of the MFCC coefficients over time. It turns out that calculating the MFCC trajectories and appending them to the original feature vector increases ASR performance

关于MFCC的一些笔记(python)相关推荐

  1. scrapy笔记——python的时间转换

    1 import datetime 2 GMT_FORMAT = '%M %H %d %m %w' 3 datetime.datetime.utcnow().strftime(GMT_FORMAT) ...

  2. 机器学习实战笔记(Python实现)-04-Logistic回归

    转自:机器学习实战笔记(Python实现)-04-Logistic回归 转自:简单多元线性回归(梯度下降算法与矩阵法) 转自:人工神经网络(从原理到代码) Step 01 感知器 梯度下降

  3. Python笔记 - Python切片

    Python笔记 - Python切片 Python切片是对一个列表取其部分元素获得一个子序列的常见操作,切片操作的返回结果类型与被切片的对象一致.要创建一个已有列表的切片,通过指定切片的第一个列表元 ...

  4. LEETCODE-刷题个人笔记 Python(1-400)

    按tag分类,250/400的重点题目 LEETCODE-刷题个人笔记 Python(1-400)-TAG标签版本 1.Two Sum(easy) 给定一个整型数组,找出能相加起来等于一个特定目标数字 ...

  5. python语言的33个保留字的基本含义_Python学习笔记——Python的33个保留字及其意义,python,pythone33,含义...

    Python学习笔记--Python的33个保留字及其意义,python,pythone33,含义 发表时间:2020-03-27 笔记走起 正文 序号 保留字 含义 1 and 用于表达式运算,逻辑 ...

  6. LEETCODE-刷题个人笔记 Python(1-400)-TAG标签版本(二)

    前面一篇由于文字太多,不给编辑,遂此篇出炉 LEETCODE-刷题个人笔记 Python(1-400)-TAG标签版本(一) DFS&BFS (262)200. Number of Islan ...

  7. 【笔记】Python学习(廖雪峰)笔记①——Python基础知识

    Python学习(廖雪峰)笔记①--Python基础知识 Python 基础知识 字符串与编码 ASCII.Unicode.UTF-8 Python字符串 格式化 使用list和tuple list( ...

  8. 机器学习实战笔记(Python实现)-03-朴素贝叶斯

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

  9. 读书笔记——Python第一个程序Hello world

    2019独角兽企业重金招聘Python工程师标准>>> 开始学习python,随手写那么点笔记 ------------------------------------------- ...

最新文章

  1. 史上最强女游戏程序员
  2. Custom Client Side Drag and Drop Behavior in ASP.NET AJAX
  3. 新遇到的系统编译问题!已解决!
  4. Leetcode 118. 杨辉三角 (每日一题 20210901)
  5. 细说websocket快速重连机制
  6. centOs 7.2*64 ECS nginx安装教程
  7. java运算符优先级举例_列举出java运算符的优先级
  8. 重复数据_MongoDB 自动过滤重复数据
  9. kafka应用场景Kafka VS Flume
  10. sftp api java_使用JSch实现SFTP文件传输
  11. 最全ASCII码对照表(备用)
  12. 关于 android 中 edittext 特殊字符过滤和字符长度限制的最优方法
  13. GDB 调试命令讲解 2-转
  14. php渐变闪动字体代码,33种超好看彩色闪字渐变代码分享
  15. App Store 付款方式被拒绝
  16. 小米note 卡在android,小米note怎么插卡?小米note详细插卡教程分享
  17. 统计学学习日记:L10-假设检验p值
  18. 2018-2019-1 20189215 书籍速读
  19. 广州的11个辖区_广州市下辖11个区,其中GDP总值超过3000亿元的分别有哪些?
  20. iPhone/iPad 传输文件/照片到电脑 - 实践

热门文章

  1. 机器学习中的范数规则化之(一)L0、L1与L2范数
  2. [数据分析方法论]产品、运营要多懂数据分析?我们给出了以下答案
  3. Python练习——输出10个不重复的英文字母
  4. QMIX: Monotonic Value Function Factorisation for Deep Multi-Agent Reinforcement Learning
  5. 大数据bigdata
  6. r语言各形状编号_R语言的基本图形操作
  7. html文件ps打开,ps文件怎么打开?
  8. [转载]教练,我也想再要一个同桌
  9. agx 安装ros opencv_【ROS开源】Jetson Nano阿克曼转向机器人
  10. 2018X-NUCA------auth2