vdsp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +39 -0
- data/Rakefile +18 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/ext/vdsp/extconf.rb +3 -0
- data/ext/vdsp/vdsp.c +832 -0
- data/ext/vdsp/vdsp.h +17 -0
- data/lib/vdsp/version.rb +3 -0
- data/lib/vdsp.rb +7 -0
- data/vdsp.gemspec +34 -0
- metadata +119 -0
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
data/.travis.yml
ADDED
data/Gemfile
ADDED
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
data/ext/vdsp/extconf.rb
ADDED
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();
|
data/lib/vdsp/version.rb
ADDED
data/lib/vdsp.rb
ADDED
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: []
|