This repository has been archived on 2021-05-17. You can view files and clone it, but cannot push or open issues or pull requests.
scientificComputing/linearalgebra/code/soundmixture.m
2014-11-12 18:39:02 +01:00

73 lines
1.7 KiB
Matlab

% read in wav files:
[s1, fs1 ] = audioread( 'PeterUndDerWolf.wav' );
[s2, fs2 ] = audioread( 'Tielli-Kraulis.wav' );
[s3, fs3 ] = audioread( 'Chorthippus_biguttulus.wav' );
% take out left channel and minimum number of samples:
n = min( [ size( s1, 1 ), size( s2, 1 ), size( s3, 1 ) ] );
%n = 300000;
x1 = s1(1:n,1)';
x2 = s2(1:n,1)';
x3 = s3(1:n,1)';
clear s1 s2 s3;
% plot the sound waves:
% dt = 1/fs1;
% time = 0:dt:(length(x1)-1)*dt;
% plot( time, x1 );
% plot( time, x2 );
% plot( time, x3 );
% play original sounds:
% disp( 'Playing x1 (Peter und der Wolf)' )
% a = audioplayer( x1, fs1 );
% playblocking( a );
% disp( 'Playing x2 (Martin Tielli)' )
% a = audioplayer( x2, fs2 );
% playblocking( a );
% disp( 'Playing x3 (Grasshopper song)' )
% a = audioplayer( x3, fs3 );
% playblocking( a );
% mix them:
m = [ 1.0 0.3 0.4; 0.1 0.6 0.4; 0.7 0.1 0.7 ];
y = m*[ x1; x2; x3 ];
% add noise:
%y = y + 0.03*randn(size(y));
% play mixtures:
% disp( 'Playing mixture y1' )
% a = audioplayer( y(1,:), fs1 );
% playblocking( a );
% disp( 'Playing mixture y2' )
% a = audioplayer( y(2,:), fs2 );
% playblocking( a );
% disp( 'Playing mixture y3' )
% a = audioplayer( y(3,:), fs3 );
% playblocking( a );
% demix them:
disp( 'Inverse mixing matrix:' )
dm = inv(m)
dx = dm*y;
% estimate demixing matrix:
size( y )
cv = cov( y' );
[ ev ed ] = eig( cv );
disp( 'Estimated demixing matrix:' )
ev
%play mixtures:
% disp( 'Playing x1 (Peter und der Wolf) recovered from mixtures' )
% a = audioplayer( dx(1,:), fs1 );
% playblocking( a );
% disp( 'Playing x3 (Martin Tielli) recovered from mixtures' )
% a = audioplayer( dx(2,:), fs2 );
% playblocking( a );
% disp( 'Playing x3 (Grasshopper song) recovered from mixtures' )
% a = audioplayer( dx(3,:), fs3 );
% playblocking( a );