' Helmholz resonator calculation utility - ref.: 4300-helmholtz.html ' by Prof.Dr.Godfried-Willem Raes ' first version: 18.11.1996 ' last revision: 21.01.2003 ' recoded for Power Basic Console Compiler V3.0 ' ------------------------------------------------------------------ $DIM ALL %True = -1 %False = 0 GLOBAL Pi# GLOBAL QPi# :' = Pi^2 GLOBAL Pi2# :' = 2 * Pi GLOBAL RPi# :' = SQR(Pi) GLOBAL velsound! GLOBAL hor%, ver% DECLARE FUNCTION CalcHelmFreq! (radius!, Thick!, VolCC!) DECLARE FUNCTION CalcHelmFreqAny! (surface!, Thick!, VolCC!) DECLARE FUNCTION CalcHelmVolume! (radius!, Thick!, freq!) DECLARE FUNCTION CalcHelmVolumeAny! (surface!, Thick!, freq!) DECLARE FUNCTION CalcHelmOrifice! (radius!, VolCC!, freq!) DECLARE FUNCTION CalcHelmOrificeAny!(surface!, VolCC!, freq!) DECLARE FUNCTION CalcDiam! (VolCC!, freq!, Thick!) DECLARE FUNCTION CalcSurf! (VolCC!, freq!, Thick!) DECLARE FUNCTION CheckHelmPos%(radius!, VolCC!,freq!) DECLARE FUNCTION CheckHelmPosAny% (surface!, VolCC!, freq!) DECLARE FUNCTION GetUserSurface! (surface!) DECLARE SUB DisplayParams (freq!, VolCC!, surface!, Thick!) FUNCTION PBMAIN ()AS LONG LOCAL STfrq$, STVolCC$,STDiam$,STThick$, k$ LOCAL frq!, VolCC!, Diam!, radius!, Thick!, surface! Pi# = ATN(1) * 4! Pi2# = ATN(1) * 8! RPi# = (ATN(1))^0.5# QPi# = ATN(1) * ATN(1) velsound!= 34000 :' cm/s CONSOLE SCREEN 60,80 hor%=SCREENX :' returns values set for dos-box ver%=SCREENY DO CLS COLOR 12 LOCATE 1,10: PRINT "Helmholtz Resonator Calculation Utility" LOCATE 2,10: PRINT "=======================================" COLOR 10 LOCATE 4,10: PRINT "1.- Calculate resonant frequency for round orifice"; LOCATE 5,10: PRINT "2.- Calculate volume for round orifice" ; LOCATE 6,10: PRINT "3.- Calculate round orifice thickness" ; LOCATE 7,10: PRINT "4.- Calculate round orifice diameter" ; LOCATE 8,10: PRINT "5.- Calculate resonant frequency for any orifice"; LOCATE 9,10: PRINT "6.- Calculate volume for any orifice" ; LOCATE 10,10: PRINT "7.- Calculate orifice thickness" ; LOCATE 11,10: PRINT "8.- Calculate orifice surface" ; LOCATE 12,10: PRINT "*.- QUIT" ; COLOR 14 LOCATE 14,20: LINE INPUT "Choice ?"; k$ COLOR 11 SELECT CASE k$ CASE "*" EXIT FUNCTION CASE "1" LOCATE 15,10: LINE INPUT "Volume (cc) ?"; STVolCC$ VolCC! = VAL(STVolCC$) LOCATE 16,10: LINE INPUT "Orifice diameter (cm)"; STDiam$ Diam! = VAL(STDiam$) radius! = Diam! /2! surface! = Pi# * (radius!^2!) LOCATE 17,10: LINE INPUT "Wall thickness (cm)"; STThick$ Thick! = VAL (STThick$) frq! = CalcHelmFreq! (radius!, Thick!, VolCC!) 'IF frq! <> CalcHelmFreqAny! (surface!, Thick!, VolCC!) THEN ' LOCATE 22, 25: PRINT "Inconsistency in software!"; CalcHelmFreqAny! (surface!, Thick!, VolCC!); "Hz" 'END IF LOCATE 18,10: PRINT "Frequency =";frq! ;"Hz" IF CheckHelmPos% (radius!, VolCC!, frq!) THEN ' now check other values for validity LOCATE 19,10 PRINT "Volume ="; CalcHelmVolume! (radius!, Thick!, frq!);"cm^3" LOCATE 20,10 PRINT "Wall thickness ="; CalcHelmOrifice! (radius!, VolCC!, frq!);"cm" LOCATE 21,10 PRINT "Orifice diameter="; CalcDiam!(VolCC!, frq!, Thick!);"cm" ELSE LOCATE 19,10 PRINT "Impossible values !"; END IF DisplayParams frq!, VolCC!, surface!, Thick! CASE "2" ' calculate volume needed LOCATE 15,10: LINE INPUT "Frequency (Hz) ?"; STfrq$ frq! = VAL(STfrq$) LOCATE 16,10: LINE INPUT "Orifice diameter (cm)"; STDiam$ Diam! = VAL(STDiam$) radius! = Diam! /2! surface! = Pi# * (radius! ^2!) LOCATE 17,10: LINE INPUT "Wall thickness (cm)"; STThick$ Thick! = VAL (STThick$) IF Thick! <0 THEN Thick!=0 VolCC! = CalcHelmVolume! (radius!, Thick!, frq!) LOCATE 18,10: PRINT "Volume ="; VolCC!; "cm^3" IF CheckHelmPos% (radius!, VolCC!, frq!) THEN ' now check other values for validity LOCATE 19,10: PRINT "Frequency ="; CalcHelmFreq! (radius!, Thick!, VolCC!);"Hz" LOCATE 20,10: PRINT "Wall thickness ="; CalcHelmOrifice! (radius!, VolCC!, frq!);"cm" LOCATE 21,10: PRINT "Orifice diameter="; CalcDiam!(VolCC!, frq!, Thick!); "cm" ELSE LOCATE 19,10 PRINT "Impossible values !"; END IF DisplayParams frq!, VolCC!, surface!, Thick! CASE "3" ' calculate thickness of orifice LOCATE 15,10: LINE INPUT "Frequency (Hz) ?"; STfrq$ frq! = VAL(STfrq$) LOCATE 16,10: LINE INPUT "Volume (cc) ?"; STVolCC$ VolCC! = VAL(STVolCC$) LOCATE 17,10: LINE INPUT "Orifice diameter (cm)"; STDiam$ Diam! = VAL(STDiam$) radius! = Diam! /2! surface! = Pi# * (radius!^2) Thick! = CalcHelmOrifice! (radius!, VolCC!, frq!) LOCATE 18,10: PRINT "Orifice thickness="; Thick!; "cm"; IF Thick! <0 THEN PRINT "Impossible values!!!"; IF CheckHelmPos% (radius!, VolCC!, frq!) THEN ' check other values for validity: LOCATE 19,10: PRINT "Frequency ="; CalcHelmFreq! (radius!, Thick!, VolCC!);"Hz" LOCATE 20,10: PRINT "Volume ="; CalcHelmVolume! (radius!, Thick!, frq!);"cm^3" LOCATE 21,10: PRINT "Orifice diameter="; CalcDiam!(VolCC!, frq!, Thick!);"cm" ELSE LOCATE 19,10 PRINT "Impossible values !"; END IF DisplayParams frq!, VolCC!, surface!, Thick! CASE "4" ' calculate orifice diameter (circular) LOCATE 15,10: LINE INPUT "Frequency (Hz) ?"; STfrq$ frq! = VAL(STfrq$) LOCATE 16,10: LINE INPUT "Volume (cc) ?"; STVolCC$ VolCC! = VAL(STVolCC$) LOCATE 17,10: LINE INPUT "Wall thickness (cm)"; STThick$ Thick! = VAL (STThick$) IF Thick! < 0 THEN Thick! = 0 Diam! = CalcDiam! (VolCC!, frq!, Thick!) LOCATE 18,10: PRINT "Orifice diameter="; Diam!;"cm"; radius! = Diam! /2! surface! = Pi# * (radius!^2!) IF radius! < 0 THEN PRINT "Impossible value for diameter"; IF CheckHelmPos% (radius!, VolCC!, frq!) THEN ' check other values for validity LOCATE 19,10: PRINT "Frequency ="; CalcHelmFreq! (radius!, Thick!, VolCC!);"Hz" LOCATE 20,10: PRINT "Volume ="; CalcHelmVolume! (radius!, Thick!, frq!);"cm^3" LOCATE 21,10 PRINT "Wall thickness ="; CalcHelmOrifice! (radius!, VolCC!, frq!);"cm" ELSE LOCATE 19,10 PRINT "Impossible values !"; END IF DisplayParams frq!, VolCC!, surface!, Thick! CASE "5" 'calculate resonance frequency for a resonator with any shape orifice LOCATE 15,10: LINE INPUT "Volume (cc) ?"; STVolCC$ VolCC! = VAL(STVolCC$) LOCATE 16,10: LINE INPUT "Orifice surface (cm^2)"; STDiam$ surface! = VAL(STDiam$) LOCATE 17,10: LINE INPUT "Wall thickness (cm)"; STThick$ Thick! = VAL (STThick$) IF Thick! < 0 THEN Thick!=0 frq! = CalcHelmFreqAny! (surface!, Thick!, VolCC!) LOCATE 18,10: PRINT "Frequency =";frq! ;"Hz" IF CheckHelmPosAny% (surface!, VolCC!, frq!) THEN ' now check other values for validity LOCATE 19,10 PRINT "Volume ="; CalcHelmVolumeAny! (surface!, Thick!, frq!);"cm^3" LOCATE 20,10 PRINT "Wall thickness ="; CalcHelmOrificeAny! (surface!, VolCC!, frq!);"cm" LOCATE 21,10 PRINT "Orifice surface="; CalcSurf!(VolCC!, frq!, Thick!);"cm^2" ELSE LOCATE 19,10 PRINT "Impossible values !"; END IF DisplayParams frq!, Volcc!, surface!, Thick! CASE "6" ' calculate volume needed LOCATE 15,10: LINE INPUT "Frequency (Hz) ?"; STfrq$ frq! = VAL(STfrq$) LOCATE 16,10: LINE INPUT "Orifice surface (cm^2)"; STDiam$ surface! = VAL(STDiam$) LOCATE 17,10: LINE INPUT "Wall thickness (cm)"; STThick$ Thick! = VAL (STThick$) IF Thick! <0 THEN Thick! =0 VolCC! = CalcHelmVolumeAny! (surface!, Thick!, frq!) LOCATE 18,10: PRINT "Volume ="; VolCC!; "cm^3" IF CheckHelmPosAny% (surface!, VolCC!, frq!) THEN ' now check other values for validity LOCATE 19,10: PRINT "Frequency ="; CalcHelmFreqAny! (surface!, Thick!, VolCC!);"Hz" LOCATE 20,10: PRINT "Wall thickness ="; CalcHelmOrificeAny! (surface!, VolCC!, frq!);"cm" LOCATE 21,10: PRINT "Orifice surface="; CalcSurf!(VolCC!, frq!, Thick!);" cm^2" ELSE LOCATE 19,10 PRINT "Impossible values !"; END IF DisplayParams frq!, VolCC!, surface!, Thick! CASE "7" ' calculate thickness of orifice LOCATE 15,10: LINE INPUT "Frequency (Hz) ?"; STfrq$ frq! = VAL(STfrq$) LOCATE 16,10: LINE INPUT "Volume (cc) ?"; STVolCC$ VolCC! = VAL(STVolCC$) LOCATE 17,10: LINE INPUT "Orifice surface (cm^2)"; STDiam$ surface! = VAL(STDiam$) Thick! = CalcHelmOrificeAny! (surface!, VolCC!, frq!) LOCATE 18,10: PRINT "Orifice thickness="; Thick!; "cm"; IF Thick! < 0 THEN PRINT " Impossible value!" IF CheckHelmPosAny% (surface!, VolCC!, frq!) THEN ' check other values for validity: LOCATE 19,10: PRINT "Frequency ="; CalcHelmFreqAny! (surface!, Thick!, VolCC!);"Hz" LOCATE 20,10: PRINT "Volume ="; CalcHelmVolumeAny! (surface!, Thick!, frq!);"cm^3" LOCATE 21,10: PRINT "Orifice surface="; CalcSurf!(VolCC!, frq!, Thick!);"cm^2" ELSE LOCATE 19,10 PRINT "Impossible values !"; END IF DisplayParams frq!, VolCC!, surface!, Thick! CASE "8" ' calculate orifice surface LOCATE 15,10: LINE INPUT "Frequency (Hz) ?"; STfrq$ frq! = VAL(STfrq$) LOCATE 16,10: LINE INPUT "Volume (cc) ?"; STVolCC$ VolCC! = VAL(STVolCC$) LOCATE 17,10: LINE INPUT "Wall thickness (cm)"; STThick$ Thick! = VAL (STThick$) IF Thick! < 0 THEN Thick! = 0 surface! = CalcSurf! (VolCC!, frq!, Thick!) LOCATE 18,10: PRINT "Orifice surface="; surface!;"cm^2" IF CheckHelmPosAny% (surface!, VolCC!, frq!) THEN ' check other values for validity LOCATE 19,10: PRINT "Frequency ="; CalcHelmFreqAny! (surface!, Thick!, VolCC!);"Hz" LOCATE 20,10: PRINT "Volume ="; CalcHelmVolumeAny! (surface!, Thick!, frq!);"cm^3" LOCATE 21,10 PRINT "Wall thickness ="; CalcHelmOrificeAny! (surface!, VolCC!, frq!);"cm" ELSE LOCATE 19,10 PRINT "Impossible values !"; END IF DisplayParams frq!, VolCC!, surface!, Thick! END SELECT DO: LOOP UNTIL INKEY$ <> "" LOOP END FUNCTION ' ****************************************************************************************** FUNCTION CalcHelmFreq! (radius!, Thick!, VolCC!) ' for circular orifices LOCAL faktor1#, subroot# faktor1# = (radius! * velsound!)/ 2! subroot# = 1! / (VolCC! * Pi# *(Thick! + (RPi# * radius!))) FUNCTION = faktor1# * (subroot# ^ 0.5! ) END FUNCTION FUNCTION CalcHelmFreqAny! (surface!, Thick!, VolCC!) ' for arbitrary orifice shapes LOCAL faktor1#, subroot# faktor1# = velsound! / Pi2# subroot# = surface! / (VolCC! *(Thick! + (surface!^0.5!))) FUNCTION = faktor1# * (subroot# ^ 0.5! ) END FUNCTION FUNCTION CalcHelmVolume! (radius!, Thick!, freq!) ' for circular orifices LOCAL teller# , noemer# teller# = ((radius! * velsound!)^2!) 'noemer! = (Thick! + (RPi# * radius!)) * ((freq! * Pi2#)^2!):'(freq!^2) * Pi# * 4! noemer# = (Thick! + (RPi# * radius!)) * Pi# * ((2!*freq!)^2!) FUNCTION = teller# / noemer# END FUNCTION FUNCTION CalcHelmVolumeAny! (surface!, Thick!, freq!) ' for orifices of any shape LOCAL teller# , noemer# teller# = surface! * (velsound!^2!) noemer# = (Thick! + (surface!^0.5!)) * ((freq! * Pi2#)^2!):' (freq!^2!) * (Pi#^2!) * 4! FUNCTION = teller# / noemer# END FUNCTION FUNCTION CalcHelmOrifice!(radius!, VolCC!, freq!) ' returns thickness for round orifices ' if the function returns negative values, the resonator is impossible. LOCAL teller#, noemer# teller# = ((radius! *velsound!) ^ 2!) noemer# = VolCC! * 4! * Pi# * (freq!^2!) FUNCTION = (teller# / noemer#) - (RPi# * radius!) END FUNCTION FUNCTION CalcHelmOrificeAny!(surface!, VolCC!, freq!) ' returns thickness for orifices of any size ' if the function returns negative values, the resonator is impossible. LOCAL teller#, noemer# teller# = surface! * (velsound! ^ 2!) noemer# = VolCC! * ((Pi2# * freq!)^2!):'4 * (Pi#^2) * (freq!^2) FUNCTION = (teller# / noemer#) - (surface! ^ 0.5!) END FUNCTION FUNCTION CalcDiam! (VolCC!, freq!, Thick!) ' tweedegraadsvergelijking! : a * (r^2) - 1.7* r - Thick! LOCAL a!, b!, c!, Discriminant!, r1!, r2! a! = (velsound!^2!) / (4! * Pi# * VolCC! * (freq! ^ 2!)) b! = - RPi# c! = - Thick! Discriminant! = (b! ^ 2!) - (4! * a! * c!) IF Discriminant! > 0 THEN r1! = (-b! - (Discriminant! ^ 0.5!)) / (2! * a!) r2! = (-b! + (Discriminant! ^ 0.5!)) / (2! * a!) ELSEIF Discriminant! = 0 THEN r1! = - b! / (2! * a!) r2! = r1! ELSE ' no real solution! FUNCTION = 0! EXIT FUNCTION END IF IF r1! > r2! THEN SWAP r1!, r2! 'LOCATE 23,10: PRINT "r1!=";r1! 'LOCATE 24,10: PRINT "r2!=";r2! FUNCTION = 2! * r2! END FUNCTION FUNCTION CalcSurf! (VolCC!, freq!, Thick!) ' tweedegraadsvergelijking in SQR(surface!) LOCAL a!, b!, c!, Discriminant!, r1!, r2! a! = (velsound! ^ 2!) / (4! * (Pi#^2) * VolCC! * (freq!^2!)) b! = - 1! c! = - Thick! Discriminant! = (b! ^ 2!) - (4! * a! * c!) IF Discriminant! > 0 THEN r1! = (-b! - (Discriminant! ^ 0.5!)) / (2! * a!) r2! = (-b! + (Discriminant! ^ 0.5!)) / (2! * a!) ELSEIF Discriminant! = 0 THEN r1! = - b! / (2! * a!) r2! = r1! ELSE ' no real solution! FUNCTION = 0 EXIT FUNCTION END IF 'r1! = r1! ^ 2! 'r2! = r2! ^ 2! IF r1! > r2! THEN SWAP r1!, r2! 'LOCATE 23,10: PRINT "r1!=";r1!; 'LOCATE 24,10: PRINT "r2!=";r2!; FUNCTION = r2! * r2! END FUNCTION FUNCTION CheckHelmPos%(radius!, VolCC!,freq!) IF (RPi# * radius!) <= (((radius! * velsound!)^2!)/ (4! * Pi# * VolCC! * (freq!^2!))) THEN FUNCTION = %True ELSE FUNCTION = %False END IF END FUNCTION FUNCTION CheckHelmPosAny% (surface!, VolCC!, freq!) IF (surface!^0.5!) <= ((surface! * (velsound!^2!)) / (4! * (Pi#^2!) * VolCC! * (freq!^2!))) THEN FUNCTION = %True ELSE FUNCTION = %False END IF END FUNCTION SUB DisplayParams (freq!, VolCC!, surface!, Thick!) LOCAL Frequency$, Volume$, Opp$, Dikte$, Qfak$ , dia$, squ$ LOCAL diameter!, square! ,teller!,noemer! LOCAL col1%, col2%, col3%, col4%, col5%, col6% , col7% col1% = 5 : col2% = 17 : col3% = 28 : col4% = 37: col5%=46: col6%=55: col7%=67 LOCATE ver%-2, 1: PRINT SPACE$(80); LOCATE ver%-1, 1: PRINT SPACE$(80); COLOR 13 LOCATE ver%-2, col1%: PRINT "Frequency:"; LOCATE ver%-2, col2%: PRINT "Volume:"; LOCATE ver%-2, col3%: PRINT "Orifice:"; LOCATE ver%-2, col4%: PRINT "diameter"; LOCATE ver%-2, col5%: PRINT "square: "; LOCATE ver%-2, col6%: PRINT "Thickness"; LOCATE ver%-2, col7%: PRINT "Q-Factor:"; COLOR 14 Frequency$ = FORMAT$ (freq!, "#####") Frequency$ = Frequency$ + "Hz" LOCATE ver%-1, col1%: PRINT Frequency$; Volume$ = FORMAT$ (VolCC!, "#####.#") Volume$ = Volume$ + "cc" LOCATE ver%-1, col2%: PRINT Volume$ ; Opp$ = FORMAT$ (surface!, "##.#") Opp$ = Opp$ + "cm^2" LOCATE ver%-1, col3%: PRINT Opp$; diameter! = 2! * ((surface! / Pi#) ^ 0.5!) dia$ = FORMAT$ (diameter!, "##.#") dia$= dia$ + "cm" LOCATE ver%-1,col4%: PRINT dia$; square! = surface! ^ 0.5! squ$ = FORMAT$ (square!, "##.#") squ$ = squ$ + "cm" LOCATE ver%-1,col5%: PRINT squ$; Dikte$ = FORMAT$ (Thick!*10!, "####") Dikte$ = Dikte$ + "mm" LOCATE ver%-1, col6%: PRINT Dikte$; teller! = velsound! * (Thick! + (surface!^0.5!)) noemer! = surface! * (freq!^2) Qfak$ = FORMAT$ (teller!/noemer!, "###.#") LOCATE ver%-1, col7%: PRINT Qfak$; END SUB