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:
- 将浮点数据缩放到24位整数的取值区间(
-2^23到2^23 - 1); - 转换为
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
相关产品推荐
相关产品推荐

