matlab读取mp3音频

matlab读取mp3音频,第1张

matlab读取MP3音频数据,可以用audioread()函数, 用法很简单

[Y, FS]=audioread(FILENAME)

filename为指定载入的音频文件名称(单引号引出的字符串)

返回数据Y为所读取的音频数据,FS为采样频率

这个函数可以读取多种格式的音频文件,比如wav, mp3, flac, ogg等

例:

[y,Fs] = audioread('1mp3');

%播放读入的数据

p = audioplayer(y,Fs);

play(p);

1、首先启动MATLAB软件。

2、首先设定好波形的基本参数,采样点数,采样频率,采样间隔,时间间隔,最高采样频率等,注意要符合采样定理才能保证信号不失真。

3、然后定义声音信号的波形,可以是普通的余弦波,也可以复杂的波形,然后用subplot语句将波形绘制出来。

4、然后创建噪声的波形,这里是调用了取值在0~1的随机函数,用来产生高斯噪声,再绘制出它的波形。

5、然后根据傅里叶变换的原则,将噪声的时域表达转换为频域表达,再绘制出它的波形。

6、通过将原始信号和噪声信号相加,即可得到混合噪声后的信号,再调用绘图语句画出它的波形。

如果是想将声音信号录制到matlab里面,则可以使用以下的函数。

R = audiorecorder( 44100, 16 ,2 ) ;

%创建一个保存音频信息的对象,它包含采样率,时间和录制的音频信息等等。44100表示采样为44100Hz(可改为8000, 11025, 22050等,此数值越大,录入的声音质量越好,相应需要的存储空间越大),16为用16bits存储,2为两通道即立体声(也可以改为1即单声道)。

record(R);

%开始录制,此时对着麦克风说话即可。

pause(R);

%暂停录制。

play(R)

%播放录制的声音。

resume(R);

%继续录制

stop(R);

%停止录制

myspeech = getaudiodata(R);

%得到以n2列数字矩阵存储的刚录制的音频信号。

%对这个矩阵你就可以用各种滤波器进行处理,或者把它和别的音频混音等等。你也可以画出它的波形(如果时间较长画波形可能会花点时间)。

plot(myspeech)

%画出波形

%如果你想保存可以使用

wavwrite(myspeech,44100,16,'myspeech');

%myspeech表示要存入的波形矩阵,44100表采样率,16 为以16bits存储,'myspeech'为存储的文件名。

%matlab有极其丰富的音频处理滤波功,此处介绍最基本的录入、播放和保存 *** 作,希望能对你有所帮助

这段程序应该某个控件的回调函数,点击后实时显示data1中某一段的时域波形及幅度谱,具体注释如下:

function play_Callback(hObject, eventdata, handles)%应该是一个控件的回调函数,点击控件触发这个函数运行

global ad fs data1 data2 yp y ;%本程序外部的全局变量

start(ad);%这个具体要看你的ad是个什么对象,如果是一个采集对象的话,就是开始采集

T=clock;%获取当前时间[2014,12,22,09,30,58]格式,当前年月日时分秒

pause(01);%暂停01秒

while isrunning(ad)%判断ad是否运行

time=clock-T;%获取当前时刻与T时刻的时间间隔

s=3600time(4)+60time(5)+time(6);%将上面的时间间隔转换为秒

if(round(sfs+4410)<length(data1))%判断时间采样率+4410是否小于data1长度

yp=data1(round(sfs):round(sfs+4410));%截取data1中round(sfs):round(sfs+4410)之间的数据

plot(handlesaxes1,yp,'g');%在handlesaxes1这个坐标轴上显示波形yp,绿色线条

set(handlesaxes1,'ylim',[-05 05],'xlim',[0 4410]);%设置handlesaxes1的横坐标为0到4410之间,纵坐标为正负05之间

f=linspace(0,fs/2,2205);%在0到fs/2之间产生线性分布的2205点

yfft=2abs((1/4410)fft(yp));%标准的求幅度谱过程,具体可以help fft

bar(handlesaxes2,f,yfft(1:2205),'r');%在handlesaxes2坐标轴上显示yp的幅度谱,红色线条

set(handlesaxes2,'ylim',[0 01],'xlim',[0 4000]);%设置handlesaxes2的横纵坐标范围

drawnow;%立即更新图形界面,即立即把波形yp及其幅度谱显示出来

end

end

1、用audioread('');函数读取电脑中的音频文件,参数是音频文件的路径:

[sampledata,FS] = audioread('F:1mp3');

sampledata保存音频信号数据,FS是音频采样率,MP3格式的采样率一般为44100;

2、判断音频数据是否是双声道,如果是双声道则保留一个声道的数据,用calsamplem文件的函数完成此功能,文件内容如下:

function sample = calsample(sampledata,FS)

temp_sample = resample(sampledata,1,FS/11025);

[m,n] = size(temp_sample);

if (n == 2)

sample = temp_sample(:,1);

else

sample = temp_sample;

end

end

3、对音频数据进行快速傅里叶变换得到频谱图,并选取scope区域内的能量最大并且能量增幅最大的点作为峰值点,进行特征提取,keypointm文件内容如下:

function point = keypoint(sample,scope)

%对音频数据进行快速傅里叶变换,得到变换后的数据为b,频率为f,时间为t

[b,f,t] = specgram(sample,1024,11025,hanning(1024),256);

specgram(sample,1024,11025,hanning(1024),256);%绘制频谱图

hold on;

energy = abs(b);%根据快速傅里叶变换后的数据进行能量计算

%energy = sample;

diffenergy = caldiffenergy(energy);%计算能量差分

[m,n] = size(energy);%获取能量矩阵的大小

%f = (0:4);

%t = (0:4);

f_unit = max(f)/(length(f)-1);%根据频率点个数计算频率单位长度

t_unit = max(t)/(length(t)-1);%根据时间点个数计算时间单位长度

k = 1;

l = 1;

p = 1;

num = 1;

pointt = 0;

pointf = 0;%point结构体数组用来保存峰值点

tempt = 0;

tempf = 0;%temp结构体数组用来保存计算中的临时点

count = 0;%count为零表示在当前scope中未找到峰值点

x_f=0;

y_t=0;

plot(x_f,y_t);

hold on;

for i = 1:m-scope+1

for j = 1:n-scope+1

%找出大小为scope的子矩阵中的最大元素的位置并保存

[x_f,y_t] = find(energy(i:i+scope-1,j:j+scope-1)==max(max(energy(i:i+scope-1,j:j+scope-1))));

x_f = x_f + i - 1;

y_t = y_t + j - 1;

%找出大小为scope的子矩阵中的差分最大元素的位置并保存

[diffx,diffy] = find(diffenergy(i:i+scope-1,j:j+scope-1)==max(max(diffenergy(i:i+scope-1,j:j+scope-1))));

diffx = diffx + i - 1;

diffy = diffy + j - 1;

count = 0;

%如果最大元素和差分最大元素都为同一个位置则该点为峰值点,保存在temp中

for k = 1:length(x_f)

for l = 1:length(diffx)

if (x_f(k) == diffx(l)) && (y_t(k) == diffy(l))

temp(num)f = x_f(k) f_unit;

temp(num)t = y_t(k) t_unit;

%plot(temp(num)t,temp(num)f,'');

num = num + 1;

count = 1;%在scope中找到一个峰值点则不再记录其它相同的点

break;

end

end

if count == 1%scope中多个峰值点只保留第一个

break;

end

end

end

end

%将temp中保存的峰值点画在图上,多个scope中找到的相同峰值点只画一次

len = 1;

point(1)f = temp(1)f;

point(1)t = temp(1)t;

plot(point(1)t,point(1)f,'');

for i = 2:num - 1

for j = 1:len

if (temp(i)f == point(j)f) && (temp(i)t == point(j)t)

break;

end

end

if j == len && (temp(i)f ~= point(j)f) && (temp(i)t ~= point(j)t)

len = len + 1;

point(len)f = temp(i)f;

point(len)t = temp(i)t;

plot(point(len)t,point(len)f,'');

end

end

hold off

end

4、keypoint(sample,scope);函数中用到的caldiffenergy(energy);函数内容在caldiffenergym文件中,内容如下:

function diffenergy = caldiffenergy(energy)

v = diff(energy');

[x,y] = size(v);

for i = 1:y

zero(i) = 0;

end

diffenergy = abs(([zero;v])');

end

在matlab中,可以用wavread函数来打开wav格式的声音文件。

wavread函数的用法如下:

1、y = wavread(filename)

% 输入参数filename为指定载入的音频文件名称,为单引号引出的字符串形式。返回参数y% % 为所读取的音频数据样本。当文件无扩展名时,系统自动附加扩展名wav。

2、[y, Fs, nbits] = wavread(filename)

% 参数filename、y的定义同上,Fs为采样频率,nbits为文件中每个样本的字节数。

3、[] = wavread(filename, N)

% 参数N为文件每个通道的前N个样本。

4、[] = wavread(filename,[N1 N2])

% 参数N1、N2为文件每个通道从N1到N2的样本。

举例说明如下:

[y,fs,nbits]= wavread('d:\shuidaosoundwav');

sound(x,fs,bits); % 播放声音

% y就是音频信号;

% fs是采样频率,比如说16000就是每秒16000次;

% nbit是采样精度,比如说16就是指16位精度的采样。

以上就是关于matlab读取mp3音频全部的内容,包括:matlab读取mp3音频、在matlab中怎样实现对声音的导入,分析与处理、如何用声卡采集声音信号 然后用到MATLAB里面等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10115898.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存