annotate matlab/MATLAB-Chroma-Toolbox_2.0/wav_to_audio.m @ 60:1ea2aed23d4a tip

Fix version
author Chris Cannam
date Thu, 13 Feb 2020 13:37:36 +0000
parents b54ee0a0be67
children
rev   line source
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