Matlab:音频提取特征与神经网络

Matlab:音频提取特征与神经网络,matlab,neural-network,audio-processing,Matlab,Neural Network,Audio Processing,我有一个50 wav文件的玻璃破碎的声音和50 wav文件的正常声音。所有声音文件的持续时间均为1秒。然后我需要用神经网络对声音进行分类。如何提取声音文件,应使用何种神经网络 下面是我和我的朋友一直在研究的代码: %network input extraction (retrieve trimmed data audio) p = which('audio_000.wav'); file_list = dir ([fileparts(p) filesep 'audio_***.wav']);

我有一个50 wav文件的玻璃破碎的声音和50 wav文件的正常声音。所有声音文件的持续时间均为1秒。然后我需要用神经网络对声音进行分类。如何提取声音文件,应使用何种神经网络

下面是我和我的朋友一直在研究的代码:

%network input extraction (retrieve trimmed data audio)

p = which('audio_000.wav');
file_list = dir ([fileparts(p)  filesep 'audio_***.wav']);
% file 000-050 is glass break 
% file 051-100 is normal 
file_names = {file_list.name}';
n = length(file_names);
inp = zeros (n,6);

for k=1:n
    %read WAV file 
    aud1=audioread(file_names{k});
    a=16000;
    aud2=zeros(a,1);
    [m,o]=size(aud1);
    j=1:m;
    aud2(j)=aud1(j);

    %Fourrier Transforms
    %extract feature

    Fs=1000;
    nfft=500;
    X=fftshift(fft(aud2,nfft));
    X=X(1:nfft);
    mx=abs(X);
    f= -Fs/2:Fs/(nfft-1):Fs/2;

    %sorting to gets 5 peaks of FFT
    %retrieve 5 highest value of peaks 

    mx1=mx;
    f1=f;
    s=zeros(nfft,2);
    for i=1:nfft %sort the value of 5 peak amplitude and retrieve 5 highest
        if f1(i)<=1
            mx1(i)=0;
        end
        s(i,1)=mx(i);
        s(i,2)=f1(i);
    end
    s1=sortrows(s);
    s2=s1;
    for i=nfft:-1:2
        if s1(i,1)>s1(i-1,1) && s1(i,2)>s1(i-1,2)
            s2(i-1,1)=0;
        end
    end
    s3=sortrows(s2);
    s4=s3;

    for i=nfft:-1:2
    if s3(i,1)>s3(i-1,1) && s3(i,2)-s3(i-1,2)>-1
    s4(i-1,1)=0;
        end
    end
    s5=sortrows(s4);

    %get length of WAV files 
    l=m/10e4;

    % Input Vector for neural network
    % 5 input from FFT
    % i input from the length audio

    inp(k,1:end)=[s3(nfft:-1:nfft-4,2)' l];
end
figure, plot(aud1); 
figure, plot(f,mx);

% define target 
tar=zeros(2,1);

%tar(1:50) glass break
%tar(51:100) normal sound

tar(1:50,1)=0;
tar(51:100,1)=1;

trinput=inp';
trtarget=tar';

display('press any key to cont');

% neural network training

nnstart; %start neural network tool 
%网络输入提取(检索修剪过的数据音频)
p=哪个('audio_000.wav');
file_list=dir([fileparts(p)filesep'audio_***.wav']);
%文件000-050是玻璃破裂
%文件051-100正常
file_names={file_list.name}';
n=长度(文件名);
inp=零(n,6);
对于k=1:n
%读取WAV文件
aud1=音频读取(文件名{k});
a=16000;
aud2=零(a,1);
[m,o]=尺寸(aud1);
j=1:m;
aud2(j)=aud1(j);
%Fourier变换
%提取特征
Fs=1000;
nfft=500;
X=fft移位(fft(aud2,nfft));
X=X(1:nfft);
mx=abs(X);
f=-Fs/2:Fs/(nfft-1):Fs/2;
%排序得到5个FFT峰值
%检索5个最高峰值
mx1=mx;
f1=f;
s=零(nfft,2);
对于i=1:nfft%,对5个峰值振幅的值进行排序,并检索5个最高值
如果f1(i)s1(i-1,1)和&s1(i,2)>s1(i-1,2)
s2(i-1,1)=0;
结束
结束
s3=sortrows(s2);
s4=s3;
对于i=nfft:-1:2
如果s3(i,1)>s3(i-1,1)&s3(i,2)-s3(i-1,2)>1
s4(i-1,1)=0;
结束
结束
s5=sortrows(s4);
%获取WAV文件的长度
l=m/10e4;
%神经网络的输入向量
%5来自FFT的输入
%我从长度音频输入
inp(k,1:end)=[s3(nfft:-1:nfft-4,2)'l];
结束
图形、绘图(aud1);
图,绘图(f,mx);
%确定目标
焦油=零(2,1);
%焦油(1:50)玻璃破碎
%焦油(51:100)正常声音
焦油(1:50,1)=0;
焦油(51:100,1)=1;
trinput=inp';
trtarget=tar';
显示(“按任意键继续”);
%神经网络训练
nnstart;%启动神经网络工具

X
成为包含使用fft提取的特征的矩阵
T
是您的目标向量,其中
T(i)=0
,如果您的第i个声音文件包含正常声音,
T(i)=1
,如果您的第i个声音文件包含打碎玻璃的声音

设置神经网络的层大小:

layerSize = 10;
并初始化您的网络

net = patternnet(layerSize);
[net,tr] = train(net,X,T);
然后,您可以将数据分为培训集、验证集和测试集

net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
现在你可以训练你的人际网络了

net = patternnet(layerSize);
[net,tr] = train(net,X,T);
并进行测试

outputs = net(X);
errors = gsubtract(T,outputs);
performance = perform(net,T,outputs);
最后

view(net)

请注意,您可以在Mathworks上找到这段代码,并提供更详细的解释。

我尝试使用FFT提取信号的特征。然后您可以使用这些特征来训练神经网络。你可以看看这个教程:但是如果你分享一些代码,它会更容易帮助你。我用代码编辑文章,我如何介绍目标?所以。对于代码,我只需要用您刚才给出的代码继续代码?I@BassamAbdulBasir基本上是的。你只需要正确初始化你的特征矩阵和目标向量。正确的维度,
X
T
以相同的顺序响应声音,等等。