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

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

文章目录

  • 前言
  • 一、wav文件格式
  • 二、matlab代码
    • 1.fread读.wav文件
    • 2.fread读.raw音频文件
    • 3.wav转raw
    • 3.raw转wav
    • 5.更改音频采样率
  • 总结


前言

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


一、wav文件格式

wav文件的格式如下图所示,前44字节表示音频的采样率,通道数等信息,44字节的音频信息后是音频波形数据
raw格式和wav格式的区别就是,raw只包含音频的波形数据,而wav文件在音频数据的前面加入了音频的采样率等信息
MATLAB读写.wav和.raw音频文件_第1张图片

二、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);          % 将更改采样率后的音频写入

总结

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

你可能感兴趣的:(matlab,开发语言)