import wave
import numpy
from pyaudio import PyAudio
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
import mathwf = wave.open('e:/tests/audio2miditest.wav', 'rb')
# 创建PyAudio对象
p = PyAudio()
stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),channels = wf.getnchannels(),rate = wf.getframerate(),output = True)
nframes = wf.getnframes()
print("nframes",nframes)
framerate = wf.getframerate()# 读取完整的帧数据到str_data中,这是一个string类型的数据
str_data = wf.readframes(nframes)
wf.close()# 将波形数据转换成数组
wave_data = numpy.fromstring(str_data, dtype=numpy.short)
# 将wave_data数组改为2列,行数自动匹配
wave_data.shape = -1,2
# 将数组转置
wave_data = wave_data.T
print("wave_data shape",wave_data.shape)#读取片段数
nsegments=int(wave_data.shape[1]/framerate)
print("nsegments",nsegments)def freqs():# 采样点数,修改采样点数和起始位置进行不同位置和长度的音频波形分析N = 44100df = framerate/(N-1)  # 分辨率freq = [df*n for n in range(0, N)]  # N个元素print("freq",freq)#片段频率数组seg_freqs=[]#钢琴键序号组key_nums=[]for i in range(nsegments):start = i*N  # 开始采样位置end=start+N        wave_data2 = wave_data[0][start:end]c = numpy.fft.fft(wave_data2)*2/N# 常规显示采样频率一半的频谱d = int(len(c)/2)# 仅显示频率在4000以下的频谱while freq[d] > 4000:d -= 10vf_dict=dict(zip(abs(c[:d-1]),freq[:d-1]))max_v=max(abs(c[:d-1]))max_f=vf_dict[max_v]  seg_freqs.append(max_f)print("max f:v",max_f,max_v)#计算最接近的钢琴键号key_num_nearest=round(math.log(max_f/27.5,1.059))+1key_nums.append(key_num_nearest)print("key_nums",key_nums)#可视化plt.rcParams['font.sans-serif']=['SimHei']plt.figure(figsize=(20,20), dpi=90)xs=range(len(seg_freqs))ys=seg_freqs     #频谱ax1 = plt.subplot(211)ax1.plot(xs, ys,color="blue") ax1.set_title("频率时序谱")ax1.set_xlabel("时间 S")ax1.set_ylabel("时点主频率")xs1=range(len(key_nums))ys1=key_nums#钢琴键谱ax2 = plt.subplot(212)ax2.scatter(xs1, ys1,color="red")    ax2.set_xticks(xs1)ax2.set_yticks(range(min(ys1)-1,max(ys1)+1))ax2.set_title("钢琴键时序谱")ax2.set_xlabel("时间 S")ax2.set_ylabel("时点对应钢琴键序号")ax2.grid()plt.show()def main():freqs()if __name__ == '__main__':main()

将wav音频文件频谱分析后映射到钢琴琴键上(类似audio to midi功能)相关推荐

  1. python音频频谱_Python 读取WAV音频文件 画频谱的实例

    Python 读取WAV文件 import wave import struct from scipy import * from pylab import * #读取wav文件,我这儿读了个自己用p ...

  2. python音频频谱_Python读取WAV音频文件 画频谱的方法

    Python 读取WAV文件 import wave import struct from scipy import * from pylab import * #读取wav文件,我这儿读了个自己用p ...

  3. Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件

    第21部分:永久保存Wav音频文件 原文地址:http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Begi ...

  4. 从mp4中提取wav音频文件

    需求: 从mp4文件中提取wav音频文件 运行效果: mp4: 运行后脚本后提取出的wav文件 代码: import os.pathimport moviepy.editor as mpe# 导出格式 ...

  5. C语言解析WAV音频文件

    转载:http://www.cnblogs.com/LexMoon/p/wave-c.html 1.C语言解析WAV音频文件 代码地址: Github : https://github.com/Cas ...

  6. 音频制作与转换—WAV音频文件

    音频制作与转换-WAV音频文件 在音视频制作或转换中,常需要面临如下选择: 是否选择WAV这种音频文件格式:选择何种编码格式:如何设置采样频率(Hz.kHz).采样精度(bit).码率(kBps.比特 ...

  7. java切割wav音频文件

    import it.sauronsoftware.jave.Encoder; import it.sauronsoftware.jave.MultimediaInfo; import java.io. ...

  8. 如何用C语言编写wav读取函数,C++读取WAV音频文件的头部数据的实现方法

    C++读取WAV音频文件的头部数据的实现方法 前言: 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正.写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有 ...

  9. c语言 文件 long double 读取,读取*.wav音频文件

    1.wav音频文件的格式 wav文件由文件头和采样数据2部分组成. 文件头又分为RIFF(Resource Interchange File Format).WAVE文件标识段 和 声音数据格式说明段 ...

最新文章

  1. android进度指示器_等待的痛苦—浏览进度指示器地狱的7个级别
  2. log函数 oracle power_数学函数
  3. linux系统重启网络delaying initialization错误的解决方法
  4. (java ee,Eclipse J2EE最新版官方下载(Eclipse for Java EE Developers)
  5. 果断Mark!Searchcode——源代码搜索利器
  6. bae3.0第三步 添加默认管理后台模块和mysql库
  7. 简单的方法破解百度网盘上带密码的学习视频资源
  8. android+6+wifi密码,Android 如何查看Wifi密码
  9. 火线、地线、零线区别
  10. 文件加密共享防止转发-冷杉云盘
  11. 服务器查看文件口令,查看服务器序列号命令
  12. 太阳能系统容易造成设备短路走火 英研究直流电隔离器为主要原因
  13. PLC运动控制系列之机械回原点(back to origin)
  14. Clojure 学习入门(8)—— 连接mongodb
  15. SSO JA-SIG
  16. 关于SMTP邮件无法发送到 SMTP服务器,传输错误代码为 0x80040217
  17. 闪光网彭亮《我死,我想留下什么》
  18. enc易能变频_ENC易能变频器专修公司
  19. 【读书笔记】《微习惯:瘦身篇》
  20. https自签证书tls握手时错误或go系统错误处理

热门文章

  1. OpenCV:图片文字分割
  2. python京东注册账号_玩转京东支付(python)
  3. 关于ROS+Gazebo通过cmd_vel或键盘控制节点发布速度消息时,仿真小车运动速度相反问题
  4. git pull时遇到的问题
  5. 八年级作文-断了的弦
  6. 一文讲透,商业智能BI的未来形态,发展现状及前景分析|推荐收藏
  7. UART2USB芯片PL2303驱动安装说明
  8. 关于vue移动端下载图片
  9. 爪爪博士:小奶猫感冒发烧怎么降温才有效
  10. 电网数字化转型经验分享