Mercurial > hg > emotion-detection-top-level
diff Code/Descriptors/yin/private/src/sf_wave.m @ 4:92ca03a8fa99 tip
Update to ICASSP 2013 benchmark
author | Dawn Black |
---|---|
date | Wed, 13 Feb 2013 11:02:39 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Code/Descriptors/yin/private/src/sf_wave.m Wed Feb 13 11:02:39 2013 +0000 @@ -0,0 +1,193 @@ +function y = sf_wave(i, samples, chans) +% y=sf_wave(i,samples,chans) - read data from file +% +% y: data read from file (column vector or matrix) +% +% i: structure containing information about file +% samples: range of samples to read ([start stop]) - default ([]) means entire file +% chans: range of channels to read ([lo hi]) - default ([]) means all channels\ +% + +% Alain de Cheveigné, CNRS/Ircam, 2002. +% Copyright (c) 2002 Centre National de la Recherche Scientifique. +% +% Permission to use, copy, modify, and distribute this software without +% fee is hereby granted FOR RESEARCH PURPOSES only, provided that this +% copyright notice appears in all copies and in all supporting +% documentation, and that the software is not redistributed for any +% fee (except for a nominal shipping charge). +% +% For any other uses of this software, in original or modified form, +% including but not limited to consulting, production or distribution +% in whole or in part, specific prior permission must be obtained from CNRS. +% Algorithms implemented by this software may be claimed by patents owned +% by CNRS, France Telecom, Ircam or others. +% +% The CNRS makes no representations about the suitability of this +% software for any purpose. It is provided "as is" without express +% or implied warranty. Beware of the bugs. + +if ~nargin | ~isfield(i, 'fname') + error('usage: i.fname = "file name", then call y=sf_wave(i)'); +end +if ~isfield(i, 'format') + i = sf_info(i); +end +% defaults +if nargin<2 | isempty(samples); + if (i.nsamples) samples=[1 i.nsamples]; end; +end +if nargin<3 | isempty(chans) + if (i.nchans) chans=[1 i.nchans]; end; +end + +% clip +if samples(1) < 1 + samples(1) = 1; +end +if samples(2) > i.nsamples + samples(2) = i.nsamples; +end +if samples(2) < samples(1) + y=[];return + error(['start sample after stop sample: ' num2str(samples(1)) '-' num2str(samples(2))]); +end +if chans(1) < 1 | chans(2) > i.nchans + error(['requested inexistent channels: ' num2str(chans(1)) '-' num2str(chans(2))]); +end + + +% workspace matrix +if strcmp(i.format, 'matrix') + y = i.fname(samples(1):samples(2), chans(1):chans(2)); + return +end + +% use matlab functions for AU and WAV and MACSND +if strcmp(i.format, 'AU') + y=auread(i.fname, [samples(1) samples(2)]); + y=y(:,chans(1):chans(2)); + return; +end +if strcmp(i.format, 'WAV') + y=wavread(i.fname, [samples(1) samples(2)]); + y=y(:,chans(1):chans(2)); + return; +end +if strcmp(i.format, 'MACSND') + if 3==exist('readsnd') + y = eval('readsnd(i.fname)'); + else + error('cannot read MACSND on this platform'); + end + y = y(samples(1):samples(2),chans(1):chans(2)); + return; +end + +% close if open +% if fopen(i.fd) +% fclose(i.fd); +% end + +if ~isfield(i, 'bytes_to_data') + i.bytes_to_data=0; +end + +% ascii formats +if strcmp(i.format, 'ascii') | strcmp(i.format, 'csv') | strcmp(i.format, 'IWAVE') + i.fd = fopen(i.fname, 'rt'); + fseek(i.fd, i.bytes_to_data, -1); + + switch i.format + case 'ascii' + nsamples = samples(2) - samples(1) + 1; + nchans = chans(2) - chans(1) + 1; + y = zeros(nsamples, nchans); + % skip to start + for j=1:samples(1)-1 + line = fgetl(i.fd); + if isempty(line) | line == -1; error('unexpected eof'); end + end + k=1; + % read + for j=samples(1) : samples(2) + line = fgetl(i.fd); + if isempty(line) | line == -1; error('unexpected eof'); end + a = sscanf(line, '%f'); + y(k,:) = a(chans(1):chans(2))'; + k = k+1; + end + case 'cvs' + error('not implemented'); + case 'IWAVE' + error('not implemented'); + end + fclose(i.fd); + return +end + +% binary formats +fr = samples(2) - samples(1) + 1; +skip_samples = i.nchans * (samples(1) - 1); +switch i.format +case 'uchar' + i.fd = fopen(i.fname, 'r'); + fseek(i.fd, i.bytes_to_data, -1); + fseek(i.fd, skip_samples * 1, 0); + y = fread(i.fd, [fr, i.nchans], 'uchar'); + fclose(i.fd); +case 'short' + i.fd = fopen(i.fname, 'r'); + fseek(i.fd, i.bytes_to_data, -1); + fseek(i.fd, skip_samples * 2, 0); + y = fread(i.fd, [fr, i.nchans], 'short'); + fclose(i.fd); +case 'long' + i.fd = fopen(i.fname, 'r'); + fseek(i.fd, i.bytes_to_data, -1); + fseek(i.fd, skip_samples * 4, 0); + y = fread(i.fd, [fr, i.nchans], 'long'); + fclose(i.fd); +case 'float' + i.fd = fopen(i.fname, 'r'); + fseek(i.fd, i.bytes_to_data, -1); + fseek(i.fd, skip_samples * 4, 0); + y = fread(i.fd, [fr, i.nchans], 'float'); + fclose(i.fd); +case 'double' + i.fd = fopen(i.fname, 'r'); + fseek(i.fd, i.bytes_to_data, -1); + fseek(i.fd, skip_samples * 8, 0); + y = fread(i.fd, [fr, i.nchans], 'double'); + fclose(i.fd); +case 'NIST' + i.fd = fopen(i.fname, 'r'); + fseek(i.fd, i.bytes_to_data, -1); + y = zeros(i.nsamples, i.nchans); + switch i.sample_coding + case 'pcm' + fseek(i.fd, skip_samples * 2, 0); + y = fread(i.fd, [fr, i.nchans], 'short'); + otherwise + error(['cannot handle NIST sample_coding = ', i.sample_coding]); + end + fclose(i.fd); +case 'ESPS' + i.fd = fopen(i.fname, 'r'); + fseek(i.fd, i.bytes_to_data, -1); + fseek(i.fd, skip_samples * 2, 0); + y = fread(i.fd, [fr, i.nchans], 'short'); + +case 'AIFF' + i.fd = fopen(i.fname, 'r', 's'); + fseek(i.fd, i.bytes_to_data, -1); + % should check sample size + fseek(i.fd, skip_samples * 2, 0); + y = fread(i.fd, [fr, i.nchans], 'short'); + fclose(i.fd); + +otherwise + error(['don''t know how to load format = ', i.format]); +end + +y = y(:,chans(1):chans(2));