教你MATLAB实现语音盲分割项目(含完整代码)

实验平台:R2016b,每一次实验新创建一个matlab文件。

(一)处理语音盲分割首先利用matlab进行录音,或选取已经下载好的.wav文件。

(1)实验程序

%录音程序
recObj = audiorecorder;
disp('Start speaking.')
recordblocking(recObj, 2);%录音
disp('End of Recording.');
% 回放录音数据
play(recObj);
% 获取录音数据
myRecording = getaudiodata(recObj);
% 绘制录音数据波形
plot(myRecording),title('apple1');
%存储语音信号
filename = 'D:...'; %填写自己的语音存储路径
audiowrite(filename,myRecording,8000);%存储

(2)步骤:执行上述代码,录音,完成实验。

(二)ICA、FICA

(1)方法:利用矩阵将原始语音信号进行混合,得到混合语音信号,对数据进行归一化和白化处理。

(2)完整程序:

clc;  
close all;
% 读入混合前的原始语音信号
S1=audioread('D:\...\music.wav');    
S2=audioread('D:\...\radio.wav');
S3=audioread('D:\...\noise.wav'); 
s1=S1';s2=S2';s3=S3';
%S=[S1;S2;S3];                
% 3x176401矩阵
Sweight=[1,4,5;3,7,2;6,2,3];               % 设置一个3*3矩阵,作为信号混合的权矩阵
MixedS=Sweight*[s1;s2;s3];                       % 得到三个信号的混合信号3x176401矩阵
figure(1)                                 
subplot(4,3,1),plot(S1),title('原始语音信号gequ1')
subplot(4,3,2),plot(S2),title('原始语音信号gequ2')
subplot(4,3,3),plot(S3),title('原始语音信号gequ3')
 % 将混合矩阵重新排列并输出
subplot(4,3,4),plot(MixedS(1,:)),title('混合语音信号1'),
subplot(4,3,5),plot(MixedS(2,:)),title('混合语音信号2'),
subplot(4,3,6),plot(MixedS(3,:)),title('混合语音信号3'), 
MixedS_bak=MixedS;                   % 将混合后的数据备份,以便在恢复时直接调用
MixedS_mean=zeros(3,1);                      %3*1矩阵
for i=1:3
    MixedS_mean(i)=mean(MixedS(i,:));     
end                                         % 计算MixedS的均值
for i=1:3
    for j=1:size(MixedS,2)                     %返回矩阵的列数
        MixedS(i,j)=MixedS(i,j)-MixedS_mean(i);
    end
end
MixedS_cov=cov(MixedS');                    % cov为求协方差的函数
[E,D]=eig(MixedS_cov);                       % 对矩阵的协方差函数进行特征值分解
Q=sqrt(D)/(E)';                          % Q为白化矩阵
MixedS_white=Q*MixedS;                     % MixedS_white为白化后的矩阵
IsI=cov(MixedS_white');                       % IsI应为单位阵    

(三)FAST、PCA

(1)方法:通过这两种算法研究如何对混合后的语音信号进行处理得到自己需要的原始数据

(2)完整程序:

clc;  
close all;
% 读入混合前的原始语音信号
S1=audioread('D:\...\music.wav');    
S2=audioread('D:\...\radio.wav');
S3=audioread('D:\...\noise.wav'); 
s1=S1';s2=S2';s3=S3';
%S=[S1;S2;S3];                
% 3x176401矩阵
Sweight=[1,4,5;3,7,2;6,2,3];               % 取一随机3*3矩阵,作为信号混合的权矩阵
MixedS=Sweight*[s1;s2;s3];                       % 得到三个信号的混合信号3x176401矩阵
figure(1)                                 
subplot(4,3,1),plot(S1),title('原始语音信号gequ1')
subplot(4,3,2),plot(S2),title('原始语音信号gequ2')
subplot(4,3,3),plot(S3),title('原始语音信号gequ3')
 % 将混合矩阵重新排列并输出
subplot(4,3,4),plot(MixedS(1,:)),title('混合语音信号1'),
subplot(4,3,5),plot(MixedS(2,:)),title('混合语音信号2'),
subplot(4,3,6),plot(MixedS(3,:)),title('混合语音信号3'), 
MixedS_bak=MixedS;                   % 将混合后的数据备份,以便在恢复时直接调用
MixedS_mean=zeros(3,1);                      %3*1矩阵
for i=1:3
    MixedS_mean(i)=mean(MixedS(i,:));     
end                                         % 计算MixedS的均值
for i=1:3
    for j=1:size(MixedS,2)                     %返回矩阵的列数
        MixedS(i,j)=MixedS(i,j)-MixedS_mean(i);
    end
end
MixedS_cov=cov(MixedS');                    % cov为求协方差的函数
[E,D]=eig(MixedS_cov);                       % 对矩阵的协方差函数进行特征值分解
Q=sqrt(D)/(E)';                          % Q为白化矩阵
MixedS_white=Q*MixedS;                     % MixedS_white为白化后的矩阵
IsI=cov(MixedS_white');                       % IsI应为单位阵    

X=MixedS_white;                    % 以下算法将对X进行操作

[VariableNum,SampleNum]=size(X);

numofIC=VariableNum;               % 在此应用中,独立元个数等于变量个数

B=zeros(numofIC,VariableNum);        % 初始化列向量w的寄存矩阵,B=[b1  b2  ...   bd]

for r=1:numofIC

i=1;maxIterationsNum=100;            % 设置最大迭代次数(即对于每个独立分量而言迭              代均不超过此次数)            

    IterationsNum=0;

    b=rand(numofIC,1)-.5;             % 随机设置b初值

    b=b/norm(b);                     % 对b标准化 norm(b):向量元素平方和开根号

    while i<=maxIterationsNum+1

        if i == maxIterationsNum       % 循环结束处理

            fprintf('\n第%d分量在%d次迭代内并不收敛。', r,maxIterationsNum);

            break;
    
        end

        bOld=b;                          

        a2=1;

        u=1;

        t=X'*b;

        g=t.*exp(-a2*t.^2/2);

        dg=(1-a2*t.^2).*exp(-a2*t.^2/2);

        b=((1-u)*t'*g*b+u*X*g)/SampleNum-mean(dg)*b;

                                       % 核心公式

        b=b-B*B'*b;                     % 对b正交化

        b=b/norm(b); 

        if abs(abs(b'*bOld)-1)<1e-9         % 如果收敛,则

             B(:,r)=b;                   % 保存所得向量b

             break;

         end

        i=i+1;        

    end

    B(:,r)=b;                             % 保存所得向量b

end

%fastICA算法语音分离

ICAedS=B'*Q*MixedS_bak;                  % 计算ICA后的矩阵

% fastICA分离语音信号

subplot(4,3,7),plot(ICAedS(1,:)),title('fastICA分离语音信号1')

subplot(4,3,8),plot(ICAedS(2,:)),title('fastICA分离语音信号2')

subplot(4,3,9),plot(ICAedS(3,:)),title('fastICA分离语音信号3')

 

你可能感兴趣的:(项目学习,matlab)