侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

梅尔倒谱系数(MFCC)实现

技术  /  管理员 发布于 7年前   176

本文实例为大家分享了梅尔倒谱系数实现代码,供大家参考,具体内容如下

""" @author: zoutai@file: mymfcc.py @time: 2018/03/26 @description:"""from matplotlib.colors import BoundaryNormimport librosaimport librosa.displayimport numpyimport scipy.io.wavfilefrom scipy.fftpack import dctimport matplotlib.pyplot as pltimport numpy as np# 第一步-读取音频,画出时域图(采样率-幅度)sample_rate, signal = scipy.io.wavfile.read('OSR_us_000_0010_8k.wav') # File assumed to be in the same directorysignal = signal[0:int(3.5 * sample_rate)]# plot the wavetime = np.arange(0,len(signal))*(1.0 / sample_rate)# plt.plot(time,signal)plt.xlabel("Time(s)")plt.ylabel("Amplitude")plt.title("Signal in the Time Domain ")plt.grid('on')#标尺,on:有,off:无。# 第二步-预加重# 消除高频信号。因为高频信号往往都是相似的,# 通过前后时间相减,就可以近乎抹去高频信号,留下低频信号。# 原理:y(t)=x(t)−αx(t−1)pre_emphasis = 0.97emphasized_signal = numpy.append(signal[0], signal[1:] - pre_emphasis * signal[:-1])time = np.arange(0,len(emphasized_signal))*(1.0 / sample_rate)# plt.plot(time,emphasized_signal)# plt.xlabel("Time(s)")# plt.ylabel("Amplitude")# plt.title("Signal in the Time Domain after Pre-Emphasis")# plt.grid('on')#标尺,on:有,off:无。# 第三步、取帧,用帧表示frame_size = 0.025 # 帧长frame_stride = 0.01 # 步长# frame_length-一帧对应的采样数, frame_step-一个步长对应的采样数frame_length, frame_step = frame_size * sample_rate, frame_stride * sample_rate # Convert from seconds to samplessignal_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)) # Make sure that we have at least 1 framepad_signal_length = num_frames * frame_step + frame_lengthz = numpy.zeros((pad_signal_length - signal_length))pad_signal = numpy.append(emphasized_signal, z) # Pad Signal to make sure that all frames have equal number of samples without truncating any samples from the original signal# Construct an array by repeating A(200) the number of times given by reps(348).# 这个写法太妙了。目的:用矩阵来表示帧的次数,348*200,348-总的帧数,200-每一帧的采样数# 第一帧采样为0、1、2...200;第二帧为80、81、81...280..依次类推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[indices.astype(numpy.int32, copy=False)] # Copy of the array indices# frame:348*200,横坐标348为帧数,即时间;纵坐标200为一帧的200毫秒时间,内部数值代表信号幅度# plt.matshow(frames, cmap='hot')# plt.colorbar()# plt.figure()# plt.pcolormesh(frames)# 第四步、加汉明窗# 傅里叶变换默认操作的时间段内前后端点是连续的,即整个时间段刚好是一个周期,# 但是,显示却不是这样的。所以,当这种情况出现时,仍然采用FFT操作时,# 就会将单一频率周期信号认作成多个不同的频率信号的叠加,而不是原始频率,这样就差生了频谱泄漏问题frames *= numpy.hamming(frame_length) # 相乘,和卷积类似# # frames *= 0.54 - 0.46 * numpy.cos((2 * numpy.pi * n) / (frame_length - 1)) # Explicit Implementation **# plt.pcolormesh(frames)# 第五步-傅里叶变换频谱和能量谱# _raw_fft扫窗重叠,将348*200,扩展成348*512NFFT = 512mag_frames = numpy.absolute(numpy.fft.rfft(frames, NFFT)) # Magnitude of the FFTpow_frames = ((1.0 / NFFT) * ((mag_frames) ** 2)) # Power Spectrum# plt.pcolormesh(mag_frames)## plt.pcolormesh(pow_frames)# 第六步,Filter Banks滤波器组# 公式:m=2595*log10(1+f/700);f=700(10^(m/2595)−1)nfilt = 40 #窗的数目low_freq_mel = 0high_freq_mel = (2595 * numpy.log10(1 + (sample_rate / 2) / 700)) # Convert Hz to Melmel_points = numpy.linspace(low_freq_mel, high_freq_mel, nfilt + 2) # Equally spaced in Mel scalehz_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 Stabilityfilter_banks = 20 * numpy.log10(filter_banks) # dB;348*26# plt.subplot(111)# plt.pcolormesh(filter_banks.T)# plt.grid('on')# plt.ylabel('Frequency [Hz]')# plt.xlabel('Time [sec]')# plt.show()## 第七步,梅尔频谱倒谱系数-MFCCsnum_ceps = 12 #取12个系数cep_lifter=22 #倒谱的升个数??mfcc = dct(filter_banks, type=2, axis=1, norm='ortho')[:, 1 : (num_ceps + 1)] # Keep 2-13(nframes, ncoeff) = mfcc.shapen = numpy.arange(ncoeff)lift = 1 + (cep_lifter / 2) * numpy.sin(numpy.pi * n / cep_lifter)mfcc *= lift #*# plt.pcolormesh(mfcc.T)# plt.ylabel('Frequency [Hz]')# plt.xlabel('Time [sec]')# 第八步,均值化优化# to balance the spectrum and improve the Signal-to-Noise (SNR), we can simply subtract the mean of each coefficient from all frames.filter_banks -= (numpy.mean(filter_banks, axis=0) + 1e-8)mfcc -= (numpy.mean(mfcc, axis=0) + 1e-8)# plt.subplot(111)# plt.pcolormesh(mfcc.T)# plt.ylabel('Frequency [Hz]')# plt.xlabel('Time [sec]')# plt.show()# 直接频谱分析# plot the wave# plt.specgram(signal,Fs = sample_rate, scale_by_freq = True, sides = 'default')# plt.ylabel('Frequency(Hz)')# plt.xlabel('Time(s)')# plt.show()plt.figure(figsize=(10, 4))mfccs = librosa.feature.melspectrogram(signal,sr=8000,n_fft=512,n_mels=40)librosa.display.specshow(mfccs, x_axis='time')plt.colorbar()plt.title('MFCC')plt.tight_layout()plt.show()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    在Qt中正确的设置窗体的背景图片的几种方法总结
    下一条:
    pandas.read_csv参数详解(小结)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客