vdsp 1.7.0 → 1.8.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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/ext/vdsp/vdsp.c +156 -7
  3. data/lib/vdsp/version.rb +1 -1
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a7d5b3b75d47981cb01b082e4304dacee1c87426407f2220ff538cec98527aeb
4
- data.tar.gz: '08685f5360f114c1304095d510fb99d4b38fd02bdb70a0ce56e3e7ada8fbfc5c'
3
+ metadata.gz: 6a9bf55ee5ee1699cdd8b6c0ccba7b2a56de452e49a1baf748b446c80c3c2eae
4
+ data.tar.gz: a3c3fc40011f79420eec38be24a689db3648915a2fadba7c7e05c5013ec37e85
5
5
  SHA512:
6
- metadata.gz: 4bca3631c2a829a37884556680d79277eab141d9466f3423c70fd40f5b52c2aa47bbda821640eb5f93796901136c1cb5c1207509ee6e7d15c0b992b9ae3652f1
7
- data.tar.gz: aa8eeec7c10ff2f94396d600d24dfaf0375cae2d85bfc118c7b8a46bcf4685e2ce36ba116f9682bb4a94e7f635ef9f3529a08ec29e4e118bec2fa87dc209b264
6
+ metadata.gz: fad7199ff86511a3c3155ed0719fb9240a8fbce9b858694a15186c54b1aabe65a8537a4aa61715a883d7099a8e1321728d0e29f74bd3aa517022d98093dccc35
7
+ data.tar.gz: 22ef33d7cdb7fbb4dfb59333d58144b01dd0d9efc230eec3736dfa5d5967ed8baaeb14f8ff6f82c964bad5101ad8e8da1c9234bc1cf6b0c247a6ac0339c1ea58
data/ext/vdsp/vdsp.c CHANGED
@@ -423,6 +423,100 @@ VALUE rb_double_array_coerce(VALUE self, VALUE other)
423
423
  return rb_assoc_new(other, self);
424
424
  }
425
425
 
426
+ VALUE rb_double_array_slice(int argc, const VALUE *argv, VALUE self)
427
+ {
428
+ rb_check_arity(argc, 1, 2);
429
+
430
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(self);
431
+ long alen = _a->length;
432
+
433
+ long beg = 0;
434
+ long len = 0;
435
+
436
+ if (argc==2) {
437
+ beg = NUM2LONG(argv[0]);
438
+ len = NUM2LONG(argv[1]);
439
+ } else if (FIXNUM_P(argv[0])){
440
+ len = FIX2LONG(argv[0]);
441
+ } else {
442
+ switch (rb_range_beg_len(argv[0], &beg, &len, alen, 0)) {
443
+ case Qfalse:
444
+ case Qnil:
445
+ return Qnil;
446
+ default:
447
+ break;
448
+ }
449
+ }
450
+
451
+ if (beg > alen) return Qnil;
452
+ if (beg < 0 || len < 0) return Qnil;
453
+
454
+ if (alen < len || alen < beg + len) {
455
+ len = alen - beg;
456
+ }
457
+
458
+ VALUE lenv = LONG2NUM(len);
459
+ VALUE c = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
460
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
461
+ memcpy(_c->v.d, _a->v.d+beg, sizeof(double) * len);
462
+
463
+ return c;
464
+ }
465
+
466
+ void double_array_resize(VdspArrayNativeResource *_a, unsigned long len)
467
+ {
468
+ if (_a->length!=len) {
469
+ void *new_v = realloc(_a->v.ptr, (_a->length + len) * sizeof(double));
470
+ if (!new_v) {
471
+ rb_raise(rb_eRuntimeError, "memory allocation error");
472
+ }
473
+ _a->v.ptr = new_v;
474
+
475
+ if (_a->length<len) {
476
+ memset(_a->v.d+_a->length, 0, (len-_a->length) * sizeof(double));
477
+ }
478
+ }
479
+ }
480
+
481
+ VALUE rb_double_array_resize(VALUE self, VALUE size)
482
+ {
483
+ unsigned long len = NUM2LONG(size);
484
+
485
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(self);
486
+ double_array_resize(_a, len);
487
+ _a->length = len;
488
+
489
+ return self;
490
+ }
491
+
492
+ VALUE rb_double_array_concat(int argc, const VALUE *argv, VALUE self)
493
+ {
494
+ rb_check_frozen(self);
495
+
496
+ VdspArrayNativeResource *_a = get_vdsp_array_native_resource(self);
497
+ VdspArrayNativeResource *_argv[argc];
498
+
499
+ unsigned long len = _a->length;
500
+ unsigned long new_len = len;
501
+ for (long i=0; i<argc; i++) {
502
+ VALUE arg = rb_funcall(argv[i], rb_intern("to_da"), 0);
503
+ _argv[i] = get_vdsp_array_native_resource(arg);
504
+ new_len += _argv[i]->length;
505
+ }
506
+
507
+ double_array_resize(_a, new_len);
508
+
509
+ new_len = len;
510
+ for (long i=0; i<argc; i++) {
511
+ VdspArrayNativeResource *_b = _argv[i];
512
+ memcpy(_a->v.d+new_len, _b->v.d, _b->length * sizeof(double));
513
+ new_len += _b->length;
514
+ }
515
+ _a->length = new_len;
516
+
517
+ return self;
518
+ }
519
+
426
520
  VALUE rb_double_array_abs(VALUE self)
427
521
  {
428
522
  VdspArrayNativeResource *_a = get_vdsp_array_native_resource(self);
@@ -517,7 +611,7 @@ VALUE rb_double_array_vgen(VALUE cls, VALUE a, VALUE b, VALUE n)
517
611
  return c;
518
612
  }
519
613
 
520
- VALUE rb_double_array_blkman_window(int argc, VALUE *argv, VALUE cls)
614
+ VALUE rb_double_array_blkman_window(int argc, const VALUE *argv, VALUE cls)
521
615
  {
522
616
  if (argc<1 || 2<argc) {
523
617
  rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 1..2)", argc);
@@ -538,7 +632,7 @@ VALUE rb_double_array_blkman_window(int argc, VALUE *argv, VALUE cls)
538
632
  return c;
539
633
  }
540
634
 
541
- VALUE rb_double_array_hamm_window(int argc, VALUE *argv, VALUE cls)
635
+ VALUE rb_double_array_hamm_window(int argc, const VALUE *argv, VALUE cls)
542
636
  {
543
637
  if (argc<1 || 2<argc) {
544
638
  rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 1..2)", argc);
@@ -559,7 +653,7 @@ VALUE rb_double_array_hamm_window(int argc, VALUE *argv, VALUE cls)
559
653
  return c;
560
654
  }
561
655
 
562
- VALUE rb_double_array_hann_window(int argc, VALUE *argv, VALUE cls)
656
+ VALUE rb_double_array_hann_window(int argc, const VALUE *argv, VALUE cls)
563
657
  {
564
658
  if (argc<1 || 2<argc) {
565
659
  rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 1..2)", argc);
@@ -1364,7 +1458,7 @@ VALUE rb_double_vsmsma(
1364
1458
  }
1365
1459
 
1366
1460
  // e[i] = (a[i] + b[i]) * (c[i] + d[i])
1367
- VALUE rb_double_vaam(int argc, VALUE *argv, VALUE cls)
1461
+ VALUE rb_double_vaam(int argc, const VALUE *argv, VALUE cls)
1368
1462
  {
1369
1463
  if (argc!=16) {
1370
1464
  rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 16)", argc);
@@ -1412,7 +1506,7 @@ VALUE rb_double_vaam(int argc, VALUE *argv, VALUE cls)
1412
1506
  }
1413
1507
 
1414
1508
  // e[i] = (a[i] * b[i]) - (c[i] * d[i])
1415
- VALUE rb_double_vmmsb(int argc, VALUE *argv, VALUE cls)
1509
+ VALUE rb_double_vmmsb(int argc, const VALUE *argv, VALUE cls)
1416
1510
  {
1417
1511
  if (argc!=16) {
1418
1512
  rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 16)", argc);
@@ -1460,7 +1554,7 @@ VALUE rb_double_vmmsb(int argc, VALUE *argv, VALUE cls)
1460
1554
  }
1461
1555
 
1462
1556
  // e[i] = (a[i] - b[i]) * (c[i] - d[i])
1463
- VALUE rb_double_vsbsbm(int argc, VALUE *argv, VALUE cls)
1557
+ VALUE rb_double_vsbsbm(int argc, const VALUE *argv, VALUE cls)
1464
1558
  {
1465
1559
  if (argc!=16) {
1466
1560
  rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 16)", argc);
@@ -1508,7 +1602,7 @@ VALUE rb_double_vsbsbm(int argc, VALUE *argv, VALUE cls)
1508
1602
  }
1509
1603
 
1510
1604
  // e[i] = (a[i] + b[i]) * (c[i] - d[i])
1511
- VALUE rb_double_vasbm(int argc, VALUE *argv, VALUE cls)
1605
+ VALUE rb_double_vasbm(int argc, const VALUE *argv, VALUE cls)
1512
1606
  {
1513
1607
  if (argc!=16) {
1514
1608
  rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 16)", argc);
@@ -2141,6 +2235,54 @@ VALUE rb_double_svs(
2141
2235
  return DBL2NUM(_c);
2142
2236
  }
2143
2237
 
2238
+ VALUE rb_double_vswap(
2239
+ VALUE cls,
2240
+ VALUE a, VALUE a_offset, VALUE a_stride,
2241
+ VALUE b, VALUE b_offset, VALUE b_stride,
2242
+ VALUE n)
2243
+ {
2244
+ VdspArrayParam _a;
2245
+ VdspArrayParam _b;
2246
+
2247
+ array_param(&_a, a, a_offset, a_stride);
2248
+ array_param(&_b, b, b_offset, b_stride);
2249
+ vDSP_Length _n = NUM2LONG(n);
2250
+
2251
+ vDSP_vswapD(
2252
+ _a.res0->v.d+_a.offset, _a.stride,
2253
+ _b.res0->v.d+_b.offset, _b.stride,
2254
+ _n
2255
+ );
2256
+
2257
+ return rb_ary_new3(2, a, b);
2258
+ }
2259
+
2260
+ VALUE rb_double_vtmerg(
2261
+ VALUE cls,
2262
+ VALUE a, VALUE a_offset, VALUE a_stride,
2263
+ VALUE b, VALUE b_offset, VALUE b_stride,
2264
+ VALUE c, VALUE c_offset, VALUE c_stride,
2265
+ VALUE n)
2266
+ {
2267
+ VdspArrayParam _a;
2268
+ VdspArrayParam _b;
2269
+ VdspArrayParam _c;
2270
+
2271
+ array_param(&_a, a, a_offset, a_stride);
2272
+ array_param(&_b, b, b_offset, b_stride);
2273
+ array_param(&_c, c, c_offset, c_stride);
2274
+ vDSP_Length _n = NUM2LONG(n);
2275
+
2276
+ vDSP_vtmergD(
2277
+ _a.res0->v.d+_a.offset, _a.stride,
2278
+ _b.res0->v.d+_b.offset, _b.stride,
2279
+ _c.res0->v.d+_c.offset, _c.stride,
2280
+ _n
2281
+ );
2282
+
2283
+ return c;
2284
+ }
2285
+
2144
2286
  VALUE rb_double_biquad(
2145
2287
  VALUE cls,
2146
2288
  VALUE biquad,
@@ -2460,6 +2602,9 @@ void Init_vdsp()
2460
2602
  rb_define_method(rb_cDoubleArray, "each", rb_double_array_each, 0);
2461
2603
  rb_define_method(rb_cDoubleArray, "to_a", rb_double_array_get_values, 0);
2462
2604
  rb_define_method(rb_cDoubleArray, "coerce", rb_double_array_coerce, 1);
2605
+ rb_define_method(rb_cDoubleArray, "slice", rb_double_array_slice, -1);
2606
+ rb_define_method(rb_cDoubleArray, "resize", rb_double_array_resize, 1);
2607
+ rb_define_method(rb_cDoubleArray, "concat", rb_double_array_concat, -1);
2463
2608
  rb_define_method(rb_cDoubleArray, "abs", rb_double_array_abs, 0);
2464
2609
  rb_define_method(rb_cDoubleArray, "abs!", rb_double_array_abs_bang, 0);
2465
2610
  rb_define_method(rb_cDoubleArray, "nabs", rb_double_array_nabs, 0);
@@ -2578,6 +2723,10 @@ void Init_vdsp()
2578
2723
  rb_define_singleton_method(rb_mUnsafeDouble, "sve_svesq", rb_double_sve_svesq, 4);
2579
2724
  rb_define_singleton_method(rb_mUnsafeDouble, "svs", rb_double_svs, 4);
2580
2725
 
2726
+ // Vdsp::UnsafeDouble Copying, Element Swapping, and Merging Functions
2727
+ rb_define_singleton_method(rb_mUnsafeDouble, "vswap", rb_double_vswap, 7);
2728
+ rb_define_singleton_method(rb_mUnsafeDouble, "vtmerg", rb_double_vtmerg, 10);
2729
+
2581
2730
  // Vdsp::UnsafeDouble Biquadratic IIR Filters
2582
2731
  rb_define_singleton_method(rb_mUnsafeDouble, "biquad", rb_double_biquad, 8);
2583
2732
 
data/lib/vdsp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Vdsp
2
- VERSION = "1.7.0"
2
+ VERSION = "1.8.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vdsp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yoshida Tetsuya
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-07 00:00:00.000000000 Z
11
+ date: 2019-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler