vdsp 1.7.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
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