annotate Code/Descriptors/yin/private/sf_wave.m @ 4:92ca03a8fa99 tip

Update to ICASSP 2013 benchmark
author Dawn Black
date Wed, 13 Feb 2013 11:02:39 +0000
parents ea0c737c6323
children
rev   line source
dawn@0 1 function y = sf_wave(i, samples, chans)
dawn@0 2 % y=sf_wave(i,samples,chans) - read data from file
dawn@0 3 %
dawn@0 4 % y: data read from file (column vector or matrix)
dawn@0 5 %
dawn@0 6 % i: structure containing information about file
dawn@0 7 % samples: range of samples to read ([start stop]) - default ([]) means entire file
dawn@0 8 % chans: range of channels to read ([lo hi]) - default ([]) means all channels\
dawn@0 9 %
dawn@0 10
dawn@0 11 % Alain de Cheveigné, CNRS/Ircam, 2002.
dawn@0 12 % Copyright (c) 2002 Centre National de la Recherche Scientifique.
dawn@0 13 %
dawn@0 14 % Permission to use, copy, modify, and distribute this software without
dawn@0 15 % fee is hereby granted FOR RESEARCH PURPOSES only, provided that this
dawn@0 16 % copyright notice appears in all copies and in all supporting
dawn@0 17 % documentation, and that the software is not redistributed for any
dawn@0 18 % fee (except for a nominal shipping charge).
dawn@0 19 %
dawn@0 20 % For any other uses of this software, in original or modified form,
dawn@0 21 % including but not limited to consulting, production or distribution
dawn@0 22 % in whole or in part, specific prior permission must be obtained from CNRS.
dawn@0 23 % Algorithms implemented by this software may be claimed by patents owned
dawn@0 24 % by CNRS, France Telecom, Ircam or others.
dawn@0 25 %
dawn@0 26 % The CNRS makes no representations about the suitability of this
dawn@0 27 % software for any purpose. It is provided "as is" without express
dawn@0 28 % or implied warranty. Beware of the bugs.
dawn@0 29
dawn@0 30 if ~nargin | ~isfield(i, 'fname')
dawn@0 31 error('usage: i.fname = "file name", then call y=sf_wave(i)');
dawn@0 32 end
dawn@0 33 if ~isfield(i, 'format')
dawn@0 34 i = sf_info(i);
dawn@0 35 end
dawn@0 36 % defaults
dawn@0 37 if nargin<2 | isempty(samples);
dawn@0 38 if (i.nsamples) samples=[1 i.nsamples]; end;
dawn@0 39 end
dawn@0 40 if nargin<3 | isempty(chans)
dawn@0 41 if (i.nchans) chans=[1 i.nchans]; end;
dawn@0 42 end
dawn@0 43
dawn@0 44 % clip
dawn@0 45 if samples(1) < 1
dawn@0 46 samples(1) = 1;
dawn@0 47 end
dawn@0 48 if samples(2) > i.nsamples
dawn@0 49 samples(2) = i.nsamples;
dawn@0 50 end
dawn@0 51 if samples(2) < samples(1)
dawn@0 52 y=[];return
dawn@0 53 error(['start sample after stop sample: ' num2str(samples(1)) '-' num2str(samples(2))]);
dawn@0 54 end
dawn@0 55 if chans(1) < 1 | chans(2) > i.nchans
dawn@0 56 error(['requested inexistent channels: ' num2str(chans(1)) '-' num2str(chans(2))]);
dawn@0 57 end
dawn@0 58
dawn@0 59
dawn@0 60 % workspace matrix
dawn@0 61 if strcmp(i.format, 'matrix')
dawn@0 62 y = i.fname(samples(1):samples(2), chans(1):chans(2));
dawn@0 63 return
dawn@0 64 end
dawn@0 65
dawn@0 66 % use matlab functions for AU and WAV and MACSND
dawn@0 67 if strcmp(i.format, 'AU')
dawn@0 68 y=auread(i.fname, [samples(1) samples(2)]);
dawn@0 69 y=y(:,chans(1):chans(2));
dawn@0 70 return;
dawn@0 71 end
dawn@0 72 if strcmp(i.format, 'WAV')
dawn@0 73 y=wavread(i.fname, [samples(1) samples(2)]);
dawn@0 74 y=y(:,chans(1):chans(2));
dawn@0 75 return;
dawn@0 76 end
dawn@0 77 if strcmp(i.format, 'MACSND')
dawn@0 78 if 3==exist('readsnd')
dawn@0 79 y = eval('readsnd(i.fname)');
dawn@0 80 else
dawn@0 81 error('cannot read MACSND on this platform');
dawn@0 82 end
dawn@0 83 y = y(samples(1):samples(2),chans(1):chans(2));
dawn@0 84 return;
dawn@0 85 end
dawn@0 86
dawn@0 87 % close if open
dawn@0 88 % if fopen(i.fd)
dawn@0 89 % fclose(i.fd);
dawn@0 90 % end
dawn@0 91
dawn@0 92 if ~isfield(i, 'bytes_to_data')
dawn@0 93 i.bytes_to_data=0;
dawn@0 94 end
dawn@0 95
dawn@0 96 % ascii formats
dawn@0 97 if strcmp(i.format, 'ascii') | strcmp(i.format, 'csv') | strcmp(i.format, 'IWAVE')
dawn@0 98 i.fd = fopen(i.fname, 'rt');
dawn@0 99 fseek(i.fd, i.bytes_to_data, -1);
dawn@0 100
dawn@0 101 switch i.format
dawn@0 102 case 'ascii'
dawn@0 103 nsamples = samples(2) - samples(1) + 1;
dawn@0 104 nchans = chans(2) - chans(1) + 1;
dawn@0 105 y = zeros(nsamples, nchans);
dawn@0 106 % skip to start
dawn@0 107 for j=1:samples(1)-1
dawn@0 108 line = fgetl(i.fd);
dawn@0 109 if isempty(line) | line == -1; error('unexpected eof'); end
dawn@0 110 end
dawn@0 111 k=1;
dawn@0 112 % read
dawn@0 113 for j=samples(1) : samples(2)
dawn@0 114 line = fgetl(i.fd);
dawn@0 115 if isempty(line) | line == -1; error('unexpected eof'); end
dawn@0 116 a = sscanf(line, '%f');
dawn@0 117 y(k,:) = a(chans(1):chans(2))';
dawn@0 118 k = k+1;
dawn@0 119 end
dawn@0 120 case 'cvs'
dawn@0 121 error('not implemented');
dawn@0 122 case 'IWAVE'
dawn@0 123 error('not implemented');
dawn@0 124 end
dawn@0 125 fclose(i.fd);
dawn@0 126 return
dawn@0 127 end
dawn@0 128
dawn@0 129 % binary formats
dawn@0 130 fr = samples(2) - samples(1) + 1;
dawn@0 131 skip_samples = i.nchans * (samples(1) - 1);
dawn@0 132 switch i.format
dawn@0 133 case 'uchar'
dawn@0 134 i.fd = fopen(i.fname, 'r');
dawn@0 135 fseek(i.fd, i.bytes_to_data, -1);
dawn@0 136 fseek(i.fd, skip_samples * 1, 0);
dawn@0 137 y = fread(i.fd, [fr, i.nchans], 'uchar');
dawn@0 138 fclose(i.fd);
dawn@0 139 case 'short'
dawn@0 140 i.fd = fopen(i.fname, 'r');
dawn@0 141 fseek(i.fd, i.bytes_to_data, -1);
dawn@0 142 fseek(i.fd, skip_samples * 2, 0);
dawn@0 143 y = fread(i.fd, [fr, i.nchans], 'short');
dawn@0 144 fclose(i.fd);
dawn@0 145 case 'long'
dawn@0 146 i.fd = fopen(i.fname, 'r');
dawn@0 147 fseek(i.fd, i.bytes_to_data, -1);
dawn@0 148 fseek(i.fd, skip_samples * 4, 0);
dawn@0 149 y = fread(i.fd, [fr, i.nchans], 'long');
dawn@0 150 fclose(i.fd);
dawn@0 151 case 'float'
dawn@0 152 i.fd = fopen(i.fname, 'r');
dawn@0 153 fseek(i.fd, i.bytes_to_data, -1);
dawn@0 154 fseek(i.fd, skip_samples * 4, 0);
dawn@0 155 y = fread(i.fd, [fr, i.nchans], 'float');
dawn@0 156 fclose(i.fd);
dawn@0 157 case 'double'
dawn@0 158 i.fd = fopen(i.fname, 'r');
dawn@0 159 fseek(i.fd, i.bytes_to_data, -1);
dawn@0 160 fseek(i.fd, skip_samples * 8, 0);
dawn@0 161 y = fread(i.fd, [fr, i.nchans], 'double');
dawn@0 162 fclose(i.fd);
dawn@0 163 case 'NIST'
dawn@0 164 i.fd = fopen(i.fname, 'r');
dawn@0 165 fseek(i.fd, i.bytes_to_data, -1);
dawn@0 166 y = zeros(i.nsamples, i.nchans);
dawn@0 167 switch i.sample_coding
dawn@0 168 case 'pcm'
dawn@0 169 fseek(i.fd, skip_samples * 2, 0);
dawn@0 170 y = fread(i.fd, [fr, i.nchans], 'short');
dawn@0 171 otherwise
dawn@0 172 error(['cannot handle NIST sample_coding = ', i.sample_coding]);
dawn@0 173 end
dawn@0 174 fclose(i.fd);
dawn@0 175 case 'ESPS'
dawn@0 176 i.fd = fopen(i.fname, 'r');
dawn@0 177 fseek(i.fd, i.bytes_to_data, -1);
dawn@0 178 fseek(i.fd, skip_samples * 2, 0);
dawn@0 179 y = fread(i.fd, [fr, i.nchans], 'short');
dawn@0 180
dawn@0 181 case 'AIFF'
dawn@0 182 i.fd = fopen(i.fname, 'r', 's');
dawn@0 183 fseek(i.fd, i.bytes_to_data, -1);
dawn@0 184 % should check sample size
dawn@0 185 fseek(i.fd, skip_samples * 2, 0);
dawn@0 186 y = fread(i.fd, [fr, i.nchans], 'short');
dawn@0 187 fclose(i.fd);
dawn@0 188
dawn@0 189 otherwise
dawn@0 190 error(['don''t know how to load format = ', i.format]);
dawn@0 191 end
dawn@0 192
dawn@0 193 y = y(:,chans(1):chans(2));