基于MATLAB的音频特征提取

本文详细介绍了音频信号处理过程,包括分帧操作、使用汉宁窗进行平滑、梅尔滤波器组的运用,以及MFSC(Mel Frequency Cepstral Coefficients)特征的提取。通过示例展示了不同帧的数据处理和变换过程,是深入理解音频信号分析的基础步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 音频文件无法上传。就只上传代码。

 分帧:

 

分帧是指按照一定长度将输入的声音数据分割成若干数据段,通常取N=512个采样点作为一帧,帧与帧之间如果相互连接会使得在后续的计算中丢失数据,所以取256个采样点的一个帧移。

汉宁窗:

 

 

 梅尔滤波器,取个数为64个:

 

 

 

 

 

 

 

 MFSC:

 

 

 

clc;
clear all;
close all;
%读取音频文件的第2-10s
fs = 16000;
[y,fs]=audioread('C:\Users\dengw\Desktop\D32_999.wav',[2*fs,10*fs]);
figure('name','音频文件幅度-采样点波形');
plot(y);
title('音频文件幅度-采样点波形');
ylabel('幅度');
xlabel('采样点');
%横坐标换算为时间;
t0=[0:length(y)-1]/fs;
figure('name','音频文件幅度-时间波形');
plot(t0,y);
title('音频文件幅度-时间波形');
ylabel('幅度');
xlabel('时间/s');
%对音频信号进行分帧
y0=buffer(y,256); %将矩阵等分为256行,最后一列不够的补0;
y1=zeros(512,160);
for j=1:160;
        y1(:,j)=[y0(:,j);y0(:,j+1)];
end
%分帧音频数据幅度-采样点的波形
n=0:511;
figure('name','分帧音频数据幅度-采样点的波形');
for j=1:160;
    plot(n,y1(:,j));
    hold on;
end   
title('分帧音频数据幅度-采样点的波形');
ylabel('幅度');
xlabel('采样点');
%选第10帧、50帧、100帧、150帧数据查看波形;
%第10帧数据波形
figure('name','第10帧数据幅度-采样点波形');
plot(y1(:,10));
title('第10帧数据幅度-采样点波形');
ylabel('幅度');
xlabel('采样点');
%第50帧数据波形
figure('name','第50帧数据幅度-采样点波形');
plot(y1(:,50));
title('第50帧数据幅度-采样点波形');
ylabel('幅度');
xlabel('采样点');
%第100帧数据波形
figure('name','第100帧数据幅度-采样点波形');
plot(y1(:,100));
title('第100帧数据幅度-采样点波形');
ylabel('幅度');
xlabel('采样点');
%第150帧数据波形
figure('name','第150帧数据幅度-采样点波形');
plot(y1(:,150));
title('第150帧数据幅度-采样点波形');
ylabel('幅度');
xlabel('采样点');
%加汉窗
n=0:511;
wn=0.5*(1-cos(2*pi*n/511));
%汉宁窗波形
figure('name','汉宁窗波形');
plot(wn);
title('汉宁窗波形');
ylabel('幅度');
xlabel('采样点');
%加窗
y2=zeros(512,160);
for j=1:160
    for i=1:512
    y2(i,j)=wn(i)*y1(i,j);
    end
end
%加窗后的波形
%音频数据波形
figure('name','分帧音频数据+汉宁窗幅度-采样点的波形');
for j=1:160;
    plot(n,y2(:,j));hold on;
     
end   
title('分帧音频数据+汉宁窗幅度-采样点的波形');
ylabel('幅度');
xlabel('采样点');
%选第10帧、50帧、100帧、150帧数据查看波形;
%第10帧数据波形
figure('name','第10帧数据+汉宁窗幅度-采样点波形');
plot(n,y2(:,10));
title('第10帧数据+汉宁窗幅度-采样点波形');
ylabel('幅度');
xlabel('采样点');
%第50帧数据波形
figure('name','第50帧数据+汉宁窗幅度-采样点波形');
plot(n,y2(:,50));
title('第50帧数据+汉宁窗幅度-采样点波形');
ylabel('幅度');
xlabel('采样点');
%第100帧数据波形
figure('name','第100帧数据+汉宁窗幅度-采样点波形');
plot(n,y2(:,100));
title('第100帧数据+汉宁窗幅度-采样点波形');
ylabel('幅度');
xlabel('采样点');
%第150帧数据波形
figure('name','第150帧数据+汉宁窗幅度-采样点波形');
plot(n,y2(:,150));
title('第150帧数据+汉宁窗幅度-采样点波形');
ylabel('幅度');
xlabel('采样点');
%离散傅里叶变换+求模
f_abs=zeros(512,160);
for j=1:160
    f_abs(:,j)=abs(fft(y2(:,j)));
end
%只取前257个点
f=zeros(257,160);
f=f_abs(1:257,:);
nf=0:256;
%第10帧数据波形
figure('name','第10帧数据+汉宁窗+FFT+求模幅度-采样点波形');
plot(nf,f(:,10));
title('第10帧数据+汉宁窗+FFT+求模幅度-采样点波形');
ylabel('幅度');
xlabel('采样点');    
%第50帧数据波形
figure('name','第50帧数据+汉宁窗+FFT+求模幅度-采样点波形');
plot(nf,f(:,50));
title('第50帧数据+汉宁窗+FFT+求模幅度-采样点波形');
ylabel('幅度');
xlabel('采样点');   
%第100帧数据波形
figure('name','第100帧数据+汉宁窗+FFT+求模幅度-采样点波形');
plot(nf,f(:,100));
title('第100帧数据+汉宁窗+FFT+求模幅度-采样点波形');
ylabel('幅度');
xlabel('采样点');   
%第150帧数据波形
figure('name','第150帧数据+汉宁窗+FFT+求模幅度-采样点波形');
plot(nf,f(:,150));
title('第150帧数据+汉宁窗+FFT+求模幅度-采样点波形');
ylabel('幅度');
xlabel('采样点');   

nff=(0:256)*fs/512;
%第10帧数据波形
figure('name','第10帧数据+汉宁窗+FFT+求模幅度-频率波形');
plot(nff,f(:,10));
title('第10帧数据+汉宁窗+FFT+求模幅度-频率波形');
ylabel('幅度');
xlabel('频率/Hz');   
%第50帧数据波形
figure('name','第50帧数据+汉宁窗+FFT+求模幅度-频率波形');
plot(nff,f(:,50));
title('第50帧数据+汉宁窗+FFT+求模幅度-频率波形');
ylabel('幅度');
xlabel('频率/Hz'); 
%第100帧数据波形
figure('name','第100帧数据+汉宁窗+FFT+求模幅度-频率波形');
plot(nff,f(:,100));
title('第100帧数据+汉宁窗+FFT+求模幅度-频率波形');
ylabel('幅度');
xlabel('频率/Hz'); 
%第150帧数据波形
figure('name','第150帧数据+汉宁窗+FFT+求模幅度-频率波形');
plot(nff,f(:,150));
title('第150帧数据+汉宁窗+FFT+求模幅度-频率波形');
ylabel('幅度');
xlabel('频率/Hz'); 
%梅尔滤波器组
fs=16000;
fl=0; fh=fs/2;
bl=1125*log(1+fl/700);%将频率转换为Mel频率
bh=1125*log(1+fh/700);
p=64;%滤波器个数
nfft=512;%FFT点数
B=bh-bl;
y_mel=linspace(0,B,p+2);%产生0到B之间p+2个数
Fb=700*(exp(y_mel/1125)-1);%将Mel频率转换为频率
W2=nfft/2+1;%fs/2内对应的FFT点数
df=fs/nfft;
freq=(0:W2-1)*df;%采样频率值
bank=zeros(64,W2);%生成一个24行W2列的全零数组
figure('name','梅尔滤波器组');
for k=2:p+1%why从2开始?因为k-1
    f1=Fb(k-1); 
    f2=Fb(k+1); 
    f0=Fb(k);
    n1=floor(f1/df)+1;%f(m-1)在频域中的谱线索引号
    n2=floor(f2/df)+1;%f(m+1)在频域中的谱线索引号
    n0=floor(f0/df)+1;%f(m)在频域中的谱线索引号。f(m)是从0开始,而在MATLAB中数组的索引是从1开始,所以要加1,否则会出现index=0的错误
    for i=1 : W2
        if i>=n1 & i<=n0
            bank(k-1,i)=(i-n1)/(n0-n1);
        elseif i>n0 & i<=n2
            bank(k-1,i)=(n2-i)/(n2-n0);
        end
    end

    plot(freq,bank(k-1,:),'r','linewidth',2); 
    hold on;
    title('梅尔滤波器组');
    ylabel('幅度');
    xlabel('频率'); 
end
grid; 
%第10帧数据的音频特征
fm10=log(bank*f(:,10));
figure('name','第10帧数据的音频特征');
plot(fm10);
title('第10帧数据的音频特征');
ylabel('MFSC');
xlabel('梅尔滤波器组次序');
%第50帧数据的音频特征
fm50=log(bank*f(:,50));
figure('name','第50帧数据的音频特征');
plot(fm50);
title('第50帧数据的音频特征');
ylabel('MFSC');
xlabel('梅尔滤波器组次序');
%第100帧数据的音频特征
fm100=log(bank*f(:,100));
figure('name','第100帧数据的音频特征');
plot(fm100);
title('第100帧数据的音频特征');
ylabel('MFSC');
xlabel('梅尔滤波器组次序');
%第150帧数据的音频特征
fm150=log(bank*f(:,150));
figure('name','第150帧数据的音频特征');
plot(fm150);
title('第150帧数据的音频特征');
ylabel('MFSC');
xlabel('梅尔滤波器组次序');
fm=zeros(64,160);
fm=log(bank*f);

figure('name','音频特征');
x=(1:160)*0.016;%每帧数据512个点,512/16000=0.032s,但帧移=256个点,
y11=1:64;
pcolor(x,y11,fm);
% surf(x,y,z); view(0,90); %等效的写法
shading interp; 
colorbar; colormap(jet);
title('音频特征')
xlabel('时间/s');ylabel('滤波器次序');







### 回答1: Matlab 是一种功能强大的编程语言和环境,被广泛应用于音频信号处理和机器学习的领域。音频信号特征提取是一项重要的预处理任务,旨在从原始音频信号中提取有意义的特征,以供后续的机器学习任务使用。 在 Matlab 中,我们可以利用各种工具箱和函数来进行音频信号特征提取。这些工具箱提供了丰富的算法和函数,可以用于提取音频信号的各种方面的特征,如频谱特征、时域特征和时频特征等。 例如,通过使用 Matlab 中的 Fourier 变换函数,我们可以将音频信号从时域转换为频域,从而提取音频的频谱特征,如频率、振幅和相位等。另外,我们还可以使用 Matlab 中的 Wavelet 变换函数来计算音频信号的频谱子带特征,从而获取更详细的频域信息。 除了频谱特征外,我们还可以使用 Matlab 中的时域统计函数,如均值、标准差和自相关等,来提取音频信号的时域特征。这些统计特征可以反映音频信号的能量、时域波形和周期性等信息。 此外,时频特征也是音频信号特征提取中的重要内容。通过使用 Matlab 中的时频分析函数,如短时傅里叶变换 (STFT) 或连续小波变换 (CWT),我们可以获得音频信号在时间和频率上的演变信息,进而提取出时频特征,如能量谱密度、频率变化和瞬态特征等。 在机器学习阶段,通过使用 Matlab 中的机器学习工具箱,我们可以将所提取音频信号特征作为输入,构建机器学习模型,如分类器或回归器,用于音频信号的分类、识别或预测等任务。 总之,Matlab 提供了丰富的音频信号处理和机器学习工具,可以方便地进行音频信号特征提取和机器学习任务。通过合理选择和组合适当的特征提取方法和机器学习算法,我们可以实现对音频信号的有效分析和应用。 ### 回答2: MATLAB是一种功能强大的编程语言和工具,可用于音频信号处理和机器学习。音频信号特征提取音频信号处理的一项重要任务,用于从音频信号中提取有用的信息。 在MATLAB中,我们可以利用一些函数和工具箱来进行音频信号特征提取。例如,我们可以使用音频处理工具箱中的函数来计算音频信号的时域特征,如能量、平均值和标准差。我们还可以使用频谱分析函数来获取音频信号的频域特征,如频谱图和频带能量分布。 利用这些特征,我们可以建立一个机器学习模型来对音频信号进行分类或回归。例如,我们可以采集一些已经标记好的音频样本,提取它们的特征,并将特征作为输入,标签作为输出,训练一个分类模型,如支持向量机、随机森林或深度学习模型。然后,我们可以使用这个模型来对新的未知音频信号进行分类。 此外,MATLAB还提供了许多功能强大的机器学习工具箱,如统计和机器学习工具箱、深度学习工具箱等,它们提供了各种算法和功能,可以帮助我们更方便地进行音频信号特征提取和机器学习。 总而言之,MATLAB可以很好地支持音频信号特征提取与机器学习的结合。借助MATLAB提供的函数、工具箱和算法,我们可以有效地提取音频信号的特征,并利用这些特征建立机器学习模型,实现对音频信号的分类、回归等任务。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值