Потребовалось использовать в программе на Vala некоторые функции небезызвестной библиотеки для вычисления быстрого преобразования Фурье fftw3. Для чего был написан простенький vapi-файл. В силу своего, прямо скажем, мизерного пока еще опыта использования Vala, не рекомендую брать данный vapi за эталон, тем не менее выкладываю его на случай, если кому-то он окажется полезен. В vapi прописаны лишь некоторые функции, типы и константы и лишь для работы с float-значениями, однако, думаю, при необходимости не составит никакого труда файл необходимым образом дополнить по аналогии. fftw_complex было принято решение не использовать, не заворачивать в класс, а по-простому работать напрямую с float-массивами (поэтому осторожней с выделением-освобождением памяти).
Сам vapi-файл:
Пример использования:
В заключение хочу порекомендовать отличное how-to по написанию vapi к не-GObject-библиотекам.
Сам vapi-файл:
[CCode (cprefix = "fftwf_", cheader_filename = "fftw3.h")] namespace Fftwf { [CCode(cprefix = "FFTW_")] enum Sign { FORWARD = -1, BACKWARD = 1 } [CCode(cprefix = "FFTW_")] enum Flag { MEASURE = (0U), DESTROY_INPUT = (1U << 0), UNALIGNED = (1U << 1), CONSERVE_MEMORY = (1U << 2), EXHAUSTIVE = (1U << 3), PRESERVE_INPUT = (1U << 4), PATIENT = (1U << 5), ESTIMATE = (1U << 6) } [CCode(cname = "fftwf_plan")] public struct Plan : int { } // fake int void destroy_plan(Plan p); void execute(Plan p); void free(float *p); float* malloc(size_t n); Plan plan_dft_1d(int n, float* in_ptr, float* out_ptr, Sign sign, Flag flags); }
Пример использования:
{
float input[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
float *data;
float *fft_result;
float *ifft_result;
Fftwf.Plan plan_forward, plan_backward;
int i;
data = Fftwf.malloc( 2 * sizeof(float) * input.length );
fft_result = Fftwf.malloc( 2 * sizeof(float) * input.length );
ifft_result = Fftwf.malloc( 2 * sizeof(float) * input.length );
plan_forward = Fftwf.plan_dft_1d( input.length, (void*)data, (void*)fft_result, Fftwf.Sign.FORWARD, Fftwf.Flag.ESTIMATE );
plan_backward = Fftwf.plan_dft_1d( input.length, (void*)fft_result, (void*)ifft_result, Fftwf.Sign.BACKWARD, Fftwf.Flag.ESTIMATE );
/* populate input data */
for(i = 0 ; i < input.length ; i++)
{
data[2 * i + 0] = input[i];
data[2 * i + 1] = 0.0f;
}
/* print initial data */
for( i = 0 ; i < input.length ; i++ )
{
print("data[%d] = { %2.2f, %2.2f }\n",
i, data[2 * i + 0], data[2 * i + 1] );
}
Fftwf.execute( plan_forward );
/* print fft result */
for(i = 0 ; i < input.length ; i++)
{
print("fft_result[%d] = { %2.2f, %2.2f }\n",
i, fft_result[2 * i + 0], fft_result[2 * i + 1] );
}
Fftwf.execute( plan_backward );
/* print ifft result */
for( i = 0 ; i < input.length ; i++ )
{
print("ifft_result[%d] = { %2.2f, %2.2f }\n",
i, ifft_result[2 * i + 0] / input.length, ifft_result[2 * i + 1] / input.length );
}
/* free memory */
Fftwf.destroy_plan( plan_forward );
Fftwf.destroy_plan( plan_backward );
Fftwf.free(data);
Fftwf.free(fft_result);
Fftwf.free(ifft_result);
}
В заключение хочу порекомендовать отличное how-to по написанию vapi к не-GObject-библиотекам.
0 коммент.:
Подписаться на:
Комментарии к сообщению (Atom)