2つの1次元信号を畳み込む必要があります。1つは平均500ポイント(これはハニングウィンドウ関数です)、もう1つは125000です。1回の実行で、3回の畳み込み演算を適用する必要があります。私はすでにscipyのドキュメントに基づいて実行されている実装を持っています。必要に応じて、ここでコードを確認できます(Delphiコードを先に):
function Convolve(const signal_1, signal_2 : ExtArray) : ExtArray;
var
capital_k : Integer;
capital_m : Integer;
smallest : Integer;
y : ExtArray;
n : Integer;
k : Integer;
lower, upper : Integer;
begin
capital_k := Length(signal_1) + Length(signal_2) - 1;
capital_m := Math.Max(Length(signal_1), Length(signal_2));
smallest := Math.Min(Length(signal_1), Length(signal_2));
SetLength(y, capital_k);
for n := 0 to Length(y) - 1 do begin
y[n] := 0;
lower := Math.Max(n - capital_m, 0);
upper := Math.Min(n, capital_k);
for k := lower to upper do begin
if (k >= Length(signal_1)) or (n - k >= Length(signal_2)) then
Continue;
y[n] := y[n] + signal_1[k] * signal_2[n - k];
end;
end;
Result := Slice(y,
Floor(smallest / 2) - 1,
Floor(smallest / 2) - 1 + capital_m);
end;
問題は、この実装が遅すぎることです。全体の手順は約5分かかります。それを計算するより速い方法を見つけることができるかどうか疑問に思いました。