在进行频谱分析时,发现MATLAB和python读取wav文件的波形不一致,导致不能得出正确结果,为了验证MATLAB和python哪部分有问题,于是有了这篇博客。

1、需求分析

   用MATLAB生成一个正弦波并保存为wav文件,然后用python读取这个wav文件画出波形,查看python读取出来的波形和matlab生成的波形是否一致。

2、代码实现

2.1 MATLAB生成wav文件

Df=5;     %频率间隔
fs = 8000; %采样频率
T = 1/fs; %采样周期
N=fs/Df;    %序列点数
time = (N-1)./fs; %第一个声音片段的总时长
t=0:T:(N-1)./fs;
y = sin(2*pi*200*t); %生成第一个声音片段,注意需要用db2mag()函数把dB转换成magnitude。sound(y,fs) %可以播放声音的函数 sound()
filename = ('sinwave.wav'); %给文件取名
plot(t,y)
audiowrite(filename,y,fs) %存储.wav音频文件,在这里文件名为sinwave.wav

其中生成的正弦波波形如下图所示:

2.2 python读取wav文件

import wave
import numpy as np
import pylab as plt#打开wav文件 ,open返回一个的是一个Wave_read类的实例,通过调用它的方法读取WAV文件的格式和数据。
f = wave.open(r"E:\练习\音频信号处理\spectrum.m\sinwave.wav","rb")
#读取格式信息
#一次性返回所有的WAV文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采
#样频率, 采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
#读取波形数据
#读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位)
str_data  = f.readframes(nframes)
f.close()
#将波形数据转换成数组
#需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组
wave_data = np.fromstring(str_data,dtype=np.short)
#通过取样点数和取样频率计算出每个取样的时间。
time=np.arange(0,nframes)/framerate
print(params)
print(wave_data.max())#找出正弦波的峰值
#time 也是一个数组,与wave_data[0]或wave_data[1]配对形成系列点坐标
plt.plot(time,wave_data/32768)
plt.show()

python读取wav文件显示出来的正弦波如下图所示:

python读取wav文件的信息及求出波形峰值的结果如下图所示:

我们可以看出峰值为32767(该wav文件有16bit,且带一个符号位。215=32768215=32768{{2}^{15}}\text{=}32768 ),我们进行归一化处理后的到波形如下图所示:

由上图可以看出MATLAB生成的正弦波保存为wav文件后,python读取该wav文件。两种语言下正弦波相同。

matlab生成wav文件并用python验证相关推荐

  1. python语音合成并播放_使用Python实现文字转语音并生成wav文件的例子

    目前手边的一些工作,需要实现声音播放功能,而且仅支持wav声音格式. 现在,一些网站上支持文字转语音功能,但是生成的都是MP3文件,这样还需要额外的软件来转成wav文件,十分麻烦. 后来,研究Pyth ...

  2. 关于Matlab生成批量文件文件名统一数字位数方法

    关于Matlab生成批量文件文件名统一数字位数方法 规定文件名数字位数方法: 读取文件方法 在生成批量含有数字编号的文件时,应该注意使用统一位数的数字来命名,且明明数字位数应该比文件数量最大值至少多一 ...

  3. matlab读取wav文件

    matlab读取wav文件 wavread audioread [y,Fs,bits]=wavread('1.wav'); [y,Fs]=audioread('1.wav'); wavread mat ...

  4. 16进制 dat matlab_用MATLAB生成DAT文件

    用MATLAB生成DAT文件 f1=10;f2=100;fs=400;N=400; x = linspace(0,N/fs,N); y1 = sin(2*pi*f1*x); y2 = sin(2*pi ...

  5. python调用vb文件_【转载】利用VB生成APDL文件 和Python文件的方法

    转载 利用VB生成APDL文件 和Python文件的方法 作者:李涛 欢迎关注:CAE技术分享 专注于CAE技术的分享和讨论. 1. 概述 Visual Basic作为一种可视化程序设计语言,应用相对 ...

  6. 针对大量数据,MATLAB生成EXCEL文件并进行排版处理的源码

    #MATLAB生成EXCEL文件并进行排版处理的源码 项目要求:给定某海洋站潮位数据在一年之年的每分钟潮位数据(一共有24×60×365=525600个数),txt格式,要求制作出海洋站该年份的潮汐表 ...

  7. matlab生成mif图像文件,matlab 生成mif文件导入quartus rom中

    用Quartus II创建并仿真ROM的步骤:1.在Quatus工程下生成一个ROM2.编写.mif文件,作为ROM的初始化文件3.将.mif文件拷贝到Modelsim工程下4.进行Modelsim仿 ...

  8. matlab产生mif 文件,用matlab生成mif文件

    在FPGA中,rom模塊的初始化文件分為兩種,一種是hex文件,另外一種是mif文件,這兩種文件都可以通過Quartus進行手工創建,進行手工輸入數據,也可以借助於專用的文件編輯器完成編輯. 在此介紹 ...

  9. 使用matlab生成mif文件

    使用matlab生成mif文件用于ROMIP核读取. text文本中一行有5个数据,共有80行,400个1位的数据.地址从左至右,从上至下计,范围为0-399. quartusII的mif文件地址范围 ...

最新文章

  1. layui按钮展开、_layui框架,点击某个按钮,让layui的日期插件选中的值清空
  2. 使用CMD命令修改Windows本地账户密码
  3. netpref 使用_使用PerfView监测.NET程序性能(转发)
  4. perl oracle ppm,Perl图形化包管理工具PPM学习使用笔记
  5. 卷积/反卷积前后的张量尺寸计算
  6. thinkphp 表单令牌
  7. % 取余运算 取模运算
  8. keil5 项目管理
  9. 联通盒子系统服务器,联通IPTV盒子刷机方法,实现软件任意安装
  10. Report Machine应用总结
  11. 如何使用ps制作ico图标文件
  12. mysqldump: Got error: 1168 differently defined non-MyISAM LOCK TABLES
  13. 实例展示:用css实现网页图片特效
  14. 坚定信念,踏踏实实走好脚下的每一步!
  15. MySQL数据库相关资料
  16. Python-各种Loss总结
  17. android paint跑马灯,Android使用Canvas实现跑马灯
  18. tp部署了admin.php如何显示页面,深度解析ThinkPHP5设置模板路径
  19. FLASH AS3.0 停止播放音乐
  20. 三友硅业基于Lora+IBeacon定位技术下的化工厂人员定位解决方案-化工厂定位-新导智能

热门文章

  1. FPGA之道(59)时空变换之时域优化
  2. HDLBits 系列(16)Something about Counter
  3. Win7桌面快捷切换技巧?
  4. 遇见BUG(4)不要默认电平标准!
  5. Spring学习总结(6)——Spring之核心容器bean
  6. [常见错误]-bash: pg_config: command not found
  7. 好分数a1a5_好分数怎么查看班级排名 七年级学生成绩查询
  8. 3.4.1 流量控制与可靠传输机制
  9. TimeQuest约束外设之诡异的Create Generated Clocks用法
  10. android工程r红,Android Studio - 为什么R随机变为红色?