【问题标题】:Matlab .wav normalizationMatlab .wav 归一化
【发布时间】:2015-07-25 03:03:45
【问题描述】:

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

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

【问题讨论】:

    标签: matlab audio import wav normalize


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 谢谢你的答案!差异不只是标准化的间隔吗?我的意思是,如果使用不同的参考值对两个文件进行归一化,我无法将它们的幅度与 [-1 1] 或 [-32767 32768] 间隔进行比较。
    • @pragal 如果您使用本机选项,它将不会被规范化。
    • @NKN,文件是在 WAV 文件中标准化还是在读取/导入过程中标准化?
    【解决方案2】:

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

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

    【讨论】:

    • 好的,我想我明白了。谢谢!但要结束所有疑问:我正在比较两个不同的录音,但它们是以相同的分辨率(16 位)录制的。我可以使用 audioread 将它们导入 Matlab,尽管如此,它们的幅度是可比的?
    • 是的,幅度是可比的。两个文件的缩放方式完全相同。
    • @jaket,是否有一个约定,以便无论在哪里进行标准化,您都可以进行相同的比较?例如,导入 2 个不同的 WAV 文件?
    • @Vass 我不知道是否有约定,但我可以告诉你我一直这样做的方式。我将文件中的样本加载到一个 32 位整数中,数据左对齐,然后转换为浮点数。例如int intSample = shortSample << 16
    猜你喜欢
    • 2011-10-11
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 2021-05-22
    • 2011-12-28
    • 1970-01-01
    • 2016-01-23
    • 2015-03-09
    相关资源
    最近更新 更多