function kundtsRor10(L,v,f,kappa,r) % Programmet beregner relativ amplitude p? lyden langs et r?r, hvor lyden % reflekteres fra begge ender. Vi starter lyden ved ? la litt lyd slippe % gjennom et lite hull i den ene enden av det lukkede r?ret (vedvarende lyd % etter at vi starter det hele). Vi f?r s? skrevet ut hvordan b?lgen er % for enkelte tidspunkt i l?pet av en periode (etter lyden har g?tt s? % lenge at det svarer til s? og s? mange refleksjoner (velges). Vi kan % velge en frekvens som svarer til en av resonansfrekvensene, eller hvilken % som helst annen frekvens. Amplituden vil bli st?rst dersom frekvensen % faktisk svarer til at r?rets lengde er et heltall multiplisert med halve % b?lgelengden, - men det kan du jo pr?ve ut selv! % For refleksjonskoeffisienter n?r 1.0 (svarende til all energi reflekteres % uten tap), m? det mange refleksjoner (50-100?) f?r amplituden blir % stasjon?r. For store tap (refleksjonskoeffisienten f.eks. ca 0.5), % beh?ver du ikke ? f?lge b?lgen over mange refleksjoner f?r amplituden er % blitt stasjon?r. % TIPS: Fors?k f.eks.: kundtsRor10(2.61,344,200,0.9,80) % eller kundtsRor10(1.9,344,200,0.7,60) % Inputparametre: % L: r?rets lengde (m), v: lydhastighet i luft (m/s), f: frekvens (Hz), % kappa: refleksjonskoeffisient (f.eks. 0.95), r: antall refleksjoner (-). % Programmet er opprinnelig skrevet av Arnt Inge Vistnes september 2012. xmax = L*r; % Lydveiens lengde (inkl. refleksjoner) lambda = v/f; % Beregnet b?lgelengde dx = lambda/128.0; % Oppl?sning i beregningene, gitt per bolgelengde N = floor(L/dx); % Beregningsarrayens lengde R = floor(r); % Antall refleksjoner innen den gitte tiden siden start t = xmax/v; % Tiden siden start totKappa = kappa^(floor(r)); % Amplitude etter alle refleksjonene fprintf('Lyden g?r %6.2f r?rlengder p? tiden %5.4f s.\n', r, t); fprintf('Lydintensiteten er da %9.4g x opprinnelig verdi.\n\n',totKappa); k = 2.0*pi/lambda; % B?lgetallet TN = 33; % Antall plot i l?pet av en periode x = linspace(0,L,N);% X-akse i plot (posisjon langs Kunds r?r) A = zeros(N,1); % Array for ? lagre amplitudene Amax = zeros(N,1); % Lagrer max i hvert pkt for ulike tider %************************************************************************* fprintf('F?rste plot:\n'); fprintf('B?lgen ved ulike tidpunkt fordelt over en periode\n'); for tt = 1:TN % Ytre l?kke: TN tider innen en periode A = zeros(N,1); % Array for ? lagre amplitudene faseT = 2.0*pi*(tt-1)/(TN-1); % Faseledd som skyldes tid for i=1:N % Gjennoml?per alle posisjoner i r?ret for j = 0:R % Bidrag fra alle refleksjoner xsign = (-1)^j; Lkorr = 2.0*L*floor((j+1)/2); if (floor((j+1)/2) == floor(j/2)) xtot = j*L + i*dx; % Framover i r?ret else xtot = j*L + (N-i)*dx; % Bakover i r?ret end; if (xtotAmax(m)) Amax(m) = A(m); end; end; end; % Beregner max amplitude overhodet, max amplitude i slutten av r?ret, % samt Amplitude Standing Wave Ratio (ASWR): fprintf(' Max amplitude: %6.2f \n',max(Amax)); %fprintf(' Max amplitude ved mikrofonens plass: %6.2f \n',Amax(N)); ASWR = max(Amax)/min(Amax); fprintf(' Amplitude standing wave ratio (ASWR): %5.3f \n\n',ASWR); % %************************************************************************* fprintf('Andre plot:\n'); fprintf('Animering f?lger b?lgen i tid ?n periode\n\n'); figure; p = plot(x,A,'-','EraseMode','xor'); % Klargjoring til animering yaxis = 1.2*max(Amax); axis([0 L -yaxis yaxis]) xlabel('Posisjon langs r?ret (m)'); ylabel('Rel. amplitude'); title('Animering av b?lgen, en periode'); hold on for tt = 1:TN % Ytre l?kke: TN tider innen en periode A = zeros(N,1); % Array for ? lagre amplitudene faseT = 2.0*pi*(tt-1)/(TN-1); % Faseledd som skyldes tid for i=1:N % Gjennoml?per alle posisjoner i r?ret for j = 0:R % Bidrag fra alle refleksjoner xsign = (-1)^j; Lkorr = 2.0*L*floor((j+1)/2); if (floor((j+1)/2) == floor(j/2)) xtot = j*L + i*dx; % Framover i r?ret else xtot = j*L + (N-i)*dx; % Bakover i r?ret end; if (xtot