Matlab .wav 归一化
Matlab .wav normalization
我目前在一个项目中工作,我使用声表录制声音,然后以 .wav
格式导出生成的文件。
之后,我使用 audioread
函数将 .wav
文件导入 MATLAB
。我意识到数据在 -1 和 1 之间标准化(默认选项)。这意味着每个不同的文件都使用它们各自的极值进行标准化?
如果那是真的,我如何从 .wav
文件中获取非标准化数据,以便我可以比较两个不同文件的频谱幅度?
我需要的正是一个具有作为时间函数的振幅(以 dB、伏特等为单位...)的文件。
第一个问题的答案是YES,数据正在被audioread
函数归一化。
使用 audioread
函数时,您应该指定输出数据类型。数据类型有两个选项:
- double:双精度标准化样本(默认)。
- native: 在文件中找到的原生数据类型的样本。
您使用的默认选项是第一个为您提供标准化样本的选项。如您所见,如果 dataType
为 native
,则输出可以是以下 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!
我目前在一个项目中工作,我使用声表录制声音,然后以 .wav
格式导出生成的文件。
之后,我使用 audioread
函数将 .wav
文件导入 MATLAB
。我意识到数据在 -1 和 1 之间标准化(默认选项)。这意味着每个不同的文件都使用它们各自的极值进行标准化?
如果那是真的,我如何从 .wav
文件中获取非标准化数据,以便我可以比较两个不同文件的频谱幅度?
我需要的正是一个具有作为时间函数的振幅(以 dB、伏特等为单位...)的文件。
第一个问题的答案是YES,数据正在被audioread
函数归一化。
使用 audioread
函数时,您应该指定输出数据类型。数据类型有两个选项:
- double:双精度标准化样本(默认)。
- native: 在文件中找到的原生数据类型的样本。
您使用的默认选项是第一个为您提供标准化样本的选项。如您所见,如果 dataType
为 native
,则输出可以是以下 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!