Mercurial > hg > ape
view aux/autoalign.m @ 8:2afd6ff39f08
prepare2listen fixes
author | Brecht De Man <b.deman@qmul.ac.uk> |
---|---|
date | Fri, 28 Nov 2014 00:52:12 +0000 |
parents | ed0a8621b96a |
children | 866c5da4d357 |
line wrap: on
line source
function autoalign(foldername) % AUTOALIGN aligns audio in folder with selected file by inserting zeros % at the start of the files. % % by Brecht De Man at Centre for Digital Music on 17 November 2014 % error('Work in progress, function not finished'); % while unfinished tic; % start measuring time list = dir([foldername '/*.wav']); % get names of files % remove hidden files from list % see http://www.mathworks.co.uk/matlabcentral/newsreader/view_thread/258220 for k = length(list):-1:1 fname = list(k).name; if fname(1) == '.' list(k) = [ ]; end end shiftvec = zeros(length(list), 1); % first file: masterAudioChannels = audioread([foldername '/' list(1).name]); % read file masterAudio = sum(masterAudioChannels, 2); % sum to mono % for each other file: for i = 2:length(list) slaveAudioChannels = audioread([foldername '/' list(i).name]); % read file slaveAudio = sum(slaveAudioChannels, 2); % sum to mono % check sampling rate is the same (or: express in terms of seconds) % ... % crosscorrelation function [xc, timeaxis] = xcorr(masterAudio, slaveAudio); [value, lag] = max(abs(xc)); shiftvec(i) = timeaxis(lag); % debugging plots % figure; % title(['Crosscorrelation file 1 vs ' num2str(i)]); % subplot(2,1,1); % plot(timeaxis, xc); % xlabel('Samples'); % ylabel('Crosscorrelation'); % subplot(2,1,2); % plot(timeaxis, abs(xc)); % xlabel('Samples'); % ylabel('Absolute value of crosscorrelation'); % monitoring/debugging end % add absolute of largest negative lag worth of zeros to all; % then add 'shiftvec' value to that maxlag = min(shiftvec); for i = 1:length(list) [audio, fs] = audioread([foldername '/' list(i).name]); audiowrite([foldername '/' list(i).name], ... [zeros(-maxlag + shiftvec(i), size(audio, 2)) ; audio], ... fs, 'BitsPerSample', 24); end elapsedTime = toc; % stop measuring time disp(['autoalign took ' num2str(elapsedTime) ... ' seconds to align the files in folder ' foldername]); end