MATLAB读写.wav和.raw音频文件

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

利用matlab的audio或fread函数读取.wav文件和.raw音频文件;
利用audiowrite或fwrite函数写入.wav文件和.raw音频文件,实现两种信号格式的相互转换;
更改音频采样率


一、wav文件格式

wav文件的格式如下图所示,前44字节表示音频的采样率,通道数等信息,44字节的音频信息后是音频波形数据
raw格式和wav格式的区别就是,raw只包含音频的波形数据,而wav文件在音频数据的前面加入了音频的采样率等信息
在这里插入图片描述

二、matlab代码

1.fread读.wav文件

代码如下(示例):

%% fread读wav数据
format short g
[filename,pathname] = uigetfile('*.wav');       % 获得.wav文件路径
fid = fopen(fullfile(pathname,filename), 'r');  % 打开文件
fseek(fid,4,-1);                                % 跳过4字节
Chunk_Size = fread(fid,1, 'int32');             % 读取Chunk_Size
fseek(fid,24,-1);
Sample_Rate = fread(fid,1, 'int32');  
fseek(fid,22,-1);
Num_Channels = fread(fid,1, 'int16'); 
fseek(fid,44,-1);                             % 跳过文件信息
signal_raw = fread(fid, 'integer*2');         % 读取波形数据  两字节一个数据,有符号位
signal_raw = signal_raw/(2^15);               % 归一化
fclose(fid);
Chunk_Size_KB = Chunk_Size/1024;

也可以直接用matlab自带的函数(audioread):

%% audio读wav数据
[filename,pathname] = uigetfile('*.wav');
[signal_wav,fs] = audioread(fullfile(pathname,filename));
whos signal_wav         % 返回文件信息
sound(signal_wav,fs);   % 试听

2.fread读.raw音频文件

代码如下(示例):

%%.raw数据
fs = 48e3;                                    % 需要已知采样率
[filename,pathname] = uigetfile('*.raw');     % 获得.raw文件路径
fid = fopen(fullfile(pathname,filename), 'r');% 打开文件
signal_raw = fread(fid, 'integer*2');         % 两字节一个数据,有符号位
signal_raw = signal_raw/(2^15);               % 归一化
fclose(fid);                                  % 关闭文件
% sound(signal_raw,fs);                       % 试听

3.wav转raw

wav转raw功能函数:

function wav2raw_fun(filepath_wav,filepath_raw)  %输入wav文件路径、raw文件路径

[signal_wav,fs] = audioread(filepath_wav);  % 读wav
fid = fopen(filepath_raw, 'w');
fwrite(fid,signal_wav(:,1)*(2^15), 'integer*2');        % 写raw
fclose(fid);

3.raw转wav

raw转wav功能函数:

function signal_raw = raw2wav_fun(filepath_raw,filepath_wav,fs)  %输入raw文件路径、wav文件路径、采样率fs

fid = fopen(filepath_raw, 'r');
signal_raw = fread(fid, 'integer*2');      % 两字节一个数据,有符号位
signal_raw = signal_raw/(2^15);            % 归一化
fclose(fid);
audiowrite(filepath_wav,signal_raw,fs);

5.更改音频采样率

代码如下(示例):

fs_new = 44.1e3;                                                      % 期望采样率
[filename_ref,pathname_ref] = uigetfile('*.wav');                     % 获得.wav文件路径
[signal_wav_ref,fs] = audioread(fullfile(pathname_ref,filename_ref)); % 读取.wav
signal_wav_fs_new = resample(signal_wav_ref,fs_new,fs);               % Change sampling 
audiowrite('demo_input_44.1k.wav',signal_wav_fs_new,fs_new);          % 将更改采样率后的音频写入

总结

有问题可以留言或者私信,一起讨论

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值