Einzelnen Beitrag anzeigen

Rer

Registriert seit: 7. Apr 2007
13 Beiträge
 
#4

Re: Algorithmus von C99 in Delphi übersetzen

  Alt 19. Nov 2009, 16:04
so weit bin ich bis jetzt^^
Delphi-Quellcode:
type
  ADX_HEADER = packed record
    Begin_0x80 : Byte;
    Begin_0x00 : Byte;
    crOffset : Word;
    encType : Byte;
    blockSize : Byte;
    smplbitdpth: Byte;
    NumChannels: Byte;
    sampleRate : LongWord;
    totalSamples: LongWord;
    hpfrequency: Word;
    Version : Byte;
    flags : Byte;
  end;

  ADX_LOOP_V3 = packed record
    loopEnabled: LongWord;
    loopBegSamInd:LongWord;
    loopBegBytInd:LongWord;
    loopEndSamInd:LongWord;
    loopEndBytInd:LongWord;
  end;

  ADX_LOOP_V4 = packed record
    loopEnabled: LongWord;
    loopBegSamInd:LongWord;
    loopBegBytInd:LongWord;
    loopEndSamInd:LongWord;
    loopEndBytInd:LongWord;
  end;
{...}

var
  Form1 : TForm1;
  adxhdr : ADX_HEADER;
  adxloopv3 : ADX_LOOP_V3;
  adxloopv4 : ADX_LOOP_V4;

function READ_HEADER(efile:string):boolean;
function read_loopv3(efile:string):boolean;
function read_loopv4(efile:string):boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  M_PI : double;
  a,b,c : double;
  coefficient: array [0..1] of double;

begin
  READ_HEADER('c:\MeineDatei.adx');

  if adxhdr.Version=3 then
    read_loopv3('c:\MeineDatei.adx')
  else if adxhdr.Version=4 then
    read_loopv4('c:\MeineDatei.adx');

  //-------> coefficients must be calculated

  M_PI:=ArcCos(-1.0);
  a := sqrt(2.0) - cos(2.0 * M_PI * (adxhdr.hpfrequency/adxhdr.sampleRate));
  b := sqrt(2.0) - 1.0;
  c := (a - sqrt((a + b) * (a - b))) / b;

  // double coefficient[2];
  coefficient[0] := c * 2.0;
  coefficient[1] := -(c * c);


end;

function READ_HEADER(efile:string):boolean;
var
  edat : file;
  buffer : array [0..$FFFF] of byte;
  gelesen : integer;
begin
  result:=false;
  assignfile(edat,efile);
  reset(edat,1);
  blockread(edat,buffer,sizeof(adxhdr),gelesen);
  move(buffer[0],adxhdr,sizeof(adxhdr));
  if (adxhdr.Begin_0x80=128) and (adxhdr.Begin_0x00=0) then begin
    result:=true;
  end;
  closefile(edat);
end;

function read_loopv3(efile:string):boolean;
var
  edat : file;
  buffer : array [0..$FFFF] of byte;
  gelesen : integer;
begin
  result:=false;
  try
    assignfile(edat,efile);
    reset(edat,1);
    seek(edat, 24);
    blockread(edat,buffer,sizeof(adxloopv3),gelesen);
    move(buffer[0],adxloopv3,sizeof(adxloopv3));
  finally
    result:=true;
    closefile(edat);
  end;
end;

function read_loopv4(efile:string):boolean;
var
  edat : file;
  buffer : array [0..$FFFF] of byte;
  gelesen : integer;
begin
  result:=false;
  try
    assignfile(edat,efile);
    reset(edat,1);
    seek(edat, 36);
    blockread(edat,buffer,sizeof(adxloopv3),gelesen);
    move(buffer[0],adxhdr,sizeof(adxloopv3));
  finally
    result:=true;
    closefile(edat);
  end;
end;

end.
Nun steht in den nächsten Zeilen bei wikipedia:
Code:
static int32_t*      past_samples;
 static uint_fast32_t sample_index = 0;
 static ADX_header*   adx_header;
Sieht für mich wie eine Variablendeklaration aus. Ich weiß jedoch nicht was da genau gemacht wird.
Außerdem werden zwischendurch die funktionen "ntohs" und "sign_extend" verwendet... mit denen kann ich ebenfalls nichts anfangen. Gibt es gleichbedeutende funktionen bei Delphi?
Code:
scale[i] = ntohs( bitstream_read( 16 ) );
sample_error = sign_extend( sample_error, adx_header->sample_bitdepth );
fortsetzung folgt
mfg
Rer
  Mit Zitat antworten Zitat