view aux/stripzeros.m @ 8:2afd6ff39f08

prepare2listen fixes
author Brecht De Man <b.deman@qmul.ac.uk>
date Fri, 28 Nov 2014 00:52:12 +0000
parents 5e72201496c8
children 0014c50188da
line wrap: on
line source
function stripzeros(foldername)
% STRIPZEROS strips off an array of samples that equal zero at the 
% beginning and end of an audio file. 
%
% by Brecht De Man at Centre for Digital Music on 17 November 2014

    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

    for i = 1:length(list) % go over each file in the folder
        [audio, fs] = audioread([foldername '/' list(i).name]);

        numSamples  = size(audio,1);
        numChannels = size(audio,2);
        bitDepth    = 24; % not automated here
        startIndex  = zeros(numChannels, 1);
        stopIndex   = zeros(numChannels, 1);

        % first and last non-zero elements (for all channels)
        for channel = 1:numChannels
            % ? more efficient way to find first and last non-zero sample?
            indexOfNonZeroSamples = find(audio(:,channel)); % returns indices non-zero elements
            startIndex(channel) = min(indexOfNonZeroSamples);
            stopIndex(channel)  = max(indexOfNonZeroSamples);
        end

        start = max(startIndex);
        stop  = min(stopIndex);

        % if startIndex and stopIndex are both equal to first and last sample: 
        % do nothing.
        % else: 
        if start>1 || stop<numSamples
            audiowrite([foldername '/' list(i).name], audio([start:stop], :), ...
                fs, 'BitsPerSample', bitDepth);
        end

        % debugging/monitoring: 
        startCrop = (start-1)/fs; %
        stopCrop  = (size(audio,1)-stop)/fs;
        disp([num2str(startCrop) 's (start) / ' num2str(stopCrop) 's (end) stripped off ' list(i).name]);
    end

    elapsedTime = toc;  % stop measuring time
    disp(['stripzeros took ' num2str(elapsedTime) ' seconds to strip zeros off the files in folder ' ...
    foldername]);

end