From c35d3d302ad2c36a0518f3de247acaa80b71ee55 Mon Sep 17 00:00:00 2001 From: Markus Mueller-Trapet <markus.mueller-trapet@rwth-aachen.de> Date: Fri, 23 Jun 2017 15:12:23 -0400 Subject: [PATCH] added spectrum adaptation terms from ISO 717-1 --- .../ita_soundInsulationIndexAirborne.m | 63 ++++++++++++------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/applications/RoomAcoustics/BuildingAcoustics/ita_soundInsulationIndexAirborne.m b/applications/RoomAcoustics/BuildingAcoustics/ita_soundInsulationIndexAirborne.m index 93273055..427c8a4a 100644 --- a/applications/RoomAcoustics/BuildingAcoustics/ita_soundInsulationIndexAirborne.m +++ b/applications/RoomAcoustics/BuildingAcoustics/ita_soundInsulationIndexAirborne.m @@ -13,17 +13,21 @@ sArgs = struct('pos1_data','anything','bandsperoctave',3,'freqVector',[],'create %% reference curves if strcmpi(sArgs.type,'iso') % Reference curve and frequencies according to ISO 717-1 - outputStr = 'R_W'; + outputStr = 'R_w (C; C_{tr})'; roundingFactor = 0.1; deficiencyLimit = Inf; if sArgs.bandsperoctave == 1 - refCurve = [36 45 52 55 56]-52; freq = [125 250 500 1000 2000]; refSurf = 10; + refCurve = [36 45 52 55 56].'-52; + Ccurve = [-21 -14 -8 -5 -4].'; + Ctrcurve = [-14 -10 -7 -4 -6].'; elseif sArgs.bandsperoctave == 3 - freq = [100,125,160,200,250,315,400,500,630,800,1000,1250,1600,2000,2500,3150]; - refCurve = [33 36 39 42 45 48 51 52 53 54 55 56 56 56 56 56]-52; + freq = [100,125,160,200,250,315,400,500,630,800,1000,1250,1600,2000,2500,3150].'; refSurf = 32; + refCurve = [33 36 39 42 45 48 51 52 53 54 55 56 56 56 56 56].'-52; + Ccurve = [-29 -26 -23 -21 -19 -17 -15 -13 -12 -11 -10 -9 -9 -9 -9 -9].'; + Ctrcurve = [-20 -20 -18 -16 -15 -14 -13 -12 -11 -9 -8 -9 -10 -11 -13 -15].'; else error([upper(mfilename) ':wrong input for bandsperoctave']); end @@ -32,14 +36,12 @@ elseif strcmpi(sArgs.type,'astm') % Reference curve and frequencies according to roundingFactor = 1; deficiencyLimit = 8; sArgs.bandsperoctave = 3; - freq = [125,160,200,250,315,400,500,630,800,1000,1250,1600,2000,2500,3150,4000]; - refCurve = [-16 -13 -10 -7 -4 -1 0 1 2 3 4 4 4 4 4 4]; + freq = [125,160,200,250,315,400,500,630,800,1000,1250,1600,2000,2500,3150,4000].'; + refCurve = [-16 -13 -10 -7 -4 -1 0 1 2 3 4 4 4 4 4 4].'; refSurf = 32; else error([upper(mfilename) ':wrong input for type']); end -freq = freq(:); -refCurve = refCurve(:); dbStep = 1; %% prepare data @@ -52,45 +54,62 @@ if ~isa(data,'itaSuper') end end freqVector = data.freqVector; -soundInsulation = 20.*log10(interp1(freqVector,data.freqData(:,1),freq,'spline','extrap')); +soundReduction = 20.*log10(interp1(freqVector,data.freqData(:,1),freq,'spline','extrap')); if min(freqVector) > freq(1) || max(freqVector) < freq(end) warning([upper(mfilename) ': Sound insulation data will be extrapolated']); end %% sound insulation index -soundInsulation = round(soundInsulation/roundingFactor)*roundingFactor; -soundInsulationIndex = min(floor(soundInsulation-refCurve)); -delta = max(0,refCurve + soundInsulationIndex - soundInsulation); +soundReduction = round(soundReduction/roundingFactor)*roundingFactor; +soundReductionIndex = min(floor(soundReduction-refCurve)); +delta = max(0,refCurve + soundReductionIndex - soundReduction); counter = 0; % stopping criterion % shift reference curve until limits are reached while sum(delta) < refSurf && all(delta <= deficiencyLimit) && counter < 1e3 - soundInsulationIndex = soundInsulationIndex + dbStep; - delta = max(0,refCurve + soundInsulationIndex - soundInsulation); + soundReductionIndex = soundReductionIndex + dbStep; + delta = max(0,refCurve + soundReductionIndex - soundReduction); counter = counter+1; end -soundInsulationIndex = soundInsulationIndex - dbStep; -delta = max(0,refCurve + soundInsulationIndex - soundInsulation); +soundReductionIndex = soundReductionIndex - dbStep; +delta = max(0,refCurve + soundReductionIndex - soundReduction); deficiencies = itaResult(delta,freq,'freq')*itaValue(1,'dB'); deficiencies.allowDBPlot = false; +%% adaptation terms for ISO +if strcmpi(sArgs.type,'iso') + C = round(-10.*log10(sum(10.^((Ccurve - soundReduction)./10),1)) - soundReductionIndex); + Ctr = round(-10.*log10(sum(10.^((Ctrcurve - soundReduction)./10),1)) - soundReductionIndex); +else + C = 0; + Ctr = 0; +end + %% output if sArgs.createPlot fgh = ita_plot_freq(data); - plotResult = itaResult([10.^((refCurve+soundInsulationIndex)./20), [ones(sum(freq<=500),1)*10.^(soundInsulationIndex./20); nan(sum(freq>500),1)]],freq,'freq'); + plotResult = itaResult([10.^((refCurve+soundReductionIndex)./20), [ones(sum(freq<=500),1)*10.^(soundReductionIndex./20); nan(sum(freq>500),1)]],freq,'freq'); ita_plot_freq(plotResult,'figure_handle',fgh,'axes_handle',gca,'hold'); bar(gca,deficiencies.freqVector,deficiencies.freq,'hist'); [maxDef,maxIdx] = max(deficiencies.freq); - legend({'Sound transmission loss','Shifted reference curve',[outputStr ' = ' num2str(soundInsulationIndex) 'dB'],['Deficiencies (sum: ' num2str(sum(deficiencies.freq)) 'dB, max: ' num2str(maxDef) 'dB at ' num2str(deficiencies.freqVector(maxIdx)) 'Hz)']}); - ylim([0 max(max(soundInsulation),max(refCurve)+soundInsulationIndex)+15]); + if strcmpi(sArgs.type,'iso') + singleNumberString = [outputStr ' = ' num2str(soundReductionIndex) ' (' num2str(C) '; ' num2str(Ctr) ') dB']; + else + singleNumberString = [outputStr ' = ' num2str(soundReductionIndex) 'dB']; + end + legend({'Sound transmission loss','Shifted reference curve',singleNumberString,['Deficiencies (sum: ' num2str(sum(deficiencies.freq)) 'dB, max: ' num2str(maxDef) 'dB at ' num2str(deficiencies.freqVector(maxIdx)) 'Hz)']}); + ylim([0 max(max(soundReduction),max(refCurve)+soundReductionIndex)+15]); end -varargout{1} = soundInsulationIndex; +varargout{1} = soundReductionIndex; % reference curve specified at the freqVector specified by the input itaResult: if nargout >= 2 - varargout{2} = interp1(freq, 10.^((refCurve+soundInsulationIndex)./20), freqVector, 'linear'); - if nargout == 3 + varargout{2} = interp1(freq, 10.^((refCurve+soundReductionIndex)./20), freqVector, 'linear'); + if nargout >= 3 varargout{3} = deficiencies; + if nargout >= 4 + varargout{4} = [C,Ctr]; + end end end -- GitLab