Matlab .wav 归一化

Matlab .wav normalization

我目前在一个项目中工作,我使用声表录制声音,然后以 .wav 格式导出生成的文件。

之后,我使用 audioread 函数将 .wav 文件导入 MATLAB。我意识到数据在 -1 和 1 之间标准化(默认选项)。这意味着每个不同的文件都使用它们各自的极值进行标准化? 如果那是真的,我如何从 .wav 文件中获取非标准化数据,以便我可以比较两个不同文件的频谱幅度? 我需要的正是一个具有作为时间函数的振幅(以 dB、伏特等为单位...)的文件。

第一个问题的答案是YES,数据正在被audioread函数归一化。 使用 audioread 函数时,您应该指定输出数据类型。数据类型有两个选项:

  1. double:双精度标准化样本(默认)。
  2. native: 在文件中找到的原生数据类型的样本。

您使用的默认选项是第一个为您提供标准化样本的选项。如您所见,如果 dataTypenative,则输出可以是以下 table 所示的几种 MATLAB 数据类型之一,具体取决于文件格式以及输入文件的 BitsPerSample 值。

因此您需要更改数据类型以获得不同的结果。您可以尝试以下形式的函数用法:

[y,Fs] = audioread(filename,'native');

此外,您可以调用 audioinfo 来确定文件的 BitsPerSample 值。

另一个更适合 .wav 音频格式的选项table,再次使用指定数据类型的 wavread 函数。但是,将来会从 MATLAB 中删除。

如果您想比较两个具有不同位深度的文件,那么最好的办法是让 matlab 对音频进行标准化。

例如,0 dBFS 正弦波的最大峰值为 32767(16 位有符号)和 127(8 位有符号)。通过归一化,它们都将转换为 +1.0 (1.0 = 0 dBFS)。如果没有归一化,只需考虑两个信号在时域中的样子。与 16 位信号相比,8 位信号会很小。事实上,它会降低 8 位或 48dB!