如何在 C++ 中读取原始音频数据?
How to read raw audio data in c++?
我正在尝试对音频文件进行傅立叶变换。到目前为止,我已经设法在 this answer. This 的帮助下读取了文件的 header 是输出。
音频格式为 1,表示 PCM,我应该可以轻松处理这些数据。但是,这是我无法弄清楚的。
数据是二进制的,我应该把它转换成浮点数或其他我无法理解的东西吗?
是的,它是二进制的。具体来说,它是带符号的 16 位整数。
您可能希望根据您的 FFT 需要将其转换为 float 或 double。
我建议您使用单声道输入音频文件...您显示的示例有两个声道(立体声),这会使数据稍微复杂化...对于单声道 PCM 文件,结构是
two-bytes-sample-A immediately followed by two-bytes-sample-B ... etc.
在 PCM 中,每个这样的样本直接对应于模拟音频曲线上的一个点,因为麦克风振膜(或您的耳膜)摆动......注意正确使用数据的字节顺序,每个样本都会导致使用所有 16 位的整数,因此无符号整数的值从 0 到 (2^16 - 1),即 0 到 65535 ....如果它们是无符号的
,请确认您的样本保持在此范围内
我正在尝试对音频文件进行傅立叶变换。到目前为止,我已经设法在 this answer. This 的帮助下读取了文件的 header 是输出。
音频格式为 1,表示 PCM,我应该可以轻松处理这些数据。但是,这是我无法弄清楚的。
数据是二进制的,我应该把它转换成浮点数或其他我无法理解的东西吗?
是的,它是二进制的。具体来说,它是带符号的 16 位整数。 您可能希望根据您的 FFT 需要将其转换为 float 或 double。
我建议您使用单声道输入音频文件...您显示的示例有两个声道(立体声),这会使数据稍微复杂化...对于单声道 PCM 文件,结构是
two-bytes-sample-A immediately followed by two-bytes-sample-B ... etc.
在 PCM 中,每个这样的样本直接对应于模拟音频曲线上的一个点,因为麦克风振膜(或您的耳膜)摆动......注意正确使用数据的字节顺序,每个样本都会导致使用所有 16 位的整数,因此无符号整数的值从 0 到 (2^16 - 1),即 0 到 65535 ....如果它们是无符号的
,请确认您的样本保持在此范围内