Registriert seit: 19. Sep 2021
Ort: Schwarzwald
17 Beiträge
Delphi 10.4 Sydney
|
AW: Integer (1 Byte) Datentransformation DCT (FFT) gesucht
25. Okt 2021, 11:25
Ja könnte natürlich auch sein.
Hier die Übersetzungen (non integer):
Delphi-Quellcode:
class procedure TCompressOSCT.DCT(const Input: TFloat64Array; out Output: TFloat64Array); //1 double[] DCT (double[] g) { // forward DCT on signal g
var
M, mCnt, uCnt: Int64;
s, cm, sums, Phi: Float64;
begin
M := Length(Input); //2 int M = g.length;
s := sqrt(2.0 / M); //3 double s = Math.sqrt(2.0 / M); // common scale factor
SetLength(Output, M); //4 double[] G = new double[M];
for mCnt := 0 to High(Input) do //5 for (int m = 0; m < M; m++) {
begin
cm := 1; // 6 double cm = 1.0;
if mCnt = 0 then // 7 if (m == 0)
begin
cm := 1 / sqrt(2); // 8 cm = 1.0 / Math.sqrt(2);
end;
sums := 0; // 9 double sum = 0;
for uCnt := 0 to High(Input) do // 10 for (int u = 0; u < M; u++) {
begin
Phi := Pi * mCnt * (2 * uCnt + 1) / (2 * M); //11 double Phi = Math.PI * m * (2 * u + 1) / (2 * M);
sums := sums + (Input[uCnt] * cm * cos(Phi)); // 12 sum += g[u] * cm * Math.cos(Phi); }
end;
Output[mCnt] := s * sums; // 14 G[m] = s * sum; }
end;
end;
class procedure TCompressOSCT.InvDCT(const Input: TFloat64Array; out Output: TFloat64Array); // 20 double[] iDCT (double[] G) { // inverse DCT on spectrum G
var
M, mCnt, uCnt: Int64;
s, cm, sums, Phi: Float64;
begin
M := Length(Input); // 21 int M = G.length;
s := sqrt(2.0 / M); // 22 double s = Math.sqrt(2.0 / M); //common scale factor
SetLength(Output, M); // 23 double[] g = new double[M];
for uCnt := 0 to High(Input) do // 24 for (int u = 0; u < M; u++) {
begin
sums := 0; // 25 double sum = 0;
for mCnt := 0 to High(Input) do //26 for (int m = 0; m < M; m++) {
begin
cm := 1; // 27 double cm = 1.0;
if mCnt = 0 then // 28 if (m == 0)
begin
cm := 1 / sqrt(2); // 29 cm = 1.0 / Math.sqrt(2);
end;
Phi := Pi * mCnt * (2 * uCnt + 1) / (2 * M); // 30 double Phi = Math.PI * m * (2 * u + 1) / (2 * M);
sums := sums + (Input[mCnt] * cm * cos(Phi)); // 31 sum += G[m] * cm * Math.cos(Phi); 32 }
end;
Output[uCnt] := s * sums; // 33 g[u] = s * sum; 34 }
end;
end;
Reto Crameri
|
|
Zitat
|