You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Octave中audiowrite指定24位导出却生成32位音频的问题

问题原因及解决方法

核心原因

Octave的audiowrite函数在处理浮点型音频数据时,会优先采用32位浮点WAV格式编码,即使你明确指定了BitsPerSample=24也会被忽略。具体细节:

  • audioread读取24位WAV文件时,返回的音频数组A是双精度浮点型(double),数值范围在[-1, 1]之间;
  • 你处理后的A_new同样保持double类型,此时调用audiowrite,Octave会默认将浮点数据写入32位浮点WAV,而非24位整数PCM,这就导致MediaInfo检测到的位深为32位。

解决方法

需要先将浮点音频数据转换为24位整数对应的范围,再调用audiowrite:

  1. 将浮点数据缩放到24位整数的取值区间(-2^23 到 2^23 - 1);
  2. 转换为int32类型(Octave无原生int24类型,用int32存储即可,写入时会自动按24位打包)。

修改后的代码:

Files=dir(fullfile(pwd,'*.wav'))

fsize = size(Files, 1)

for i = 1:fsize
    name = Files(i).name
    [A,Fs]=audioread(name) ;

    oms = sqrt(meansq(A(:)))
    A_new=A*0.05/oms;

    % 转换为24位整数范围的int32类型
    A_int = int32(A_new * 2^23);
    audiowrite(['n_',name], A_int, Fs, 'BitsPerSample', 24)
endfor

补充说明

  • 若直接用浮点数据写入,即使指定BitsPerSample=24,Octave也会生成32位浮点WAV;只有当输入数据为整数类型时,BitsPerSample参数才会生效,对应生成8/16/24位整数PCM格式。
  • 用修改后的代码导出后,MediaInfo检测到的位深会显示为24位。

内容的提问来源于stack exchange,提问作者Wuchta7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:34:54