提问

老师,这个波形为什么抓取出来是这个样子? 应该是连续的sin吧?这个是从你发的网盘链接里面下载的 我用播放器画出的波形。

声音信号绘制波形

我自己使用单片机, 发出的声音不太一样,但是波形就是您之前推文里的那个。就像下面的波形图所显示的钠盐。

刚才是我自己单片机生成的波形 老师发的chirp.wav,用Matplot没问题。 但是从喇叭里面发出来,就会很奇怪,而且播放器上面的波形也不对。

自己使用单片机产生的波形

问题回复

问题分析

在生成最终的声音.wav文件的时候,使用的是16bit整型数。在python程序中为:

wavefile.setparams((1, 2, 10000, wavelen, 'NONE', 'Tsinghua'))
函数中的参数定义分别是:(nchannels, sampwidth, framerate, nframes, comptype, compname),

生成wave波形数据使用公式如下,这将产生带有符号的16位整形数字:
data=int[sin⁡(2πθ)⋅0x3FFF]data = {\mathop{\rm int}} \left[ {\sin \left( {2\pi \theta } \right) \cdot 0x3FFF} \right]data=int[sin(2πθ)⋅0x3FFF]

Chip波形前面300个数据点绘制的波形如下:

有符合16位整型数波形

在写入wave文件之前,需要将生成的数据转换成无符号整形数字,使用二进制补码方式进行转换:

    sd = int(sin(angle * 2 * pi) * 0x3fff)if sd < 0: sd = 0x10000+sd

这样wave文件的波形就变成如下图所示了:

修改成有符合整型数的波形

而在之前没有按照二进制补码方式转换,而是直接采用16位无符号整形数来表示音频数据,转换的程序代码如下:

    sd = int(sin(angle * 2 * pi) * 0x3fff) + 0x7fff

这样绘制出来的波形如下。虽然它的波形完整,但与.wav文件所使用的有符号16位整型数据不符合,所以播放出来的声音出现较大的失真。

无符号16整型数波形

产生声音文件的PYTHON程序

谢谢你反馈的信息,根据前面的分析,重新修改了chirp波形文件生成python程序。后面也给出了最终的下载音频文件链接。

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# SOUNDWAV.PY                  -- by Dr. ZhuoQing 2020-03-23
#
# Note:
#============================================================from headm import *
import wave#------------------------------------------------------------
data_num    = 2048
ts = 1.0e-4
start_freq = 250
end_freq = 2000sounddata = []
zerodata = []
angle = 0for i in range(data_num):
#    sd = int((sin(angle * 2 * pi) + 1) * 0x3fff)# + 0x7fffsd = int(sin(angle * 2 * pi) * 0x3fff)if sd < 0: sd = 0x10000+sdsounddata.append(sd)zerodata.append(0)freq = (end_freq - start_freq) * i / data_num + start_freqangle = freq * ts + angle#------------------------------------------------------------
segnum = 20
wavedata = []for i in range(segnum):wavedata.extend(sounddata)wavedata.extend(zerodata)wavelen = len(wavedata)wavedatabytes = b''
for num in wavedata:wavedatabytes = wavedatabytes + num.to_bytes(byteorder='little', length=2)#------------------------------------------------------------
wavefile = wave.open(r'd:\temp\chirp.wav', 'wb')
wavefile.setparams((1, 2, 10000, wavelen, 'NONE', 'Tsinghua'))
wavefile.writeframes(wavedatabytes)
wavefile.close()printf('\a')
#------------------------------------------------------------
#        END OF FILE : SOUNDWAV.PY
#============================================================

WAV文件中使用有符合整形数相关推荐

  1. C++ 读取wav文件中的PCM数据

    前言 wav文件通常会使用PCM格式数据存储音频,这种格式的数据读取出来直接就可以播放,要在wav文件中读取数据,我们首先要获取头部信息,wav的文件结构里面分为多个chunk,我们要做的就是识别这些 ...

  2. java 修改wav文件头_使用Java聲音API從WAV文件中修剪開頭和結尾

    我有製作的基礎知識.但是,輸出文件一遍又一遍地重複WAV標頭字節.生成的文件大小合適,但是它與垃圾一起提交.使用Java聲音API從WAV文件中修剪開頭和結尾 我想使用一個擴展AudioInputSt ...

  3. WAV文件中AudioFormat的定义

    最近在做一个解析wav音频文件的算法,关于wav文件格式的介绍,网上的资料一搜一大把,这里推荐一个很好的文章: wave文件(*.wav)格式.PCM数据格式 - cheney23reg - 博客园 ...

  4. 统计xml文件中的标签出现框数及出现过的图片数

    在使用SSD-tensorflow训练中需要传入自己的训练集与测试集的一些参数,其中包含各类名出现过的图片数,各类总框数,及总数. 今天写了一个计数的脚本如下,可用于索引XML文件中的目标数: imp ...

  5. java wav合并_java – 如何将两个wav文件合并/合并到一个wav文件中?

    如果直接使用wav文件的字节,则可以在任何编程语言中使用相同的策略.对于这个例子,我假设两个源文件具有相同的比特率/ numchannels并且长度/大小相同. (如果没有,你可以在开始合并之前编辑它 ...

  6. 统计java文件中的代码行数

    统计Java代码行数工具类  --  CodeCounterUtil.java 统计指定目录下的java文件中代码行数  --  public static int  getCodeNumFromFo ...

  7. 【数据压缩】WAV文件和AVI文件格式分析

    一.WAV文件和AVI文件格式简介 WAV的英文全称是Waveform Audio File Format ,它采用 RIFF (Resource Interchange File Format)文件 ...

  8. Qt 之 WAV文件解析

    简介 最近看了一下Qt的处理音频方面的资料,本身利用QAudioInput 和 QAudioOutput 就可以实现录音和播放功能,代码也很简单,但是录音生成的文件并不能用播放器打开,就算更改后缀名也 ...

  9. AVI文件格式简介与WAV文件分析

    AVI文件格式简介与WAV文件分析 AVI文件格式(回答问题) 所有AVI文件至少包含2个必须的LIST Chunk和一个索引Chunk Chunk: LIST Chunk: 小端:数据的低位保存在内 ...

最新文章

  1. unity 天空盒_使用Substance in Unity搭建Unity和SP的live link实时互通环境
  2. CxImage图像处理类库说明3(转载)
  3. 安装完MAVEN后输入mvn -v, 提示不是内部命令的问题
  4. CSDN下载频道2014年11月4日本-5日常维护公告
  5. C#:ref和out的联系及区别。
  6. SQL查询优化《三》:少做重复的工作
  7. MSHFlexGrid控件
  8. WIN10常用快捷键(打开资源管理器、显示桌面、截图)
  9. opencv进行5种图像变化:
  10. 好好活着就是一场博弈
  11. Linux虚拟机中vim编辑器常用命令介绍(一)
  12. unity实现游戏帧同步之确定性物理引擎
  13. Mathpix Snip他们都说好用!我也试一试尝试下载-安装-使用
  14. linux 下串口编程,uclinux下串口编程
  15. 华为S5700交换机配置 不同vlan 间通信---eNSP
  16. MTK6735 android 驱动修改模块
  17. 记一次拆机除尘换硅脂的经历,第一次拆机幸好没拆坏,心真大-_-!
  18. 解决安装ENVI5.3报错:the installation of MSVC_2010_SP1_x64_32bit has failed
  19. Linux网卡流量监控工具
  20. 机器学习的数学基础1:集合、关系、元组

热门文章

  1. ASP.NET常用加密解密方法
  2. 概率论快速学习03:概率公理补充
  3. SQL 基礎語句-case
  4. 总结编程语言的空语句
  5. Ext2.0 form使用实例
  6. SIM PIN Lock
  7. 为什么要选择Apache Pulsar(一)
  8. 《2017年IT优先级调查》:重点考虑云、网络、端点安全
  9. 安装和使用花生壳(linux)
  10. Windows Phone 7监测网络环境变化