我正在为Scientific Ruby Foundation的fftw3库创建一个 ruby 包装器,它使用 nmatrix 对象而不是常规的 ruby 数组。
我在返回转换后的数组时遇到了一个奇怪的问题,因为我不确定如何执行此操作,因此我可以检查转换是否已根据八度音程或(类似的)在我的规范中正确计算
我有一个想法,我可能最好将out
作为fftw_complex
类型的输出数组转换为 VALUE 以在返回之前将其传递给 nmatrix 对象,但我不确定我是否应该使用智慧并使用 fftw 从中获取值.
这是travis-ci 上规范输出的方法和链接
static VALUE
fftw_r2c_one(VALUE self, VALUE nmatrix)
{
VALUE cNMatrix = rb_define_class("NMatrix", rb_cObject);
fftw_plan plan;
VALUE shape = rb_funcall(nmatrix, rb_intern("shape"), 0);
const int size = NUM2INT(rb_funcall(cNMatrix, rb_intern("size"), 1, shape));
double* in = ALLOC_N(double, size);
for (int i = 0; i < size; i++)
{
in[i] = NUM2DBL(rb_funcall(nmatrix, rb_intern("[]"), 1, INT2FIX(i)));
printf("IN[%d]: in[%.2f] \n", i, in[i]);
}
fftw_complex* out = (fftw_complex *) fftw_malloc(sizeof(fftw_complex) * size + 1);
plan = fftw_plan_dft_r2c(1,&size, in, out, FFTW_ESTIMATE);
fftw_execute(plan);
fftw_destroy_plan(plan);
xfree(in);
fftw_free(out);
return nmatrix;
}
如果您愿意,请随意从 github克隆 repo并尝试一下。
注意:在开始这个项目之前,我很陌生fftw3
并且没有使用C
(或)太多。ruby
我已经更习惯了java
,到目前为止,我还没有完全理解内存管理等较低级别的概念,但我正在接受这个项目python
。javascript
请在您的回答中牢记这一点,并尝试通过避免使用行话(或注意指出)来确保他们对最近主要习惯于面向对象的方法的人来说很清楚真的会有帮助。
谢谢你。