, Если кодирование в Delphi не является первостепенной задачей, вы можете использовать C / C ++, хотя бы по той причине, что FFTW и некоторые другие библиотеки доступны в C / C ++ (не уверен насчет scipy или Delphi).

ужно свертить два одномерных сигнала, один из которых имеет в среднем 500 точек (это оконная функция Хеннинга), другой 125000. За цикл мне нужно применить трижды операцию свертки. У меня уже есть реализация, основанная на документации 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;

Проблема в том, что эта реализация слишком медленная. Вся процедура занимает около пяти минут. Мне было интересно, смогу ли я найти более быстрый способ вычисления этого.

Ответы на вопрос(2)

Ваш ответ на вопрос