【问题标题】:How can I save audio wav file without data clipping?如何在没有数据剪辑的情况下保存音频 wav 文件?
【发布时间】:2019-02-10 15:28:23
【问题描述】:

我正在使用 MATLAB 工具从音频 WAV 文件中提取静音部分。从音频中提取静音部分后,我想将新音频保存为 WAV 文件。 对于这个过程,我使用“audiowrite”功能。但是,程序会通过以下消息向我发出警告:

警告:写入文件时数据被剪切。

我尝试使用单个文件格式(32 位)添加“BitsPerSample”值,但我没有通过这种方式从程序中获取消息。我保存的音频文件是 32 位的,但 WAV 文件应该是 16 位的。

我该如何解决这个问题?

audiowrite(filename,y,fs,'BitsPerSample',32);

注意:我也标准化了数据,问题也是一样的。

感谢您的帮助!

更新:

我想将音频样本归一化为均值 0 和标准差或方差 1。因此,我使用 z-score 归一化技术。 此外,y/max(abs(y)) 方法是介于 -1 和 1 之间的归一化数据。但是,均值和方差分别不等于 0 和 1。这些技术是用不同方式标准化的数据。

实际上,我的问题是,如何在不裁剪数据的情况下使用 z 分数归一化技术保存样本?

【问题讨论】:

  • 请分享您用于 z 归一化的代码。可能您超过 1 或 -1,因此数据被截断。您是否尝试将 native 添加到您的 audioread 命令中?
  • 我知道超出了 -1 和 1 之间的范围。z 归一化代码是 y1=(y -mean(y))/(std(y)) 或 zscore(y)。如果我在 z 归一化后再次对数据进行归一化,数据将转换为 orjinal。因此,不需要使用 z 归一化。不,我没有。但是,'native' 参数会将双精度转换为整数。
  • 您收到消息的原因以及您的数据被剪裁的原因是它超过了 1 和/或 -1。如果您不想这样,请添加此行 y1 = y1/max(abs(y1)) 并且最大值不会超过 1 或 -1。
  • 谢谢!它工作得很好。虽然 z 归一化在默认设置下是介于 -1 和 +1 之间的归一化值,但在此过程中不起作用。

标签: matlab audio signal-processing normalization wav


【解决方案1】:

Matlab 的audiowrite 对不同的数据类型使用不同的规范化。所以如果你想得到 16bit 音频 wav 文件,你应该将你的数据规范化到 [-32768,32767] 范围并将你的数据转换为 int16 类型:

y_normalized = intmax('int16') * y/(max(abs(y))*1.001);
audiowrite(filename, int16(y_normalized), fs)

同样,对于浮点数,您应该将数据标准化为 [-1,+1] 范围:

y_normalized = y/(max(abs(y)));
audiowrite(filename, y_normalized, fs)

【讨论】:

  • 首先,感谢您的回答。我的数据如下:-0,280750148350963 -0,454680031418586, 1,42956036848067, -0,295244305273265 -1,48859655854279。这些不是整数类型,因此您的代码不起作用。我对数据进行 z 归一化为均值 0 和方差 1。在此过程之后,我想保存它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 2021-09-08
  • 2015-07-21
相关资源
最近更新 更多