Chris@0
|
1 function [f_audio,sideinfo] = wav_to_audio(dirAbs,dirRel,wavfilename,parameter)
|
Chris@0
|
2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
3 % Name: wav_to_audio
|
Chris@0
|
4 % Date of Revision: 2011-03
|
Chris@0
|
5 % Programmer: Meinard Mueller, Sebastian Ewert
|
Chris@0
|
6 %
|
Chris@0
|
7 % Description:
|
Chris@0
|
8 % Loads a Wav file and fills a sideinfo variable according to AGtoolbox
|
Chris@0
|
9 % specifications. Resampling and single channel conversion is default, but
|
Chris@0
|
10 % optional.
|
Chris@0
|
11 %
|
Chris@0
|
12 % Input:
|
Chris@0
|
13 % dirAbs
|
Chris@0
|
14 % dirRel
|
Chris@0
|
15 % wavfilename
|
Chris@0
|
16 % parameter.useResampling = 1;
|
Chris@0
|
17 % parameter.destSamplerate = 22050;
|
Chris@0
|
18 % parameter.convertToMono = 1;
|
Chris@0
|
19 % parameter.monoConvertMode = 'downmix';
|
Chris@0
|
20 % parameter.message = 0;
|
Chris@0
|
21 % parameter.vis = 0;
|
Chris@0
|
22 % parameter.save = 0;
|
Chris@0
|
23 % parameter.saveDir = [dirAbs,dirRel];
|
Chris@0
|
24 % parameter.saveFilename = wavfilename;
|
Chris@0
|
25 %
|
Chris@0
|
26 % Output:
|
Chris@0
|
27 % f_audio
|
Chris@0
|
28 % sideinfo.wav.version
|
Chris@0
|
29 % sideinfo.wav.filename
|
Chris@0
|
30 % sideinfo.wav.dirRel
|
Chris@0
|
31 % sideinfo.wav.size
|
Chris@0
|
32 % sideinfo.wav.duration
|
Chris@0
|
33 % sideinfo.wav.energy
|
Chris@0
|
34 % sideinfo.wav.fs
|
Chris@0
|
35 % sideinfo.wav.nbits
|
Chris@0
|
36 % sideinfo.wav.channels
|
Chris@0
|
37 % sideinfo.wav.resampled
|
Chris@0
|
38 % sideinfo.wav.monoConverted
|
Chris@0
|
39 % sideinfo.wav.monoConvertMode
|
Chris@0
|
40 %
|
Chris@0
|
41 %
|
Chris@0
|
42 % License:
|
Chris@0
|
43 % This file is part of 'Chroma Toolbox'.
|
Chris@0
|
44 %
|
Chris@0
|
45 % 'Chroma Toolbox' is free software: you can redistribute it and/or modify
|
Chris@0
|
46 % it under the terms of the GNU General Public License as published by
|
Chris@0
|
47 % the Free Software Foundation, either version 2 of the License, or
|
Chris@0
|
48 % (at your option) any later version.
|
Chris@0
|
49 %
|
Chris@0
|
50 % 'Chroma Toolbox' is distributed in the hope that it will be useful,
|
Chris@0
|
51 % but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Chris@0
|
52 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
Chris@0
|
53 % GNU General Public License for more details.
|
Chris@0
|
54 %
|
Chris@0
|
55 % You should have received a copy of the GNU General Public License
|
Chris@0
|
56 % along with 'Chroma Toolbox'. If not, see <http://www.gnu.org/licenses/>.
|
Chris@0
|
57 %
|
Chris@0
|
58 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
59
|
Chris@0
|
60 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
61 % Check parameters
|
Chris@0
|
62 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
63
|
Chris@0
|
64 if nargin<4
|
Chris@0
|
65 parameter=[];
|
Chris@0
|
66 end
|
Chris@0
|
67 if nargin<3
|
Chris@0
|
68 error('Please specify at least the path and filename of the wav file')
|
Chris@0
|
69 end
|
Chris@0
|
70
|
Chris@0
|
71 if isfield(parameter,'useResampling')==0
|
Chris@0
|
72 parameter.useResampling = 1;
|
Chris@0
|
73 end
|
Chris@0
|
74 if isfield(parameter,'destSamplerate')==0
|
Chris@0
|
75 parameter.destSamplerate = 22050;
|
Chris@0
|
76 end
|
Chris@0
|
77 if isfield(parameter,'convertToMono')==0
|
Chris@0
|
78 parameter.convertToMono = 1;
|
Chris@0
|
79 end
|
Chris@0
|
80 if isfield(parameter,'monoConvertMode')==0
|
Chris@0
|
81 parameter.monoConvertMode = 'downmix';
|
Chris@0
|
82 end
|
Chris@0
|
83 if isfield(parameter,'message')==0
|
Chris@0
|
84 parameter.message = 0;
|
Chris@0
|
85 end
|
Chris@0
|
86 if isfield(parameter,'vis')==0
|
Chris@0
|
87 parameter.vis = 0;
|
Chris@0
|
88 end
|
Chris@0
|
89 if isfield(parameter,'save')==0
|
Chris@0
|
90 parameter.save = 0;
|
Chris@0
|
91 end
|
Chris@0
|
92 if isfield(parameter,'saveDir')==0
|
Chris@0
|
93 parameter.saveDir = [dirAbs,dirRel];
|
Chris@0
|
94 end
|
Chris@0
|
95 if isfield(parameter,'saveFilename')==0
|
Chris@0
|
96 parameter.saveFilename = wavfilename;
|
Chris@0
|
97 end
|
Chris@0
|
98
|
Chris@0
|
99 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
100 % Main program
|
Chris@0
|
101 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
102 if parameter.message == 1
|
Chris@0
|
103 fprintf('wav_to_audio: processing %s, ',wavfilename);
|
Chris@0
|
104 end
|
Chris@0
|
105
|
Chris@0
|
106 [pathstr,name,ext] = fileparts(wavfilename);
|
Chris@0
|
107 if strcmp(ext,'.wav')
|
Chris@0
|
108 [f_audio,fs,nbits] = wavread(strcat(dirAbs,dirRel,wavfilename));
|
Chris@0
|
109 else
|
Chris@0
|
110 error(['Unknown file format ' ext]);
|
Chris@0
|
111 end
|
Chris@0
|
112
|
Chris@0
|
113
|
Chris@0
|
114 bConverted_to_mono = 0;
|
Chris@0
|
115 if parameter.convertToMono
|
Chris@0
|
116 if size(f_audio,2)>1
|
Chris@0
|
117 bConverted_to_mono = 1;
|
Chris@0
|
118 if parameter.message == 1
|
Chris@0
|
119 fprintf('converting to mono, ');
|
Chris@0
|
120 end
|
Chris@0
|
121 switch parameter.monoConvertMode
|
Chris@0
|
122 case 'leftmost_channel'
|
Chris@0
|
123 f_audio= f_audio(:,1);
|
Chris@0
|
124 case 'rightmost_channel'
|
Chris@0
|
125 f_audio= f_audio(:,size(f_audio,2));
|
Chris@0
|
126 case 'downmix'
|
Chris@0
|
127 % pay attention to energy loss due to differences in phase
|
Chris@0
|
128 % when using this method. This is often the case for bad
|
Chris@0
|
129 % stereo mixes
|
Chris@0
|
130 nChannels = size(f_audio,2);
|
Chris@0
|
131
|
Chris@0
|
132 f_audio = sum(f_audio,2);
|
Chris@0
|
133 f_audio = f_audio / nChannels;
|
Chris@0
|
134 otherwise
|
Chris@0
|
135 disp('wav_to_audio: monoConvertMode : Unknown method')
|
Chris@0
|
136 end
|
Chris@0
|
137 end
|
Chris@0
|
138 end
|
Chris@0
|
139
|
Chris@0
|
140 bResampled = 0;
|
Chris@0
|
141 if parameter.useResampling
|
Chris@0
|
142 if (fs ~= parameter.destSamplerate)
|
Chris@0
|
143 bResampled = 1;
|
Chris@0
|
144 if parameter.message == 1
|
Chris@0
|
145 fprintf('Resampling to %d, ', parameter.destSamplerate);
|
Chris@0
|
146 end
|
Chris@0
|
147 f_audio = resample (f_audio,parameter.destSamplerate,fs,100);
|
Chris@0
|
148 fs = parameter.destSamplerate;
|
Chris@0
|
149 end
|
Chris@0
|
150 end
|
Chris@0
|
151
|
Chris@0
|
152 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
153 % Update sideinfo
|
Chris@0
|
154 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
155 sideinfo.wav.version = 1;
|
Chris@0
|
156 sideinfo.wav.filename = wavfilename;
|
Chris@0
|
157 sideinfo.wav.dirRel = dirRel;
|
Chris@0
|
158 sideinfo.wav.size = size(f_audio,1);
|
Chris@0
|
159 sideinfo.wav.duration = (sideinfo.wav.size-1)/fs;
|
Chris@0
|
160 sideinfo.wav.energy = sum(f_audio.^2);
|
Chris@0
|
161 sideinfo.wav.fs = fs;
|
Chris@0
|
162 sideinfo.wav.nbits = nbits;
|
Chris@0
|
163 sideinfo.wav.channels = size(f_audio,2);
|
Chris@0
|
164 sideinfo.wav.resampled = bResampled;
|
Chris@0
|
165 sideinfo.wav.monoConverted = bConverted_to_mono;
|
Chris@0
|
166 if bConverted_to_mono
|
Chris@0
|
167 sideinfo.wav.monoConvertMode = parameter.monoConvertMode;
|
Chris@0
|
168 else
|
Chris@0
|
169 sideinfo.wav.monoConvertMode = 'none';
|
Chris@0
|
170 end
|
Chris@0
|
171
|
Chris@0
|
172 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
173 % Saving data
|
Chris@0
|
174 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
175 if parameter.save == 1
|
Chris@0
|
176 if parameter.message == 1
|
Chris@0
|
177 fprintf('Saving to file, ');
|
Chris@0
|
178 end
|
Chris@0
|
179 filename = strcat(parameter.saveFilename,'_audio');
|
Chris@0
|
180 save(strcat(parameter.saveDir,filename),'f_audio','sideinfo');
|
Chris@0
|
181 end
|
Chris@0
|
182
|
Chris@0
|
183 if parameter.message == 1
|
Chris@0
|
184 fprintf('Done\n');
|
Chris@0
|
185 end
|
Chris@0
|
186
|
Chris@0
|
187 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
188 % Visualization
|
Chris@0
|
189 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
Chris@0
|
190 if parameter.vis
|
Chris@0
|
191 figure;
|
Chris@0
|
192 for k=1:sideinfo.wav.channels
|
Chris@0
|
193 if sideinfo.wav.channels > 1
|
Chris@0
|
194 subplot(sideinfo.wav.channels,1,k);
|
Chris@0
|
195 end
|
Chris@0
|
196 plot( [0:sideinfo.wav.size-1] / sideinfo.wav.fs , f_audio(:,k));
|
Chris@0
|
197 axis tight;
|
Chris@0
|
198 end
|
Chris@0
|
199 end
|
Chris@0
|
200
|
Chris@0
|
201 end |