matthiasm@0
|
1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
matthiasm@0
|
2 % Audio Degradation Toolbox
|
matthiasm@0
|
3 %
|
matthiasm@0
|
4 % Centre for Digital Music, Queen Mary University of London.
|
matthiasm@0
|
5 % This file copyright 2013 Sebastian Ewert, Matthias Mauch and QMUL.
|
SebastianEwert@4
|
6 %
|
matthiasm@0
|
7 % This program is free software; you can redistribute it and/or
|
matthiasm@0
|
8 % modify it under the terms of the GNU General Public License as
|
matthiasm@0
|
9 % published by the Free Software Foundation; either version 2 of the
|
matthiasm@0
|
10 % License, or (at your option) any later version. See the file
|
matthiasm@0
|
11 % COPYING included with this distribution for more information.
|
matthiasm@0
|
12 %
|
matthiasm@0
|
13 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
matthiasm@0
|
14
|
matthiasm@0
|
15 % Note: Some degradations impose a delay/temporal distortion on the input
|
matthiasm@0
|
16 % data. The last example shows, given time positions before the
|
matthiasm@0
|
17 % degradation, how the corresponding time positions after the degradation
|
matthiasm@0
|
18 % can be retrieved
|
matthiasm@0
|
19
|
matthiasm@0
|
20 %%
|
matthiasm@0
|
21
|
matthiasm@0
|
22 clear
|
SebastianEwert@4
|
23 close all
|
matthiasm@0
|
24
|
matthiasm@0
|
25 addpath(fullfile(pwd,'AudioDegradationToolbox'));
|
matthiasm@0
|
26
|
matthiasm@0
|
27 pathOutputDemo = 'demoOutput/';
|
matthiasm@0
|
28 if ~exist(pathOutputDemo,'dir'), mkdir(pathOutputDemo); end
|
matthiasm@0
|
29
|
SebastianEwert@4
|
30 filenames = {
|
SebastianEwert@4
|
31 'testdata/RWC_G39.wav';
|
SebastianEwert@4
|
32 'testdata/RWC_G72.wav';
|
SebastianEwert@4
|
33 'testdata/RWC_G84.wav';
|
SebastianEwert@4
|
34 'testdata/RWC_P009m_drum.wav';
|
SebastianEwert@4
|
35 'testdata/RWC-C08.wav';
|
matthiasm@7
|
36 'testdata/session5-faure_elegie2c-001-0.wav';
|
matthiasm@7
|
37 'testdata/175234__kenders2000__nonsense-sentence.wav';
|
SebastianEwert@4
|
38 };
|
matthiasm@0
|
39
|
matthiasm@9
|
40 createSpectrograms = 0;
|
matthiasm@0
|
41
|
matthiasm@0
|
42 %%
|
SebastianEwert@4
|
43 % just copying original files to the demo folder
|
SebastianEwert@5
|
44 maxValueRangeVis = zeros(length(filenames));
|
SebastianEwert@4
|
45 for k=1:length(filenames)
|
SebastianEwert@4
|
46 copyfile(filenames{k}, fullfile(pathOutputDemo,sprintf('00_Original_file%d.wav',k)))
|
SebastianEwert@4
|
47 if createSpectrograms
|
SebastianEwert@4
|
48 [f_audio,samplingFreq]=wavread(filenames{k});
|
SebastianEwert@4
|
49 [s,f,t] = spectrogram(f_audio,hamming(round(samplingFreq*0.093)),round(samplingFreq*0.093/2),[],samplingFreq);
|
SebastianEwert@4
|
50 figure; imagesc(t,f,log10(abs(s)+1)); axis xy; colormap(hot); ylim([0,8000]); colorbar; print('-dpng', fullfile(pathOutputDemo,sprintf('00_Original_file%d.png',k)))
|
SebastianEwert@5
|
51 maxValueRangeVis(k) = max(max(log10(abs(s)+1)));
|
SebastianEwert@4
|
52 end
|
SebastianEwert@4
|
53 end
|
matthiasm@0
|
54
|
matthiasm@0
|
55 %%
|
SebastianEwert@4
|
56 for k=1:length(filenames)
|
SebastianEwert@4
|
57 [f_audio,samplingFreq]=wavread(filenames{k});
|
SebastianEwert@4
|
58
|
SebastianEwert@4
|
59 % with default settings:
|
SebastianEwert@4
|
60 %f_audio_out = degradationUnit_addNoise(f_audio, samplingFreq);
|
SebastianEwert@4
|
61
|
SebastianEwert@4
|
62 % adjusting some parameters:
|
SebastianEwert@4
|
63 parameter.snrRatio = 10; % in dB
|
SebastianEwert@4
|
64 parameter.noiseColor = 'pink'; % convenient access to several noise types
|
SebastianEwert@4
|
65 f_audio_out = degradationUnit_addNoise(f_audio, samplingFreq, [], parameter);
|
SebastianEwert@4
|
66
|
SebastianEwert@4
|
67 wavwrite(f_audio_out,samplingFreq,16,fullfile(pathOutputDemo,sprintf('Unit_01_addNoise_file%d.wav',k)));
|
SebastianEwert@4
|
68 if createSpectrograms
|
SebastianEwert@4
|
69 [s,f,t] = spectrogram(f_audio_out,hamming(round(samplingFreq*0.093)),round(samplingFreq*0.093/2),[],samplingFreq);
|
SebastianEwert@5
|
70 figure; imagesc(t,f,log10(abs(s)+1),[0 maxValueRangeVis(k)]); axis xy; colormap(hot); ylim([0,8000]); colorbar; print('-dpng', fullfile(pathOutputDemo,sprintf('Unit_01_addNoise_file%d.png',k)))
|
SebastianEwert@4
|
71 end
|
SebastianEwert@4
|
72 end
|
matthiasm@0
|
73
|
matthiasm@0
|
74 %%
|
SebastianEwert@4
|
75 for k=1:length(filenames)
|
SebastianEwert@4
|
76 [f_audio,samplingFreq]=wavread(filenames{k});
|
SebastianEwert@4
|
77
|
SebastianEwert@4
|
78 parameter.snrRatio = 10; % in dB
|
SebastianEwert@4
|
79 parameter.loadInternalSound = 1;
|
matthiasm@7
|
80 parameter.internalSound = 'PubEnvironment1';
|
SebastianEwert@4
|
81 f_audio_out = degradationUnit_addSound(f_audio, samplingFreq, [], parameter);
|
SebastianEwert@4
|
82
|
SebastianEwert@4
|
83 wavwrite(f_audio_out,samplingFreq,16,fullfile(pathOutputDemo,sprintf('Unit_02_addSound_file%d.wav',k)));
|
SebastianEwert@4
|
84 if createSpectrograms
|
SebastianEwert@4
|
85 [s,f,t] = spectrogram(f_audio_out,hamming(round(samplingFreq*0.093)),round(samplingFreq*0.093/2),[],samplingFreq);
|
SebastianEwert@5
|
86 figure; imagesc(t,f,log10(abs(s)+1),[0 maxValueRangeVis(k)]); axis xy; colormap(hot); ylim([0,8000]); colorbar; print('-dpng', fullfile(pathOutputDemo,sprintf('Unit_02_addSound_file%d.png',k)))
|
SebastianEwert@4
|
87 end
|
SebastianEwert@4
|
88 end;
|
matthiasm@0
|
89
|
matthiasm@0
|
90 %%
|
SebastianEwert@4
|
91 for k=1:length(filenames)
|
SebastianEwert@4
|
92 [f_audio,samplingFreq]=wavread(filenames{k});
|
SebastianEwert@4
|
93
|
SebastianEwert@4
|
94 parameter.dsFrequency = 4000;
|
SebastianEwert@4
|
95 f_audio_out = degradationUnit_applyAliasing(f_audio, samplingFreq, [], parameter);
|
SebastianEwert@4
|
96
|
SebastianEwert@4
|
97 wavwrite(f_audio_out,samplingFreq,16,fullfile(pathOutputDemo,sprintf('Unit_03_applyAliasing_file%d.wav',k)));
|
SebastianEwert@4
|
98 if createSpectrograms
|
SebastianEwert@4
|
99 [s,f,t] = spectrogram(f_audio_out,hamming(round(samplingFreq*0.093)),round(samplingFreq*0.093/2),[],samplingFreq);
|
SebastianEwert@5
|
100 figure; imagesc(t,f,log10(abs(s)+1),[0 maxValueRangeVis(k)]); axis xy; colormap(hot); ylim([0,8000]); colorbar; print('-dpng', fullfile(pathOutputDemo,sprintf('Unit_03_applyAliasing_file%d.png',k)))
|
SebastianEwert@4
|
101 end
|
SebastianEwert@4
|
102 end;
|
matthiasm@0
|
103
|
matthiasm@0
|
104 %%
|
SebastianEwert@4
|
105 for k=1:length(filenames)
|
SebastianEwert@4
|
106 [f_audio,samplingFreq]=wavread(filenames{k});
|
SebastianEwert@4
|
107
|
SebastianEwert@4
|
108 parameter.percentOfSamples = 10; % signal is scaled so that n% of samples clip
|
SebastianEwert@4
|
109 f_audio_out = degradationUnit_applyClippingAlternative(f_audio, samplingFreq, [], parameter);
|
SebastianEwert@4
|
110
|
SebastianEwert@4
|
111 wavwrite(f_audio_out,samplingFreq,16,fullfile(pathOutputDemo,sprintf('Unit_04_applyClipping_file%d.wav',k)));
|
SebastianEwert@4
|
112 if createSpectrograms
|
SebastianEwert@4
|
113 [s,f,t] = spectrogram(f_audio_out,hamming(round(samplingFreq*0.093)),round(samplingFreq*0.093/2),[],samplingFreq);
|
SebastianEwert@5
|
114 figure; imagesc(t,f,log10(abs(s)+1),[0 maxValueRangeVis(k)]); axis xy; colormap(hot); ylim([0,8000]); colorbar; print('-dpng', fullfile(pathOutputDemo,sprintf('Unit_04_applyClipping_file%d.png',k)))
|
SebastianEwert@4
|
115 end
|
SebastianEwert@4
|
116 end;
|
SebastianEwert@4
|
117 %%
|
SebastianEwert@4
|
118 for k=1:length(filenames)
|
SebastianEwert@4
|
119 [f_audio,samplingFreq]=wavread(filenames{k});
|
SebastianEwert@4
|
120
|
SebastianEwert@4
|
121 parameter.compressorSlope = 0.9;
|
SebastianEwert@4
|
122 parameter.normalizeOutputAudio = 1;
|
SebastianEwert@4
|
123 f_audio_out = degradationUnit_applyDynamicRangeCompression(f_audio, samplingFreq, [], parameter);
|
SebastianEwert@4
|
124
|
SebastianEwert@4
|
125 wavwrite(f_audio_out,samplingFreq,16,fullfile(pathOutputDemo,sprintf('Unit_05_applyDynamicRangeCompression_file%d.wav',k)));
|
SebastianEwert@4
|
126 if createSpectrograms
|
SebastianEwert@4
|
127 [s,f,t] = spectrogram(f_audio_out,hamming(round(samplingFreq*0.093)),round(samplingFreq*0.093/2),[],samplingFreq);
|
SebastianEwert@5
|
128 figure; imagesc(t,f,log10(abs(s)+1),[0 maxValueRangeVis(k)]); axis xy; colormap(hot); ylim([0,8000]); colorbar; print('-dpng', fullfile(pathOutputDemo,sprintf('Unit_05_applyDynamicRangeCompression_file%d.png',k)))
|
SebastianEwert@4
|
129 end
|
SebastianEwert@4
|
130 end;
|
matthiasm@0
|
131
|
matthiasm@0
|
132 %%
|
SebastianEwert@4
|
133 for k=1:length(filenames)
|
SebastianEwert@4
|
134 [f_audio,samplingFreq]=wavread(filenames{k});
|
SebastianEwert@4
|
135
|
SebastianEwert@4
|
136 parameter.nApplications = 5;
|
SebastianEwert@4
|
137 f_audio_out = degradationUnit_applyHarmonicDistortion(f_audio, samplingFreq, [], parameter);
|
SebastianEwert@4
|
138
|
SebastianEwert@4
|
139 wavwrite(f_audio_out,samplingFreq,16,fullfile(pathOutputDemo,sprintf('Unit_06_applyHarmonicDistortion_file%d.wav',k)));
|
SebastianEwert@4
|
140 if createSpectrograms
|
SebastianEwert@4
|
141 [s,f,t] = spectrogram(f_audio_out,hamming(round(samplingFreq*0.093)),round(samplingFreq*0.093/2),[],samplingFreq);
|
SebastianEwert@5
|
142 figure; imagesc(t,f,log10(abs(s)+1),[0 maxValueRangeVis(k)]); axis xy; colormap(hot); ylim([0,8000]); colorbar; print('-dpng', fullfile(pathOutputDemo,sprintf('Unit_06_applyHarmonicDistortion_file%d.png',k)))
|
SebastianEwert@4
|
143 end
|
SebastianEwert@4
|
144 end;
|
matthiasm@0
|
145
|
matthiasm@0
|
146 %%
|
SebastianEwert@4
|
147 for k=1:length(filenames)
|
SebastianEwert@4
|
148 [f_audio,samplingFreq]=wavread(filenames{k});
|
SebastianEwert@4
|
149
|
SebastianEwert@4
|
150 parameter.LameOptions = '--preset cbr 32';
|
SebastianEwert@4
|
151 f_audio_out = degradationUnit_applyMp3Compression(f_audio, samplingFreq, [], parameter);
|
SebastianEwert@4
|
152
|
SebastianEwert@4
|
153 wavwrite(f_audio_out,samplingFreq,16,fullfile(pathOutputDemo,sprintf('Unit_07_applyMp3Compression_file%d.wav',k)));
|
SebastianEwert@4
|
154 if createSpectrograms
|
SebastianEwert@4
|
155 [s,f,t] = spectrogram(f_audio_out,hamming(round(samplingFreq*0.093)),round(samplingFreq*0.093/2),[],samplingFreq);
|
SebastianEwert@5
|
156 figure; imagesc(t,f,log10(abs(s)+1),[0 maxValueRangeVis(k)]); axis xy; colormap(hot); ylim([0,8000]); colorbar; print('-dpng', fullfile(pathOutputDemo,sprintf('Unit_07_applyMp3Compression_file%d.png',k)))
|
SebastianEwert@4
|
157 end
|
SebastianEwert@4
|
158 end;
|
matthiasm@0
|
159
|
matthiasm@0
|
160 %%
|
SebastianEwert@4
|
161 for k=1:length(filenames)
|
SebastianEwert@4
|
162 [f_audio,samplingFreq]=wavread(filenames{k});
|
SebastianEwert@4
|
163
|
SebastianEwert@4
|
164 parameter.changeInPercent = +5;
|
SebastianEwert@4
|
165 f_audio_out = degradationUnit_applySpeedup(f_audio, samplingFreq, [], parameter);
|
SebastianEwert@4
|
166
|
matthiasm@0
|
167
|
SebastianEwert@4
|
168 wavwrite(f_audio_out,samplingFreq,16,fullfile(pathOutputDemo,sprintf('Unit_08_applySpeedup_file%d.wav',k)));
|
SebastianEwert@4
|
169 if createSpectrograms
|
SebastianEwert@4
|
170 [s,f,t] = spectrogram(f_audio_out,hamming(round(samplingFreq*0.093)),round(samplingFreq*0.093/2),[],samplingFreq);
|
SebastianEwert@5
|
171 figure; imagesc(t,f,log10(abs(s)+1),[0 maxValueRangeVis(k)]); axis xy; colormap(hot); ylim([0,8000]); colorbar; print('-dpng', fullfile(pathOutputDemo,sprintf('Unit_08_applySpeedup_file%d.png',k)))
|
SebastianEwert@4
|
172 end
|
SebastianEwert@4
|
173 end;
|
matthiasm@0
|
174
|
matthiasm@0
|
175 %%
|
SebastianEwert@4
|
176 for k=1:length(filenames)
|
SebastianEwert@4
|
177 [f_audio,samplingFreq]=wavread(filenames{k});
|
SebastianEwert@4
|
178
|
SebastianEwert@4
|
179 parameter.intensityOfChange = 3;
|
SebastianEwert@4
|
180 parameter.frequencyOfChange = 0.5;
|
SebastianEwert@4
|
181 f_audio_out = degradationUnit_applyWowResampling(f_audio, samplingFreq, [], parameter);
|
SebastianEwert@4
|
182
|
SebastianEwert@4
|
183 wavwrite(f_audio_out,samplingFreq,16,fullfile(pathOutputDemo,sprintf('Unit_09_applyWowResampling_file%d.wav',k)));
|
SebastianEwert@4
|
184 if createSpectrograms
|
SebastianEwert@4
|
185 [s,f,t] = spectrogram(f_audio_out,hamming(round(samplingFreq*0.093)),round(samplingFreq*0.093/2),[],samplingFreq);
|
SebastianEwert@5
|
186 figure; imagesc(t,f,log10(abs(s)+1),[0 maxValueRangeVis(k)]); axis xy; colormap(hot); ylim([0,8000]); colorbar; print('-dpng', fullfile(pathOutputDemo,sprintf('Unit_09_applyWowResampling_file%d.png',k)))
|
SebastianEwert@4
|
187 end
|
SebastianEwert@4
|
188 end;
|
matthiasm@0
|
189
|
matthiasm@0
|
190 %%
|
SebastianEwert@4
|
191 for k=1:length(filenames)
|
SebastianEwert@4
|
192 [f_audio,samplingFreq]=wavread(filenames{k});
|
SebastianEwert@4
|
193
|
SebastianEwert@4
|
194 parameter.stopFrequency = 1000;
|
SebastianEwert@4
|
195 f_audio_out = degradationUnit_applyHighpassFilter(f_audio, samplingFreq, [], parameter);
|
SebastianEwert@4
|
196
|
SebastianEwert@4
|
197 wavwrite(f_audio_out,samplingFreq,16,fullfile(pathOutputDemo,sprintf('Unit_10_applyHighpassFilter_file%d.wav',k)));
|
SebastianEwert@4
|
198 if createSpectrograms
|
SebastianEwert@4
|
199 [s,f,t] = spectrogram(f_audio_out,hamming(round(samplingFreq*0.093)),round(samplingFreq*0.093/2),[],samplingFreq);
|
SebastianEwert@5
|
200 figure; imagesc(t,f,log10(abs(s)+1),[0 maxValueRangeVis(k)]); axis xy; colormap(hot); ylim([0,8000]); colorbar; print('-dpng', fullfile(pathOutputDemo,sprintf('Unit_10_applyHighpassFilter_file%d.png',k)))
|
SebastianEwert@4
|
201 end
|
SebastianEwert@4
|
202 end;
|
matthiasm@0
|
203
|
matthiasm@0
|
204
|
matthiasm@0
|
205 %%
|
matthiasm@0
|
206 % Some degradations delay the input signal. If some timepositions are given
|
matthiasm@0
|
207 % via timepositions_beforeDegr, the corresponding positions will be returned
|
SebastianEwert@4
|
208 % in timepositions_afterDegr.
|
matthiasm@0
|
209 timepositions_beforeDegr = [2, 3];
|
matthiasm@0
|
210
|
matthiasm@0
|
211 % Processing the time positions even works without processing the audio data (f_audio_out is empty afterwards)
|
SebastianEwert@4
|
212 parameter.loadInternalIR = 0;
|
SebastianEwert@4
|
213 parameter.impulseResponse = [1 -1 1 -1 1 -1 ] / 6; % some impulse response
|
SebastianEwert@4
|
214 parameter.impulseResponseSampFreq = samplingFreq;
|
matthiasm@0
|
215 parameter.normalizeOutputAudio = 1;
|
matthiasm@0
|
216 [f_audio_out,timepositions_afterDegr] = degradationUnit_applyImpulseResponse([], [], timepositions_beforeDegr, parameter);
|
matthiasm@0
|
217
|
SebastianEwert@4
|
218 for k=1:length(filenames)
|
SebastianEwert@4
|
219 [f_audio,samplingFreq]=wavread(filenames{k});
|
SebastianEwert@4
|
220
|
SebastianEwert@4
|
221 % time positions and audio can also be processed at the same time:
|
SebastianEwert@4
|
222 [f_audio_out,timepositions_afterDegr] = degradationUnit_applyImpulseResponse(f_audio, samplingFreq, timepositions_beforeDegr, parameter);
|
SebastianEwert@4
|
223 fprintf('degradation_applyFirFilter: adjusting time positions\n');
|
SebastianEwert@4
|
224 for m=1:length(timepositions_afterDegr) fprintf('%g -> %g\n',timepositions_beforeDegr(m),timepositions_afterDegr(m)); end
|
SebastianEwert@4
|
225
|
SebastianEwert@4
|
226 wavwrite(f_audio_out,samplingFreq,16,fullfile(pathOutputDemo,sprintf('Unit_11_applyImpulseResponse_file%d.wav',k)));
|
SebastianEwert@4
|
227 if createSpectrograms
|
SebastianEwert@4
|
228 [s,f,t] = spectrogram(f_audio_out,hamming(round(samplingFreq*0.093)),round(samplingFreq*0.093/2),[],samplingFreq);
|
SebastianEwert@5
|
229 figure; imagesc(t,f,log10(abs(s)+1),[0 maxValueRangeVis(k)]); axis xy; colormap(hot); ylim([0,8000]); colorbar; print('-dpng', fullfile(pathOutputDemo,sprintf('Unit_11_applyImpulseResponse_file%d.png',k)))
|
SebastianEwert@4
|
230 end
|
SebastianEwert@4
|
231 end;
|
matthiasm@0
|
232
|