Avatar billede oc_gork Nybegynder
13. oktober 2003 - 12:33 Der er 7 kommentarer

Udregning med logaritmer

Hej eksperter.
Jeg skal regne en samlet dB afgivelse ud for flere "støjsendere", jeg har en formel:

L = 10 log (10^(db1/10) + 10^(db2/10) + 10^(db3/10) )
forklaring:
L = det samlede lydniveau (i db)
log = 10tals logaritmen
^=potens ( "opløftet i" )
db1, 2, 3, .....: de forskellige lyd niveauer (i db)

Jeg har så gjort følgende:

var
  db1, db2, db3: double;
begin


db1:= strtofloat(db1_edit.text);
db2:= strtofloat(db1_edit.text);
db3:= strtofloat(db1_edit.text);


edit15.text:=floattostr(10*(log10(10^(db1/10)+10^(db2/10)+10^(db3/10))));

Når jeg prøver at compile skriver den: [Error] Unit10.pas(51): Pointer type required

Please hjælp!
Avatar billede erikjacobsen Ekspert
13. oktober 2003 - 12:47 #1
Potensopløftning hedder ikke ^
Avatar billede oc_gork Nybegynder
13. oktober 2003 - 12:54 #2
okay, hvad hedder det så?
Avatar billede snowball Novice
13. oktober 2003 - 13:09 #3
Prøv med nedenstående:

  edit1.text := FloatToStr(10*(log10(Power(10,(db1/10))+Power(10,(db2/10))+Power(10,(db3/10)))));

Snowball
Avatar billede oc_gork Nybegynder
13. oktober 2003 - 13:30 #4
Det fungerer ikke helt, jeg mener power er opløftet i 3? Den får ihvertfald 4.7xxx når jeg sætter alle db værdier til 0!
Avatar billede snowball Novice
13. oktober 2003 - 13:37 #5
Power funktionen "opløfter" det antal gange du angiver i den første parameter - altså 10 i dette tilfælde.

Snowball
Avatar billede borrisholt Novice
15. oktober 2003 - 08:45 #6
Lad os lige starte med et par faktuelle ting :

Du glemmmer din kondition i din formel : db1,db2,db3 > 0

I kraft af at du bruger dem som base i din logaritme må det nødvendigvis være tilfældet !

Der næst faldt det mig for brystet at du siger :

db1:= strtofloat(db1_edit.text);
db2:= strtofloat(db1_edit.text);
db3:= strtofloat(db1_edit.text);


Det må nødvendigvis være :

db1:= strtofloat(db1_edit.text);
db2:= strtofloat(db2_edit.text);
db3:= strtofloat(db3_edit.text);


Jeg har lavet et lille eksempel :

uses
  Math;

(*
  L = 10 log (10^(db1/10) + 10^(db2/10) + 10^(db3/10) ) | db1,db2,db3 > 0
  forklaring:
    L = det samlede lydniveau (i db)
    log = 10tals logaritmen
    ^=potens ( "opløftet i" )
    db1, 2, 3, .....: de forskellige lyd niveauer (i db)

  For nemheds skyld skrives formlen lidt om :

  A = 10^(db1/10)
  B = 10^(db2/10)
  C = 10^(db3/10)

  Således bliver

  L = 10 log (A + B + C) | db1, db2, db3 > 0
*)

function CalculateDiffer(const db1, db2, db3: Double): Double;
var
  A, B, C: Double;
begin
  A := Power(10, (db1/10));
  B := Power(10, (db2/10));
  C := Power(10, (db3/10));
  Result := 10 * Log10(A + B + C);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  db1, db2, db3: Double;
begin
  db1 := StrToFloat(edit1.text);
  db2 := StrToFloat(edit2.text);
  db3 := StrToFloat(edit3.text);
  Edit4.Text := FloatToStr(CalculateDiffer(db1, db2, db3));
end;


Mht din Power ting så skriver hjælpen :

Delphi syntax:

function Power(const Base, Exponent: Extended): Extended;

C++ syntax:

extern PACKAGE Extended __fastcall Power(const Extended Base, const Extended Exponent);

Description

Power raises Base to any power. For fractional exponents or exponents greater than MaxInt, Base must be greater than 0.

Der med har vi også rydet den af vejen.

MHT din beregning omkring 0 på alle pladser så bliver :

a, b og c 1 fordi 10^(0/10) = 1

Dermed står der
  L = 10 log (1 + 1 + 1)

log(3) ~ 0.47712125471966243729502790325512

Hvis du ganger det med 10 får du godt 4.7

Hermed ligger jeg mig 100% op af snowball.

Jens B
Avatar billede oc_gork Nybegynder
18. oktober 2003 - 01:17 #7
Tak borrisholt for den gode forklaring! Jeg vil gerne lave det så den kan tage hensyn til at nogle af værdierne kan være 0, eller et editboxen simpelthen er tom, er det til at lave, så den helt lader være med at inkludere de felter i udregningen?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester