Код:
Global  NewList in.d()
Global  NewList out.d()

;косинусовое преобразование
ProcedureDLL DCT()
  ClearList(out())
  n = ListSize(in())
  For k = 0 To n - 1
    sum.d = 0
    For i = 0 To n - 1
      SelectElement(in(), i)
      sum + in() * Cos(#PI / n * (i + 0.5) * k)
    Next
    AddElement(out())
    If k = 0
      out() = sum * Sqr(1.0 / n)
    Else
      out() = sum * Sqr(2.0 / n)
    EndIf
  Next
EndProcedure

;обратное косинусовое преобразование
ProcedureDLL IDCT()
  ClearList(out())
  n = ListSize(in())
  For i = 0 To n - 1
    sum.d = 0
    For k = 0 To n - 1
      SelectElement(in(),k)
      If k = 0
        sum + in() * Sqr(1.0 / n) * Cos(#PI / n * (i + 0.5) * k)
      Else
        sum + in() * Sqr(2.0 / n) * Cos(#PI / n * (i + 0.5) * k)
      EndIf
    Next
    AddElement(out())
    out() = sum
  Next
EndProcedure

;получить данные для вычислений
ProcedureDLL  Set(*Pointer.Double, Count)
  ClearList(in())
  For i = 1 To  Count
    AddElement(in())
    in()=*Pointer\d
    *Pointer  + SizeOf(Double)
  Next
EndProcedure

;отправить результаты вычислений
ProcedureDLL  Get(*Pointer.Double,  Count)
  For i = 0 To  Count-1
    SelectElement(out(),  i)
    *Pointer\d  = out()
    *Pointer  + SizeOf(Double)
  Next
EndProcedure