Код:
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