LP_c_double создается динамически ctypes, когда вы создаете указатель на double. т.е.
LP_c_double = POINTER(c_double)
На данный момент вы создали тип C . Теперь вы можете создавать экземпляры этих указателей.
my_pointer_one = LP_c_double()
Но вот кикер. Ваша функция не ожидает указатель на двойное число. Ожидается массив парных разрядов. В C массив типа X представлен указателем (типа X) на первый элемент в этом массиве.
Другими словами, чтобы создать указатель на двойник, подходящий для передачи в вашу функцию, вам действительно нужно выделить массив двойников некоторого конечного размера (документация для ReturnPulse должна указывать, сколько нужно выделить), а затем передать этот элемент напрямую (не приведение, не разыменование).
т.е.
size = GetSize()
# create the array type
array_of_size_doubles = c_double*size
# allocate several instances of that type
ptrpulse = array_of_size_doubles()
ptrtdl = array_of_size_doubles()
ptrtdP = array_of_size_doubles()
ptrfdl = array_of_size_doubles()
ptrfdP = array_of_size_doubles()
ReturnPulse(ptrpulse, ptrtdl, ptrtdP, ptrfdl, ptrfdP)
Теперь пять массивов должны быть заполнены значениями , возвращаемыми функцией ReturnPulse.