vdsp 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e96502b4ea34359396ef05b363bac46660e23982e9b3d70db81a734744e08b70
4
+ data.tar.gz: c43bbbf162cd091ed47743833c1075982c2b7b94d2b5c57c65757dbd7a58a993
5
+ SHA512:
6
+ metadata.gz: 85e84f6bedf1bff6bdb7a170d2eab9761456ac670a382854490f0a16145f06c9358ae02bcd0f2a02704557f12f45b364dc1f3465a323352eff5313ad3e0600b2
7
+ data.tar.gz: fcd742e4a08381f089ce329c9771f2862eb1d8748ae8640e7ab743628ca72b1ef548c5bf9a63c1423f6b018ebc5a2f6b7449c9bddd84db5a26d6700e7046adcc
data/.gitignore ADDED
@@ -0,0 +1,13 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ *.bundle
10
+ *.so
11
+ *.o
12
+ *.a
13
+ mkmf.log
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.7.0
7
+ before_install: gem install bundler -v 2.0.2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in vdsp.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2019 yoshida
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # Vdsp
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/vdsp`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'vdsp'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install vdsp
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/vdsp.
36
+
37
+ ## License
38
+
39
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,18 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ require "rake/extensiontask"
11
+
12
+ task :build => :compile
13
+
14
+ Rake::ExtensionTask.new("vdsp") do |ext|
15
+ ext.lib_dir = "lib/vdsp"
16
+ end
17
+
18
+ task :default => [:clobber, :compile, :test]
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "vdsp"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,3 @@
1
+ require "mkmf"
2
+
3
+ create_makefile("vdsp/vdsp")
data/ext/vdsp/vdsp.c ADDED
@@ -0,0 +1,832 @@
1
+ #include "vdsp.h"
2
+
3
+
4
+ VALUE rb_mVdsp;
5
+
6
+ VALUE rb_mVdspScalar;
7
+ VALUE rb_mVdspArray;
8
+
9
+ VALUE rb_cDoubleScalar;
10
+ VALUE rb_cDoubleArray;
11
+ VALUE rb_mDouble;
12
+
13
+
14
+ // Native resource
15
+
16
+ void vdsp_array_native_resource_delete(VdspArrayNativeResource * p)
17
+ {
18
+ if (p->v.ptr) {
19
+ free(p->v.ptr);
20
+ }
21
+ free(p);
22
+ }
23
+
24
+ VdspArrayNativeResource* get_vdsp_array_native_resource(VALUE va)
25
+ {
26
+ VALUE resource = rb_iv_get(va, "native_resource");
27
+ if (resource==Qnil) {
28
+ return NULL;
29
+ }
30
+
31
+ VdspArrayNativeResource *p;
32
+ Data_Get_Struct(resource, VdspArrayNativeResource, p);
33
+
34
+ return p;
35
+ }
36
+
37
+ VdspArrayValue get_vdsp_array_value(VALUE va)
38
+ {
39
+ VdspArrayNativeResource *p = get_vdsp_array_native_resource(va);
40
+ return p->v;
41
+ }
42
+
43
+ double* get_double_array_value(VALUE va)
44
+ {
45
+ return get_vdsp_array_value(va).d;
46
+ }
47
+
48
+ long get_vdsp_array_length(VALUE va)
49
+ {
50
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(va);
51
+ return _a->length;
52
+ }
53
+
54
+
55
+ // Vdsp::DoubleScalar
56
+
57
+ VALUE rb_double_scalar_initialize(VALUE self, VALUE val)
58
+ {
59
+ val = rb_funcall(val, rb_intern("to_f"), 0);
60
+ rb_iv_set(self, "val", val);
61
+ return self;
62
+ }
63
+
64
+ VALUE rb_double_scalar_plus(VALUE self, VALUE other)
65
+ {
66
+ assert(rb_obj_is_kind_of(other, rb_mVdspArray));
67
+
68
+ VALUE val = rb_iv_get(self, "val");
69
+ return rb_double_array_plus(other, val);
70
+ }
71
+
72
+ VALUE rb_double_scalar_minus(VALUE self, VALUE other)
73
+ {
74
+ assert(rb_obj_is_kind_of(other, rb_mVdspArray));
75
+
76
+ other = rb_double_array_mul(other, DBL2NUM(-1.0));
77
+ VALUE val = rb_iv_get(self, "val");
78
+ return rb_double_array_plus(other, val);
79
+ }
80
+
81
+ VALUE rb_double_scalar_mul(VALUE self, VALUE other)
82
+ {
83
+ assert(rb_obj_is_kind_of(other, rb_mVdspArray));
84
+
85
+ VALUE val = rb_iv_get(self, "val");
86
+ return rb_double_array_mul(other, val);
87
+ }
88
+
89
+ VALUE rb_double_scalar_div(VALUE self, VALUE other)
90
+ {
91
+ assert(rb_obj_is_kind_of(other, rb_mVdspArray));
92
+
93
+ VALUE val = rb_iv_get(self, "val");
94
+ double _a = NUM2DBL(val);
95
+
96
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(other);
97
+ VALUE lenv = LONG2NUM(_b->length);
98
+
99
+ VALUE c = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
100
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
101
+
102
+ vDSP_svdivD(&_a, _b->v.d, 1, _c->v.d, 1, _b->length);
103
+
104
+ return c;
105
+ }
106
+
107
+
108
+ // Vdsp::Array
109
+
110
+ VALUE rb_vdsp_array_length(VALUE self)
111
+ {
112
+ return LONG2NUM(get_vdsp_array_length(self));
113
+ }
114
+
115
+
116
+ // Vdsp::DoubleArray
117
+
118
+ VALUE rb_double_array_initialize(VALUE self, VALUE length)
119
+ {
120
+ if (!FIXNUM_P(length)) {
121
+ rb_raise(rb_eArgError, "Integer required: length");
122
+ }
123
+ long _length = FIX2LONG(length);
124
+
125
+ VdspArrayNativeResource *p = ALLOC(VdspArrayNativeResource);
126
+ p->v.ptr = NULL;
127
+ p->length = 0;
128
+
129
+ VALUE resource = Data_Wrap_Struct(CLASS_OF(self), 0, vdsp_array_native_resource_delete, p);
130
+ rb_iv_set(self, "native_resource", resource);
131
+
132
+ p->v.ptr = calloc(_length, sizeof(double));
133
+ p->length = _length;
134
+
135
+ return self;
136
+ }
137
+
138
+ VALUE rb_double_array_set_values(VALUE self, VALUE ary)
139
+ {
140
+ if (!RB_TYPE_P(ary, T_ARRAY)) {
141
+ rb_raise(rb_eArgError, "Array required");
142
+ }
143
+
144
+ VdspArrayNativeResource *p = get_vdsp_array_native_resource(self);
145
+
146
+ const VALUE *ary_p = RARRAY_CONST_PTR(ary);
147
+ unsigned long ary_len = RARRAY_LEN(ary);
148
+
149
+ if (p->length!=ary_len) {
150
+ rb_raise(rb_eArgError, "Array length error: self.length=%ld src.length=%ld", p->length, ary_len);
151
+ }
152
+
153
+ double *d = p->v.d;
154
+
155
+ for (unsigned long i=0; i<p->length; i++) {
156
+ d[i] = NUM2DBL(ary_p[i]);
157
+ }
158
+
159
+ return self;
160
+ }
161
+
162
+ VALUE rb_double_array_get_values(VALUE self)
163
+ {
164
+ VdspArrayNativeResource *p = get_vdsp_array_native_resource(self);
165
+ double *d = p->v.d;
166
+
167
+ VALUE ret = rb_ary_new2(p->length);
168
+ for (unsigned long i=0; i<p->length; i++) {
169
+ rb_ary_push(ret, DBL2NUM(d[i]));
170
+ }
171
+
172
+ return ret;
173
+ }
174
+
175
+ VALUE rb_double_array_create(VALUE cls, VALUE ary)
176
+ {
177
+ if (rb_obj_is_kind_of(ary, rb_mVdspArray)) {
178
+ return rb_funcall(ary, rb_intern("to_da"), 0);
179
+ }
180
+ if (!RB_TYPE_P(ary, T_ARRAY)) {
181
+ rb_raise(rb_eArgError, "Array required");
182
+ }
183
+
184
+ VALUE len = LONG2NUM(RARRAY_LEN(ary));
185
+ VALUE obj = rb_class_new_instance(1, &len, rb_cDoubleArray);
186
+ rb_double_array_set_values(obj, ary);
187
+
188
+ return obj;
189
+ }
190
+
191
+ VALUE rb_double_array_to_da(VALUE self)
192
+ {
193
+ return self;
194
+ }
195
+
196
+ VALUE rb_double_array_plus(VALUE self, VALUE other)
197
+ {
198
+ if (rb_obj_is_kind_of(other, rb_mVdspArray)) {
199
+ other = rb_funcall(other, rb_intern("to_da"), 0);
200
+
201
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(self);
202
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(other);
203
+
204
+ vDSP_Length len = MIN(_a->length, _b->length);
205
+ VALUE lenv = LONG2NUM(len);
206
+ VALUE c = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
207
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
208
+
209
+ vDSP_vaddD(_a->v.d, 1, _b->v.d, 1, _c->v.d, 1, len);
210
+ return c;
211
+
212
+ } else if (rb_obj_is_kind_of(other, rb_cNumeric)) {
213
+ other = rb_funcall(other, rb_intern("to_f"), 0);
214
+ double _b = NUM2DBL(other);
215
+
216
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(self);
217
+ VALUE lenv = LONG2NUM(_a->length);
218
+ VALUE c = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
219
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
220
+
221
+ vDSP_vsaddD(_a->v.d, 1, &_b, _c->v.d, 1, _a->length);
222
+ return c;
223
+
224
+ } else {
225
+ return rb_num_coerce_bin(self, other, '+');
226
+ }
227
+ }
228
+
229
+ VALUE rb_double_array_minus(VALUE self, VALUE other)
230
+ {
231
+ if (rb_obj_is_kind_of(other, rb_mVdspArray)) {
232
+ other = rb_funcall(other, rb_intern("to_da"), 0);
233
+
234
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(self);
235
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(other);
236
+
237
+ vDSP_Length len = MIN(_a->length, _b->length);
238
+ VALUE lenv = LONG2NUM(len);
239
+ VALUE c = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
240
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
241
+
242
+ vDSP_vsubD(_b->v.d, 1, _a->v.d, 1, _c->v.d, 1, len);
243
+ return c;
244
+
245
+ } else if (rb_obj_is_kind_of(other, rb_cNumeric)) {
246
+ other = rb_funcall(other, rb_intern("to_f"), 0);
247
+ double _b = -NUM2DBL(other);
248
+
249
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(self);
250
+ VALUE lenv = LONG2NUM(_a->length);
251
+ VALUE c = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
252
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
253
+
254
+ vDSP_vsaddD(_a->v.d, 1, &_b, _c->v.d, 1, _a->length);
255
+ return c;
256
+
257
+ } else {
258
+ return rb_num_coerce_bin(self, other, '-');
259
+ }
260
+ }
261
+
262
+ VALUE rb_double_array_mul(VALUE self, VALUE other)
263
+ {
264
+ if (rb_obj_is_kind_of(other, rb_mVdspArray)) {
265
+ other = rb_funcall(other, rb_intern("to_da"), 0);
266
+
267
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(self);
268
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(other);
269
+
270
+ vDSP_Length len = MIN(_a->length, _b->length);
271
+ VALUE lenv = LONG2NUM(len);
272
+ VALUE c = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
273
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
274
+
275
+ vDSP_vmulD(_a->v.d, 1, _b->v.d, 1, _c->v.d, 1, len);
276
+ return c;
277
+
278
+ } else if (rb_obj_is_kind_of(other, rb_cNumeric)) {
279
+ other = rb_funcall(other, rb_intern("to_f"), 0);
280
+ double _b = NUM2DBL(other);
281
+
282
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(self);
283
+ VALUE lenv = LONG2NUM(_a->length);
284
+ VALUE c = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
285
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
286
+
287
+ vDSP_vsmulD(_a->v.d, 1, &_b, _c->v.d, 1, _a->length);
288
+ return c;
289
+
290
+ } else {
291
+ return rb_num_coerce_bin(self, other, '*');
292
+ }
293
+ }
294
+
295
+ VALUE rb_double_array_div(VALUE self, VALUE other)
296
+ {
297
+ if (rb_obj_is_kind_of(other, rb_mVdspArray)) {
298
+ other = rb_funcall(other, rb_intern("to_da"), 0);
299
+
300
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(self);
301
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(other);
302
+
303
+ vDSP_Length len = MIN(_a->length, _b->length);
304
+ VALUE lenv = LONG2NUM(len);
305
+ VALUE c = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
306
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
307
+
308
+ vDSP_vdivD(_a->v.d, 1, _b->v.d, 1, _c->v.d, 1, len);
309
+ return c;
310
+
311
+ } else if (rb_obj_is_kind_of(other, rb_cNumeric)) {
312
+ other = rb_funcall(other, rb_intern("to_f"), 0);
313
+ double _b = NUM2DBL(other);
314
+
315
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(self);
316
+ VALUE lenv = LONG2NUM(_a->length);
317
+ VALUE c = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
318
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
319
+
320
+ vDSP_vsdivD(_a->v.d, 1, &_b, _c->v.d, 1, _a->length);
321
+ return c;
322
+
323
+ } else {
324
+ return rb_num_coerce_bin(self, other, '/');
325
+ }
326
+ }
327
+
328
+ VALUE rb_double_array_aref(VALUE self, VALUE i)
329
+ {
330
+ long _i = NUM2LONG(i);
331
+
332
+ VdspArrayNativeResource *p = get_vdsp_array_native_resource(self);
333
+ if (0<=_i && (unsigned long)_i<p->length) {
334
+ return DBL2NUM(p->v.d[_i]);
335
+ } else {
336
+ rb_raise(rb_eIndexError, "Index out of range: %ld", _i);
337
+ }
338
+ }
339
+
340
+ VALUE rb_double_array_aset(VALUE self, VALUE i, VALUE val)
341
+ {
342
+ long _i = NUM2LONG(i);
343
+
344
+ VdspArrayNativeResource *p = get_vdsp_array_native_resource(self);
345
+ if (0<=_i && (unsigned long)_i<p->length) {
346
+ val = rb_funcall(val, rb_intern("to_f"), 0);
347
+ p->v.d[_i] = NUM2DBL(val);
348
+ return val;
349
+ } else {
350
+ rb_raise(rb_eIndexError, "Index out of range: %ld", _i);
351
+ }
352
+ }
353
+
354
+ VALUE rb_double_array_coerce(VALUE self, VALUE other)
355
+ {
356
+ other = rb_class_new_instance(1, &other, rb_cDoubleScalar);
357
+ return rb_assoc_new(other, self);
358
+ }
359
+
360
+
361
+ // Vdsp static method
362
+
363
+ // c[i] = a[i] + b
364
+ VALUE rb_double_vsadd(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE c, VALUE c_stride, VALUE n)
365
+ {
366
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
367
+ double _b = NUM2DBL(b);
368
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
369
+
370
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
371
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
372
+ vDSP_Stride _n = FIX2LONG(n);
373
+
374
+ vDSP_vsaddD(_a->v.d, _a_stride, &_b, _c->v.d, _c_stride, _n);
375
+
376
+ return c;
377
+ }
378
+
379
+ // c[i] = a[i] + b[i]
380
+ VALUE rb_double_vadd(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE b_stride, VALUE c, VALUE c_stride, VALUE n)
381
+ {
382
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
383
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
384
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
385
+
386
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
387
+ vDSP_Stride _b_stride = FIX2LONG(b_stride);
388
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
389
+ vDSP_Stride _n = FIX2LONG(n);
390
+
391
+ vDSP_vaddD(_a->v.d, _a_stride, _b->v.d, _b_stride, _c->v.d, _c_stride, _n);
392
+
393
+ return c;
394
+ }
395
+
396
+ // c[i] = a[i] - b[i]
397
+ VALUE rb_double_vsub(VALUE cls, VALUE b, VALUE b_stride, VALUE a, VALUE a_stride, VALUE c, VALUE c_stride, VALUE n)
398
+ {
399
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
400
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
401
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
402
+
403
+ vDSP_Stride _b_stride = FIX2LONG(b_stride);
404
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
405
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
406
+ vDSP_Stride _n = FIX2LONG(n);
407
+
408
+ vDSP_vsubD(_b->v.d, _b_stride, _a->v.d, _a_stride, _c->v.d, _c_stride, _n);
409
+
410
+ return c;
411
+ }
412
+
413
+ // c[i] = a[i] * b
414
+ VALUE rb_double_vsmul(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE c, VALUE c_stride, VALUE n)
415
+ {
416
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
417
+ double _b = NUM2DBL(b);
418
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
419
+
420
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
421
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
422
+ vDSP_Stride _n = FIX2LONG(n);
423
+
424
+ vDSP_vsmulD(_a->v.d, _a_stride, &_b, _c->v.d, _c_stride, _n);
425
+
426
+ return c;
427
+ }
428
+
429
+ // c[i] = a[i] * b[i]
430
+ VALUE rb_double_vmul(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE b_stride, VALUE c, VALUE c_stride, VALUE n)
431
+ {
432
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
433
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
434
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
435
+
436
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
437
+ vDSP_Stride _b_stride = FIX2LONG(b_stride);
438
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
439
+ vDSP_Stride _n = FIX2LONG(n);
440
+
441
+ vDSP_vmulD(_a->v.d, _a_stride, _b->v.d, _b_stride, _c->v.d, _c_stride, _n);
442
+
443
+ return c;
444
+ }
445
+
446
+ // c[i] = a[i] / b
447
+ VALUE rb_double_vsdiv(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE c, VALUE c_stride, VALUE n)
448
+ {
449
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
450
+ double _b = NUM2DBL(b);
451
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
452
+
453
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
454
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
455
+ vDSP_Stride _n = FIX2LONG(n);
456
+
457
+ vDSP_vsdivD(_a->v.d, _a_stride, &_b, _c->v.d, _c_stride, _n);
458
+
459
+ return c;
460
+ }
461
+
462
+ // c[i] = a / b[i]
463
+ VALUE rb_double_svdiv(VALUE cls, VALUE a, VALUE b, VALUE b_stride, VALUE c, VALUE c_stride, VALUE n)
464
+ {
465
+ double _a = NUM2DBL(a);
466
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
467
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
468
+
469
+ vDSP_Stride _b_stride = FIX2LONG(b_stride);
470
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
471
+ vDSP_Stride _n = FIX2LONG(n);
472
+
473
+ vDSP_svdivD(&_a, _b->v.d, _b_stride, _c->v.d, _c_stride, _n);
474
+
475
+ return c;
476
+ }
477
+
478
+ // o0[i] = i1[i] + i0[i]
479
+ // o1[i] = i1[i] - i0[i]
480
+ VALUE rb_double_vaddsub(VALUE cls, VALUE i0, VALUE i0_stride, VALUE i1, VALUE i1_stride, VALUE o0, VALUE o0_stride, VALUE o1, VALUE o1_stride, VALUE n)
481
+ {
482
+ VdspArrayNativeResource *_i0 = get_vdsp_array_native_resource(i0);
483
+ VdspArrayNativeResource *_i1 = get_vdsp_array_native_resource(i1);
484
+ VdspArrayNativeResource *_o0 = get_vdsp_array_native_resource(o0);
485
+ VdspArrayNativeResource *_o1 = get_vdsp_array_native_resource(o1);
486
+
487
+ vDSP_Stride _i0_stride = FIX2LONG(i0_stride);
488
+ vDSP_Stride _i1_stride = FIX2LONG(i1_stride);
489
+ vDSP_Stride _o0_stride = FIX2LONG(o0_stride);
490
+ vDSP_Stride _o1_stride = FIX2LONG(o1_stride);
491
+ vDSP_Stride _n = FIX2LONG(n);
492
+
493
+ vDSP_vaddsubD(_i0->v.d, _i0_stride, _i1->v.d, _i1_stride, _o0->v.d, _o0_stride, _o1->v.d, _o1_stride, _n);
494
+
495
+ return rb_assoc_new(o0, o1);
496
+ }
497
+
498
+ // c[i] = a[i] / b[i]
499
+ VALUE rb_double_vdiv(VALUE cls, VALUE b, VALUE b_stride, VALUE a, VALUE a_stride, VALUE c, VALUE c_stride, VALUE n)
500
+ {
501
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
502
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
503
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
504
+
505
+ vDSP_Stride _b_stride = FIX2LONG(b_stride);
506
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
507
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
508
+ vDSP_Stride _n = FIX2LONG(n);
509
+
510
+ vDSP_vdivD(_b->v.d, _b_stride, _a->v.d, _a_stride, _c->v.d, _c_stride, _n);
511
+
512
+ return c;
513
+ }
514
+
515
+ // d[i] = (a[i] + b[i]) * c
516
+ VALUE rb_double_vasm(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE b_stride, VALUE c, VALUE d, VALUE d_stride, VALUE n)
517
+ {
518
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
519
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
520
+ double _c = NUM2DBL(c);
521
+ VdspArrayNativeResource *_d = get_vdsp_array_native_resource(d);
522
+
523
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
524
+ vDSP_Stride _b_stride = FIX2LONG(b_stride);
525
+ vDSP_Stride _d_stride = FIX2LONG(d_stride);
526
+ vDSP_Stride _n = FIX2LONG(n);
527
+
528
+ vDSP_vasmD(_a->v.d, _a_stride, _b->v.d, _b_stride, &_c, _d->v.d, _d_stride, _n);
529
+
530
+ return d;
531
+ }
532
+
533
+ // d[i] = (a[i] + b[i]) * c[i]
534
+ VALUE rb_double_vam(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE b_stride, VALUE c, VALUE c_stride, VALUE d, VALUE d_stride, VALUE n)
535
+ {
536
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
537
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
538
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
539
+ VdspArrayNativeResource *_d = get_vdsp_array_native_resource(d);
540
+
541
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
542
+ vDSP_Stride _b_stride = FIX2LONG(b_stride);
543
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
544
+ vDSP_Stride _d_stride = FIX2LONG(d_stride);
545
+ vDSP_Stride _n = FIX2LONG(n);
546
+
547
+ vDSP_vamD(_a->v.d, _a_stride, _b->v.d, _b_stride, _c->v.d, _c_stride, _d->v.d, _d_stride, _n);
548
+
549
+ return d;
550
+ }
551
+
552
+ // d[i] = (a[i] - b[i]) * c
553
+ VALUE rb_double_vsbsm(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE b_stride, VALUE c, VALUE d, VALUE d_stride, VALUE n)
554
+ {
555
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
556
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
557
+ double _c = NUM2DBL(c);
558
+ VdspArrayNativeResource *_d = get_vdsp_array_native_resource(d);
559
+
560
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
561
+ vDSP_Stride _b_stride = FIX2LONG(b_stride);
562
+ vDSP_Stride _d_stride = FIX2LONG(d_stride);
563
+ vDSP_Stride _n = FIX2LONG(n);
564
+
565
+ vDSP_vsbsmD(_a->v.d, _a_stride, _b->v.d, _b_stride, &_c, _d->v.d, _d_stride, _n);
566
+
567
+ return d;
568
+ }
569
+
570
+ // d[i] = (a[i] - b[i]) * c[i]
571
+ VALUE rb_double_vsbm(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE b_stride, VALUE c, VALUE c_stride, VALUE d, VALUE d_stride, VALUE n)
572
+ {
573
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
574
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
575
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
576
+ VdspArrayNativeResource *_d = get_vdsp_array_native_resource(d);
577
+
578
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
579
+ vDSP_Stride _b_stride = FIX2LONG(b_stride);
580
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
581
+ vDSP_Stride _d_stride = FIX2LONG(d_stride);
582
+ vDSP_Stride _n = FIX2LONG(n);
583
+
584
+ vDSP_vsbmD(_a->v.d, _a_stride, _b->v.d, _b_stride, _c->v.d, _c_stride, _d->v.d, _d_stride, _n);
585
+
586
+ return d;
587
+ }
588
+
589
+ // d[i] = (a[i] * b[i]) + c
590
+ VALUE rb_double_vmsa(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE b_stride, VALUE c, VALUE d, VALUE d_stride, VALUE n)
591
+ {
592
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
593
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
594
+ double _c = NUM2DBL(c);
595
+ VdspArrayNativeResource *_d = get_vdsp_array_native_resource(d);
596
+
597
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
598
+ vDSP_Stride _b_stride = FIX2LONG(b_stride);
599
+ vDSP_Stride _d_stride = FIX2LONG(d_stride);
600
+ vDSP_Stride _n = FIX2LONG(n);
601
+
602
+ vDSP_vmsaD(_a->v.d, _a_stride, _b->v.d, _b_stride, &_c, _d->v.d, _d_stride, _n);
603
+
604
+ return d;
605
+ }
606
+
607
+ // d[i] = (a[i] * b) + c[i]
608
+ VALUE rb_double_vsma(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE c, VALUE c_stride, VALUE d, VALUE d_stride, VALUE n)
609
+ {
610
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
611
+ double _b = NUM2DBL(b);
612
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
613
+ VdspArrayNativeResource *_d = get_vdsp_array_native_resource(d);
614
+
615
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
616
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
617
+ vDSP_Stride _d_stride = FIX2LONG(d_stride);
618
+ vDSP_Stride _n = FIX2LONG(n);
619
+
620
+ vDSP_vsmaD(_a->v.d, _a_stride, &_b, _c->v.d, _c_stride, _d->v.d, _d_stride, _n);
621
+
622
+ return d;
623
+ }
624
+
625
+ // d[i] = (a[i] * b[i]) + c[i]
626
+ VALUE rb_double_vma(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE b_stride, VALUE c, VALUE c_stride, VALUE d, VALUE d_stride, VALUE n)
627
+ {
628
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
629
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
630
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
631
+ VdspArrayNativeResource *_d = get_vdsp_array_native_resource(d);
632
+
633
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
634
+ vDSP_Stride _b_stride = FIX2LONG(b_stride);
635
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
636
+ vDSP_Stride _d_stride = FIX2LONG(d_stride);
637
+ vDSP_Stride _n = FIX2LONG(n);
638
+
639
+ vDSP_vmaD(_a->v.d, _a_stride, _b->v.d, _b_stride, _c->v.d, _c_stride, _d->v.d, _d_stride, _n);
640
+
641
+ return d;
642
+ }
643
+
644
+ // d[i] = (a[i] * b[i]) - c[i]
645
+ VALUE rb_double_vmsb(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE b_stride, VALUE c, VALUE c_stride, VALUE d, VALUE d_stride, VALUE n)
646
+ {
647
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
648
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
649
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
650
+ VdspArrayNativeResource *_d = get_vdsp_array_native_resource(d);
651
+
652
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
653
+ vDSP_Stride _b_stride = FIX2LONG(b_stride);
654
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
655
+ vDSP_Stride _d_stride = FIX2LONG(d_stride);
656
+ vDSP_Stride _n = FIX2LONG(n);
657
+
658
+ vDSP_vmsbD(_a->v.d, _a_stride, _b->v.d, _b_stride, _c->v.d, _c_stride, _d->v.d, _d_stride, _n);
659
+
660
+ return d;
661
+ }
662
+
663
+ // e[i] = (a[i] * b) + (c[i] * d)
664
+ VALUE rb_double_vsmsma(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE c, VALUE c_stride, VALUE d, VALUE e, VALUE e_stride, VALUE n)
665
+ {
666
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
667
+ double _b = NUM2DBL(b);
668
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
669
+ double _d = NUM2DBL(d);
670
+ VdspArrayNativeResource *_e = get_vdsp_array_native_resource(e);
671
+
672
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
673
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
674
+ vDSP_Stride _e_stride = FIX2LONG(e_stride);
675
+ vDSP_Stride _n = FIX2LONG(n);
676
+
677
+ vDSP_vsmsmaD(_a->v.d, _a_stride, &_b, _c->v.d, _c_stride, &_d, _e->v.d, _e_stride, _n);
678
+
679
+ return e;
680
+ }
681
+
682
+ // e[i] = (a[i] + b[i]) * (c[i] + d[i])
683
+ VALUE rb_double_vaam(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE b_stride, VALUE c, VALUE c_stride, VALUE d, VALUE d_stride, VALUE e, VALUE e_stride, VALUE n)
684
+ {
685
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
686
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
687
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
688
+ VdspArrayNativeResource *_d = get_vdsp_array_native_resource(d);
689
+ VdspArrayNativeResource *_e = get_vdsp_array_native_resource(e);
690
+
691
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
692
+ vDSP_Stride _b_stride = FIX2LONG(b_stride);
693
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
694
+ vDSP_Stride _d_stride = FIX2LONG(d_stride);
695
+ vDSP_Stride _e_stride = FIX2LONG(e_stride);
696
+ vDSP_Stride _n = FIX2LONG(n);
697
+
698
+ vDSP_vaamD(_a->v.d, _a_stride, _b->v.d, _b_stride, _c->v.d, _c_stride, _d->v.d, _d_stride, _e->v.d, _e_stride, _n);
699
+
700
+ return e;
701
+ }
702
+
703
+ // e[i] = (a[i] * b[i]) - (c[i] * d[i])
704
+ VALUE rb_double_vmmsb(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE b_stride, VALUE c, VALUE c_stride, VALUE d, VALUE d_stride, VALUE e, VALUE e_stride, VALUE n)
705
+ {
706
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
707
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
708
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
709
+ VdspArrayNativeResource *_d = get_vdsp_array_native_resource(d);
710
+ VdspArrayNativeResource *_e = get_vdsp_array_native_resource(e);
711
+
712
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
713
+ vDSP_Stride _b_stride = FIX2LONG(b_stride);
714
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
715
+ vDSP_Stride _d_stride = FIX2LONG(d_stride);
716
+ vDSP_Stride _e_stride = FIX2LONG(e_stride);
717
+ vDSP_Stride _n = FIX2LONG(n);
718
+
719
+ vDSP_vmmsbD(_a->v.d, _a_stride, _b->v.d, _b_stride, _c->v.d, _c_stride, _d->v.d, _d_stride, _e->v.d, _e_stride, _n);
720
+
721
+ return e;
722
+ }
723
+
724
+ // e[i] = (a[i] - b[i]) * (c[i] - d[i])
725
+ VALUE rb_double_vsbsbm(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE b_stride, VALUE c, VALUE c_stride, VALUE d, VALUE d_stride, VALUE e, VALUE e_stride, VALUE n)
726
+ {
727
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
728
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
729
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
730
+ VdspArrayNativeResource *_d = get_vdsp_array_native_resource(d);
731
+ VdspArrayNativeResource *_e = get_vdsp_array_native_resource(e);
732
+
733
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
734
+ vDSP_Stride _b_stride = FIX2LONG(b_stride);
735
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
736
+ vDSP_Stride _d_stride = FIX2LONG(d_stride);
737
+ vDSP_Stride _e_stride = FIX2LONG(e_stride);
738
+ vDSP_Stride _n = FIX2LONG(n);
739
+
740
+ vDSP_vsbsbmD(_a->v.d, _a_stride, _b->v.d, _b_stride, _c->v.d, _c_stride, _d->v.d, _d_stride, _e->v.d, _e_stride, _n);
741
+
742
+ return e;
743
+ }
744
+
745
+ // e[i] = (a[i] + b[i]) * (c[i] + d[i])
746
+ VALUE rb_double_vasbm(VALUE cls, VALUE a, VALUE a_stride, VALUE b, VALUE b_stride, VALUE c, VALUE c_stride, VALUE d, VALUE d_stride, VALUE e, VALUE e_stride, VALUE n)
747
+ {
748
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
749
+ VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
750
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
751
+ VdspArrayNativeResource *_d = get_vdsp_array_native_resource(d);
752
+ VdspArrayNativeResource *_e = get_vdsp_array_native_resource(e);
753
+
754
+ vDSP_Stride _a_stride = FIX2LONG(a_stride);
755
+ vDSP_Stride _b_stride = FIX2LONG(b_stride);
756
+ vDSP_Stride _c_stride = FIX2LONG(c_stride);
757
+ vDSP_Stride _d_stride = FIX2LONG(d_stride);
758
+ vDSP_Stride _e_stride = FIX2LONG(e_stride);
759
+ vDSP_Stride _n = FIX2LONG(n);
760
+
761
+ vDSP_vasbmD(_a->v.d, _a_stride, _b->v.d, _b_stride, _c->v.d, _c_stride, _d->v.d, _d_stride, _e->v.d, _e_stride, _n);
762
+
763
+ return e;
764
+ }
765
+
766
+
767
+ // Init
768
+
769
+ void Init_vdsp()
770
+ {
771
+ // Vdsp
772
+ rb_mVdsp = rb_define_module("Vdsp");
773
+
774
+ // Vdsp::Scalar
775
+ rb_mVdspScalar = rb_define_module_under(rb_mVdsp, "Scalar");
776
+
777
+ //Vdsp::DoubleScalar
778
+ rb_cDoubleScalar = rb_define_class_under(rb_mVdsp, "DoubleScalar", rb_cObject);
779
+ rb_include_module(rb_cDoubleScalar, rb_mVdspScalar);
780
+ rb_define_private_method(rb_cDoubleScalar, "initialize", rb_double_scalar_initialize, 1);
781
+ rb_define_method(rb_cDoubleScalar, "+", rb_double_scalar_plus, 1);
782
+ rb_define_method(rb_cDoubleScalar, "-", rb_double_scalar_minus, 1);
783
+ rb_define_method(rb_cDoubleScalar, "*", rb_double_scalar_mul, 1);
784
+ rb_define_method(rb_cDoubleScalar, "/", rb_double_scalar_div, 1);
785
+
786
+ // Vdsp::Array
787
+ rb_mVdspArray = rb_define_module_under(rb_mVdsp, "Array");
788
+ rb_define_method(rb_mVdspArray, "length", rb_vdsp_array_length, 0);
789
+ rb_define_alias(rb_mVdspArray, "size", "length");
790
+
791
+ // Vdsp::DoubleArray
792
+ rb_cDoubleArray = rb_define_class_under(rb_mVdsp, "DoubleArray", rb_cObject);
793
+ rb_include_module(rb_cDoubleArray, rb_mVdspArray);
794
+ rb_define_method(rb_cDoubleArray, "initialize", rb_double_array_initialize, 1);
795
+ rb_define_singleton_method(rb_cDoubleArray, "create", rb_double_array_create, 1);
796
+ rb_define_method(rb_cDoubleArray, "to_da", rb_double_array_to_da, 0);
797
+ rb_define_method(rb_cDoubleArray, "+", rb_double_array_plus, 1);
798
+ rb_define_method(rb_cDoubleArray, "-", rb_double_array_minus, 1);
799
+ rb_define_method(rb_cDoubleArray, "*", rb_double_array_mul, 1);
800
+ rb_define_method(rb_cDoubleArray, "/", rb_double_array_div, 1);
801
+ rb_define_method(rb_cDoubleArray, "[]", rb_double_array_aref, 1);
802
+ rb_define_method(rb_cDoubleArray, "[]=", rb_double_array_aset, 2);
803
+ rb_define_method(rb_cDoubleArray, "to_a", rb_double_array_get_values, 0);
804
+ rb_define_method(rb_cDoubleArray, "coerce", rb_double_array_coerce, 1);
805
+
806
+ // Vdsp::Double
807
+ rb_mDouble = rb_define_module_under(rb_mVdsp, "Double");
808
+
809
+ // Vector-based Arithmetic
810
+ rb_define_singleton_method(rb_mDouble, "vsadd", rb_double_vsadd, 6);
811
+ rb_define_singleton_method(rb_mDouble, "vadd", rb_double_vadd, 7);
812
+ rb_define_singleton_method(rb_mDouble, "vsub", rb_double_vsub, 7);
813
+ rb_define_singleton_method(rb_mDouble, "vsmul", rb_double_vsmul, 6);
814
+ rb_define_singleton_method(rb_mDouble, "vmul", rb_double_vmul, 7);
815
+ rb_define_singleton_method(rb_mDouble, "vsdiv", rb_double_vsdiv, 6);
816
+ rb_define_singleton_method(rb_mDouble, "svdiv", rb_double_svdiv, 6);
817
+ rb_define_singleton_method(rb_mDouble, "vaddsub", rb_double_vaddsub, 9);
818
+ rb_define_singleton_method(rb_mDouble, "vdiv", rb_double_vdiv, 7);
819
+ rb_define_singleton_method(rb_mDouble, "vasm", rb_double_vasm, 8);
820
+ rb_define_singleton_method(rb_mDouble, "vam", rb_double_vam, 9);
821
+ rb_define_singleton_method(rb_mDouble, "vsbsm", rb_double_vsbsm, 8);
822
+ rb_define_singleton_method(rb_mDouble, "vsbm", rb_double_vsbm, 9);
823
+ rb_define_singleton_method(rb_mDouble, "vmsa", rb_double_vmsa, 8);
824
+ rb_define_singleton_method(rb_mDouble, "vsma", rb_double_vsma, 8);
825
+ rb_define_singleton_method(rb_mDouble, "vma", rb_double_vma, 9);
826
+ rb_define_singleton_method(rb_mDouble, "vmsb", rb_double_vmsb, 9);
827
+ rb_define_singleton_method(rb_mDouble, "vsmsma", rb_double_vsmsma, 9);
828
+ rb_define_singleton_method(rb_mDouble, "vaam", rb_double_vaam, 11);
829
+ rb_define_singleton_method(rb_mDouble, "vmmsb", rb_double_vmmsb, 11);
830
+ rb_define_singleton_method(rb_mDouble, "vsbsbm", rb_double_vsbsbm, 11);
831
+ rb_define_singleton_method(rb_mDouble, "vasbm", rb_double_vasbm, 11);
832
+ }
data/ext/vdsp/vdsp.h ADDED
@@ -0,0 +1,17 @@
1
+ #include <ruby.h>
2
+ #include <Accelerate/Accelerate.h>
3
+
4
+ typedef union {
5
+ void *ptr;
6
+ double *d;
7
+ } VdspArrayValue;
8
+
9
+ typedef struct {
10
+ VdspArrayValue v;
11
+ unsigned long length;
12
+ } VdspArrayNativeResource;
13
+
14
+ extern VALUE rb_double_array_plus(VALUE self, VALUE other);
15
+ extern VALUE rb_double_array_mul(VALUE self, VALUE other);
16
+
17
+ extern void Init_vdsp();
@@ -0,0 +1,3 @@
1
+ module Vdsp
2
+ VERSION = "1.0.0"
3
+ end
data/lib/vdsp.rb ADDED
@@ -0,0 +1,7 @@
1
+ require "vdsp/version"
2
+ require "vdsp/vdsp"
3
+
4
+ module Vdsp
5
+ class Error < StandardError; end
6
+ # Your code goes here...
7
+ end
data/vdsp.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "vdsp/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "vdsp"
7
+ spec.version = Vdsp::VERSION
8
+ spec.authors = ["yoshida"]
9
+ spec.email = ["yoshida.eth0@gmail.com"]
10
+
11
+ spec.summary = %q{Perform basic arithmetic operations and common digital signal processing routines on large vectors.}
12
+ spec.description = %q{Perform basic arithmetic operations and common digital signal processing routines on large vectors.}
13
+ spec.homepage = "https://github.com/yoshida-eth0/ruby-vdsp"
14
+ spec.license = "MIT"
15
+
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = spec.homepage
18
+ spec.metadata["changelog_uri"] = spec.homepage
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ end
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+ spec.extensions = ["ext/vdsp/extconf.rb"]
29
+
30
+ spec.add_development_dependency "bundler", "~> 2.0"
31
+ spec.add_development_dependency "rake", "~> 10.0"
32
+ spec.add_development_dependency "rake-compiler"
33
+ spec.add_development_dependency "minitest", "~> 5.0"
34
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vdsp
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - yoshida
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-09-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake-compiler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5.0'
69
+ description: Perform basic arithmetic operations and common digital signal processing
70
+ routines on large vectors.
71
+ email:
72
+ - yoshida.eth0@gmail.com
73
+ executables: []
74
+ extensions:
75
+ - ext/vdsp/extconf.rb
76
+ extra_rdoc_files: []
77
+ files:
78
+ - ".gitignore"
79
+ - ".travis.yml"
80
+ - Gemfile
81
+ - LICENSE.txt
82
+ - README.md
83
+ - Rakefile
84
+ - bin/console
85
+ - bin/setup
86
+ - ext/vdsp/extconf.rb
87
+ - ext/vdsp/vdsp.c
88
+ - ext/vdsp/vdsp.h
89
+ - lib/vdsp.rb
90
+ - lib/vdsp/version.rb
91
+ - vdsp.gemspec
92
+ homepage: https://github.com/yoshida-eth0/ruby-vdsp
93
+ licenses:
94
+ - MIT
95
+ metadata:
96
+ homepage_uri: https://github.com/yoshida-eth0/ruby-vdsp
97
+ source_code_uri: https://github.com/yoshida-eth0/ruby-vdsp
98
+ changelog_uri: https://github.com/yoshida-eth0/ruby-vdsp
99
+ post_install_message:
100
+ rdoc_options: []
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ requirements: []
114
+ rubygems_version: 3.0.3
115
+ signing_key:
116
+ specification_version: 4
117
+ summary: Perform basic arithmetic operations and common digital signal processing
118
+ routines on large vectors.
119
+ test_files: []