% This function calculates a 2-channel stereo matrix S for a given mono wave % file and the desired parameters for the difference of time and amplitude % the 2 resulting channels shall have. % The intention is to place a (mono) sound at a virtual position between to % loudspeakers so that it appears as a "phanton sound source" % % it is recommended to use loudspeakers instead of headphones % % usage: [S, FS] = stereo(amp_diff, time_diff); % e.g. [S, FS] = stereo(3,200); % % use sound(S, FS) to play the matrix S % or wavwrite(S, FS, 'stereo.wav'); % % PARAMETERS: % % amp_diff : difference between signal amplitude in dB ref. to left channel % pos. values -> the right speaker is louder % neg. values -> the left speaker is louder % amp_diff = 0 -> no difference between left and right speaker % % time_diff : desired time in microseconds difference between L and R % only the right channel is shifted % use positive values to play the sound earlier(!) on the % right speaker % % OUTPUT: % % S : [Nx2]matrix where N is the number of sound samples % % authors: Frithjof Hummes, Hendrik Buschmeier % date : 2005-10-03 function [S,FS] = stereo(amp_diff, time_diff) wavname = 'leftside'; % load the mono wave file [Y, FS, NBITS] = wavread(wavname); % initialization of the stereo matrix S = zeros(length(Y),2); % calculate the factors for the channels amplitudes % for a given difference between R and L in dB ratio = 10^(amp_diff/10); rf = ratio / (ratio + 1); lf = 1 / (ratio + 1); % calculate the number of samples to shift the channel % FS/1,000,000 samples per mirco second shft = round(time_diff * (FS / 1000000)); % calculate the final stereo matrix L = lf * Y; R = zeros(length(Y),1); % initialization of the right channel T = Y; % just a temporary vector if (shft < 0) T = T(1:length(T)+shft); % take the first samples R(1-shft:length(R)) = T; % place it at the desired position elseif (shft > 0) T = T(shft+1:length(T)); % take the last samples R(1:length(T)) = T; % place it at the desired position else R = T; % no shifting end S(:,1) = L; % copy into the stereo matrix S(:,2) = rf * R; return % stereo