如何将wav文件转换为浮动幅度
所以我问了标题中的所有内容:
我有一个 wav 文件(由 PyAudio 从输入音频编写),我想将其转换为与声级(振幅)相对应的浮点数据,以进行一些傅立叶变换等...
任何人都有将 WAV 数据转换为 float 的想法?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
所以我问了标题中的所有内容:
我有一个 wav 文件(由 PyAudio 从输入音频编写),我想将其转换为与声级(振幅)相对应的浮点数据,以进行一些傅立叶变换等...
任何人都有将 WAV 数据转换为 float 的想法?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
我已经找到了两种不错的方法来做到这一点。
方法 1:使用 Wavefile 模块
如果您不介意安装一些额外的库,那么可以使用此方法,这些库在我的 Mac 上会有点麻烦,但在我的 Ubuntu 服务器上很容易。
https://github.com/vokimon/python-wavefile
方法2:使用Wave 模块
如果您希望减少模块安装的麻烦,请使用此方法。
从文件系统读取 wav 文件并将其转换为 -1 到 1 范围内的浮点数。它适用于 16 位文件,如果它们 > 1 通道,将以与在文件中找到样本相同的方式交错样本。对于其他位深度,请根据本页底部的表将参数中的“h”更改为 struct.unpack:
https://docs.python.org/2/library/struct.html
它不适用于 24 位文件,因为没有 24 位数据类型,所以有没有办法告诉struct.unpack 做什么。
I have identified two decent ways of doing this.
Method 1: using the wavefile module
Use this method if you don't mind installing some extra libraries which involved a bit of messing around on my Mac but which was easy on my Ubuntu server.
https://github.com/vokimon/python-wavefile
Method 2: using the wave module
Use this method if you want less module install hassles.
Reads a wav file from the filesystem and converts it into floats in the range -1 to 1. It works with 16 bit files and if they are > 1 channel, will interleave the samples in the same way they are found in the file. For other bit depths, change the 'h' in the argument to struct.unpack according to the table at the bottom of this page:
https://docs.python.org/2/library/struct.html
It will not work for 24 bit files as there is no data type that is 24 bit, so there is no way to tell struct.unpack what to do.
大多数波形文件都是 PCM 16 位整数格式。
您想要做什么:
整数值范围从 -32768 到 32767,您需要转换为浮点值从 -1.0 到 1.0。
我没有 python 中的代码,但是在 C++ 中,如果 PCM 数据是 16 位整数,则这里是代码摘录,并将其转换为浮点(32 位):
小心立体声文件,因为立体声 PCM波形文件中的数据是交错的,这意味着数据看起来像 LRLRLRLRLRLRLRLR(而不是 LLLLLLLLRRRRRRRR)。您可能需要也可能不需要去交错,具体取决于您对数据的处理方式。
Most wave files are in PCM 16-bit integer format.
What you will want to:
Integer values range from -32768 to 32767, and you need to convert to values from -1.0 to 1.0 in floating points.
I don't have the code in python, however in C++, here is a code excerpt if the PCM data is 16-bit integer, and convert it to float (32-bit):
Be careful with stereo files, as the stereo PCM data in wave files is interleaved, meaning the data looks like LRLRLRLRLRLRLRLR (instead of LLLLLLLLRRRRRRRR). You may or may not need to de-interleave depending what you do with the data.
我花了几个小时试图找到这个问题的答案。事实证明,解决方案非常简单:struct.unpack 就是您正在寻找的。最终代码将如下所示:
大部分功劳都归功于解释 WAV 数据。唯一的技巧是获得正确的解包格式:它必须是正确的字节数和正确的格式(有符号或无符号)。
I spent hours trying to find the answer to this. The solution turns out to be really simple: struct.unpack is what you're looking for. The final code will look something like this:
Most of the credit goes to Interpreting WAV Data. The only trick is getting the format right for unpack: it has to be the right number of bytes and the right format (signed or unsigned).
此版本从文件系统读取 wav 文件并将其转换为 -1 到 1 范围内的浮点数。它适用于所有样本宽度的文件,并且将以在文件中找到样本的相同方式交错样本。
这里还有一个函数的链接,该函数将浮点数转换回整数并将它们写入所需的 wav 文件:
https://gto76.github.io/python-cheatsheet/#writefloatsamplestowavfile
This version reads a wav file from the filesystem and converts it into floats in the range -1 to 1. It works with files of all sample widths and it will interleave the samples in the same way they are found in the file.
Also here is a link to the function that converts floats back to ints and writes them to desired wav file:
https://gto76.github.io/python-cheatsheet/#writefloatsamplestowavfile
Microsoft WAVE 格式有相当详细的文档记录。请参阅https://ccrma.stanford.edu/courses/422/projects/WaveFormat/< /a> 例如。编写一个文件解析器来打开和解释数据以获得您需要的信息并不需要太多...也就是说,几乎可以肯定以前已经完成过,所以我确信有人会给出一个“更简单”的答案; )
The Microsoft WAVE format is fairly well documented. See https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ for example. It wouldn't take much to write a file parser to open and interpret the data to get the information you require... That said, it's almost certainly been done before, so I'm sure someone will give an "easier" answer ;)