提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
利用matlab的audio或fread函数读取.wav文件和.raw音频文件;
利用audiowrite或fwrite函数写入.wav文件和.raw音频文件,实现两种信号格式的相互转换;
更改音频采样率
wav文件的格式如下图所示,前44字节表示音频的采样率,通道数等信息,44字节的音频信息后是音频波形数据
raw格式和wav格式的区别就是,raw只包含音频的波形数据,而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); % 试听
代码如下(示例):
%% 读.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); % 试听
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);
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);
代码如下(示例):
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); % 将更改采样率后的音频写入
有问题可以留言或者私信,一起讨论