Ich habe mal versucht zu optimieren.
Unnötige doppelte Operationen mit Hilfe von Zwischenvariablen aus Schleifen ziehen.
Multiplikation durch Addition ersetzen, wenn das möglich ist.
Ob das eine merkliche Verbesserung der Laufzeit bringt, müsste man in der Praxis testen.
Delphi-Quellcode:
class procedure TCompressOSCT.DCT(const Input: TFloat64Array; out Output: TFloat64Array);
var
M, mCnt, uCnt: Int64;
s, sums, Phi, Pi2M, Pi2MmCnt: Float64;
begin
M := Length(Input);
SetLength(Output, M);
if M > 0 then
begin
s := sqrt(2.0 / M);
Pi2M := Pi / (2 * M);
Pi2MmCnt := 0;
for mCnt := 0 to M - 1 do
begin
sums := 0;
Phi := Pi2MmCnt;
for uCnt := 0 to M - 1 do
begin
sums := sums + (Input[uCnt] * cos(Phi));
Phi := Phi + Pi2MmCnt + Pi2MmCnt;
end;
Output[mCnt] := s * sums;
Pi2MmCnt := Pi2MmCnt + Pi2M;
end;
Output[0] := Output[0] / sqrt(2);
end;
end;
Warum wird eigentlich ausgerechnet nur Output[0] durch sqrt(2) dividiert?