Matlab2019b音频文件读取

Matlab中对音频文件的读取操作

Matlab中对文件的读取操作

注意:本程序与2016b版本以前不兼容

读取整个音频文件

如果你需要读取整个音频文件并输出数组时,可以使用audioread函数

[y,Fs] = audioread('C:\Users\Hong\Desktop\matlab\城之内.mp3');

读取部分音频文件

如果需要读取部分音频,这是将前两秒的数据读取出来,相当于新建了一个2秒的文件,再读取。个人感觉这种方式虽然简单,但不好用。

filename = 'C:\Users\Hong\Desktop\matlab\城之内.mp3';
audiowrite(filename,y,Fs);
samples = [1,2*Fs];%2为读取两秒
clear y Fs
[y,Fs] = audioread(filename,samples);

按帧读取音频文件(力荐)

通过dsptoolbox里面的dsp.AudioFileReader函数来进行读取初始化操作,是数据流操作

%% RichardYang 2020/3/10 Ver1.0
%%Copyright © 2020 by RichardYang. All rights reserved.
afr = dsp.AudioFileReader;%通过建立类型来初始化文件输入格式
afr.Filename='C:\Users\Hong\Desktop\matlab\城之内.mp3';%读取文件
afr.SampleRate%文件采样率(只读)
afr.SamplesPerFrame=1024;%每一帧读取1024个数据
aduioIn.PlayCount=1;%文件读取次数
afr.OutputDataType='double';%数据输出时的类型
afr.ReadRange=[1 inf];%数据读取的帧数范围
[audio,eof] = afr();%返回数据audio
info = audioinfo(afr.Filename);读取音频文件信息
release(afr);%释放读取

通过audioinfo可以获取读取文件的信息,比如SampleRate和Duration,通过设置afr.ReadRange可以设定读取帧数,本人通过下面这种方式来读取20秒的数据。

afr.ReadRange=[1 20*afr.SampleRate];%数据读取的帧数范围,这里读取20s

这种方式可以对读取文件进行详尽的设置,方便后续的处理。

按帧读取并存为整个文件(绘图或达到或audioread读出来的y相同的效果)

afr = dsp.AudioFileReader;%通过建立类型来初始化文件输入格式
afr.Filename='C:\Users\Hong\Desktop\matlab\城之内.mp3';%读取文件
afr.SampleRate%文件采样率(只读)
aduioIn.PlayCount=1;%文件读取次数
afr.OutputDataType='double';%数据输出时的类型
afr.ReadRange=[1 5*afr.SampleRate];%数据读取的帧数范围,这里读取5s
% afr.ReadRange=[1 inf];%数据读取的帧数范围,这里全部读取
[audio,eof] = afr();
info = audioinfo(afr.Filename)
r_channle=[];
l_channle=[];

while ~isDone(afr)
mySignal = afr();%从文件中读取数据
r_channle=[r_channle;mySignal(:,1)];%通道1
l_channle=[l_channle;mySignal(:,2)];%通道2
end

t=0:seconds(1/afr.SampleRate):seconds((size(l_channle,1))/afr.SampleRate);%这个地方使用dsp.filereader可能会有帧数不为整数的问题
t=t(1:end-1);%建立一个横坐标时间轴

subplot(2,1,1);
plot(t,r_channle)
title('右声道');
xlabel('Time');
ylabel('y');

subplot(2,1,2);
plot(t,l_channle)
title('左声道');
xlabel('Time');
ylabel('y');

由于这个是实时处理,所以需要播放完后才可以绘图,会比较慢,如需要实时显示波形,在后面的scope中会进行说明。

两种方式的选择

本人用这种方式来进行读取主要是进行音频的实时操作,在对帧操作后可以送入dsp.AudioFileWriter储存或送入dsp.AudioDeviceWriter中进行播放。如果不需要实时操作,就用audioread函数,速度较快。

Copyright © 2020 by RichardYang. All rights reserved.
仅供参考,严禁转载,感谢。

你可能感兴趣的:(学习笔记)