Udało mi się, po paru próbach, dojść do takiego kodu:
[C#]
[DllImport("mytest.dll", EntryPoint="makeFFT")]
private static extern void makeFFT_(IntPtr inputArray, IntPtr outputArray);
public static void makeFFT(float[] inpArr, float[] outArr)
{
IntPtr inpArrBuf = Marshal.AllocHGlobal(sizeof(float) * inpArr.Length);
IntPtr outArrBuf = Marshal.AllocHGlobal(sizeof(float) * outArr.Length);
Marshal.Copy(inpArr, 0, inpArrBuf, inpArr.Length);
makeFFT_(inpArrBuf, outArrBuf);
Marshal.Copy(outArrBuf, outArr, 0, outArr.Length);
Marshal.FreeHGlobal(inpArrBuf);
Marshal.FreeHGlobal(outArrBuf);
}
Gdzie funkcja w C ma typ:
[C]
void makeFFT( float* inArr, float* outArr )
Kod, choć niezbyt piękny, działa i robi to o co od niego oczekiwałem: wywołuje zawartą w bibliotece funkcję makeFFT gdzie inArr jest parametrem wejściowym, zaś outArr - wyjściowym. Zasadnicze pytanie brzmi: czy da się to zrobić krócej, bardziej elegancko?
Subskrybuj:
Komentarze do posta (Atom)
Fajne, muszę zapamiętać, że to opisałeś. Kiedyś może się przydać ;-)
OdpowiedzUsuńDla C# powinna być jakaś biblioteka do szybkiej transformaty fouriera (chyba, że to FFT od czegoś innego jest).
Są, ale nie znalazłem żadnej która:
OdpowiedzUsuń[1] byłaby wystarczająco sprawdzona
[2] byłaby odpowiednio giętka
[3] i przy okazji szybka
[4] i miała licencję, która umożliwia korzystanie z niej w projektach komercyjnych.
[5] była w C# :-)
Punkty [1]-[4] spełnia biblioteka KISS FFT, która jest jednak napisana w C. Stąd potrzeba funkcji przejściowej.