vdsp 1.0.0 → 1.1.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.
data/ext/vdsp/vdsp.c CHANGED
@@ -8,7 +8,7 @@ VALUE rb_mVdspArray;
8
8
 
9
9
  VALUE rb_cDoubleScalar;
10
10
  VALUE rb_cDoubleArray;
11
- VALUE rb_mDouble;
11
+ VALUE rb_mUnsafeDouble;
12
12
 
13
13
 
14
14
  // Native resource
@@ -23,6 +23,10 @@ void vdsp_array_native_resource_delete(VdspArrayNativeResource * p)
23
23
 
24
24
  VdspArrayNativeResource* get_vdsp_array_native_resource(VALUE va)
25
25
  {
26
+ if (!rb_obj_is_kind_of(va, rb_mVdspArray)) {
27
+ rb_raise(rb_eArgError, "Vdsp::Array required");
28
+ }
29
+
26
30
  VALUE resource = rb_iv_get(va, "native_resource");
27
31
  if (resource==Qnil) {
28
32
  return NULL;
@@ -51,6 +55,21 @@ long get_vdsp_array_length(VALUE va)
51
55
  return _a->length;
52
56
  }
53
57
 
58
+ void array_param(VdspArrayParam *param, VALUE arr0, VALUE offset, VALUE stride)
59
+ {
60
+ param->res0 = get_vdsp_array_native_resource(arr0);
61
+ param->offset = NUM2LONG(offset);
62
+ param->stride = NUM2LONG(stride);
63
+ }
64
+
65
+ void array_param2(VdspArrayParam *param, VALUE arr0, VALUE arr1, VALUE offset, VALUE stride)
66
+ {
67
+ param->res0 = get_vdsp_array_native_resource(arr0);
68
+ param->res1 = get_vdsp_array_native_resource(arr1);
69
+ param->offset = NUM2LONG(offset);
70
+ param->stride = NUM2LONG(stride);
71
+ }
72
+
54
73
 
55
74
  // Vdsp::DoubleScalar
56
75
 
@@ -357,410 +376,1075 @@ VALUE rb_double_array_coerce(VALUE self, VALUE other)
357
376
  return rb_assoc_new(other, self);
358
377
  }
359
378
 
379
+ VALUE rb_double_array_vramp(VALUE cls, VALUE a, VALUE b, VALUE n)
380
+ {
381
+ double _a = NUM2DBL(a);
382
+ double _b = NUM2DBL(b);
383
+ vDSP_Length _n = NUM2LONG(n);
384
+
385
+ VALUE c = rb_class_new_instance(1, &n, rb_cDoubleArray);
386
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
387
+
388
+ vDSP_vrampD(&_a, &_b, _c->v.d, 1, _n);
389
+
390
+ return c;
391
+ }
392
+
393
+ VALUE rb_double_array_vgen(VALUE cls, VALUE a, VALUE b, VALUE n)
394
+ {
395
+ double _a = NUM2DBL(a);
396
+ double _b = NUM2DBL(b);
397
+ vDSP_Length _n = NUM2LONG(n);
398
+
399
+ VALUE c = rb_class_new_instance(1, &n, rb_cDoubleArray);
400
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
401
+
402
+ vDSP_vgenD(&_a, &_b, _c->v.d, 1, _n);
403
+
404
+ return c;
405
+ }
406
+
407
+ VALUE rb_double_array_blkman_window(int argc, VALUE *argv, VALUE cls)
408
+ {
409
+ if (argc<1 || 2<argc) {
410
+ rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 1..2)", argc);
411
+ }
412
+ VALUE n = argv[0];
413
+
414
+ vDSP_Length _n = NUM2LONG(n);
415
+ int flag = 0;
416
+ if (argc==2) {
417
+ flag = (int)NUM2LONG(argv[1]);
418
+ }
419
+
420
+ VALUE c = rb_class_new_instance(1, &n, rb_cDoubleArray);
421
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
422
+
423
+ vDSP_blkman_windowD(_c->v.d, _n, flag);
424
+
425
+ return c;
426
+ }
427
+
428
+ VALUE rb_double_array_hamm_window(int argc, VALUE *argv, VALUE cls)
429
+ {
430
+ if (argc<1 || 2<argc) {
431
+ rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 1..2)", argc);
432
+ }
433
+ VALUE n = argv[0];
434
+
435
+ vDSP_Length _n = NUM2LONG(n);
436
+ int flag = 0;
437
+ if (argc==2) {
438
+ flag = (int)NUM2LONG(argv[1]);
439
+ }
440
+
441
+ VALUE c = rb_class_new_instance(1, &n, rb_cDoubleArray);
442
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
443
+
444
+ vDSP_hamm_windowD(_c->v.d, _n, flag);
445
+
446
+ return c;
447
+ }
448
+
449
+ VALUE rb_double_array_hann_window(int argc, VALUE *argv, VALUE cls)
450
+ {
451
+ if (argc<1 || 2<argc) {
452
+ rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 1..2)", argc);
453
+ }
454
+ VALUE n = argv[0];
455
+
456
+ vDSP_Length _n = NUM2LONG(n);
457
+ int flag = 0;
458
+ if (argc==2) {
459
+ flag = (int)NUM2LONG(argv[1]);
460
+ }
461
+
462
+ VALUE c = rb_class_new_instance(1, &n, rb_cDoubleArray);
463
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
464
+
465
+ vDSP_hann_windowD(_c->v.d, _n, flag);
466
+
467
+ return c;
468
+ }
469
+
360
470
 
361
471
  // Vdsp static method
362
472
 
363
473
  // 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)
474
+ VALUE rb_double_vsadd(
475
+ VALUE cls,
476
+ VALUE a, VALUE a_offset, VALUE a_stride,
477
+ VALUE b,
478
+ VALUE c, VALUE c_offset, VALUE c_stride,
479
+ VALUE n)
365
480
  {
366
- VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
481
+ VdspArrayParam _a;
482
+ VdspArrayParam _c;
483
+
484
+ array_param(&_a, a, a_offset, a_stride);
367
485
  double _b = NUM2DBL(b);
368
- VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
486
+ array_param(&_c, c, c_offset, c_stride);
369
487
 
370
- vDSP_Stride _a_stride = FIX2LONG(a_stride);
371
- vDSP_Stride _c_stride = FIX2LONG(c_stride);
372
- vDSP_Stride _n = FIX2LONG(n);
488
+ vDSP_Stride _n = NUM2LONG(n);
373
489
 
374
- vDSP_vsaddD(_a->v.d, _a_stride, &_b, _c->v.d, _c_stride, _n);
490
+ vDSP_vsaddD(
491
+ _a.res0->v.d+_a.offset, _a.stride,
492
+ &_b,
493
+ _c.res0->v.d+_c.offset, _c.stride,
494
+ _n);
375
495
 
376
496
  return c;
377
497
  }
378
498
 
379
499
  // 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)
500
+ VALUE rb_double_vadd(
501
+ VALUE cls,
502
+ VALUE a, VALUE a_offset, VALUE a_stride,
503
+ VALUE b, VALUE b_offset, VALUE b_stride,
504
+ VALUE c, VALUE c_offset, VALUE c_stride,
505
+ VALUE n)
381
506
  {
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);
507
+ VdspArrayParam _a;
508
+ VdspArrayParam _b;
509
+ VdspArrayParam _c;
510
+
511
+ array_param(&_a, a, a_offset, a_stride);
512
+ array_param(&_b, b, b_offset, b_stride);
513
+ array_param(&_c, c, c_offset, c_stride);
385
514
 
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);
515
+ vDSP_Stride _n = NUM2LONG(n);
390
516
 
391
- vDSP_vaddD(_a->v.d, _a_stride, _b->v.d, _b_stride, _c->v.d, _c_stride, _n);
517
+ vDSP_vaddD(
518
+ _a.res0->v.d+_a.offset, _a.stride,
519
+ _b.res0->v.d+_b.offset, _b.stride,
520
+ _c.res0->v.d+_c.offset, _c.stride,
521
+ _n);
392
522
 
393
523
  return c;
394
524
  }
395
525
 
396
526
  // 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)
527
+ VALUE rb_double_vsub(
528
+ VALUE cls,
529
+ VALUE b, VALUE b_offset, VALUE b_stride,
530
+ VALUE a, VALUE a_offset, VALUE a_stride,
531
+ VALUE c, VALUE c_offset, VALUE c_stride,
532
+ VALUE n)
398
533
  {
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);
534
+ VdspArrayParam _b;
535
+ VdspArrayParam _a;
536
+ VdspArrayParam _c;
402
537
 
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);
538
+ array_param(&_b, b, b_offset, b_stride);
539
+ array_param(&_a, a, a_offset, a_stride);
540
+ array_param(&_c, c, c_offset, c_stride);
541
+ vDSP_Stride _n = NUM2LONG(n);
407
542
 
408
- vDSP_vsubD(_b->v.d, _b_stride, _a->v.d, _a_stride, _c->v.d, _c_stride, _n);
543
+ vDSP_vsubD(
544
+ _b.res0->v.d+_b.offset, _b.stride,
545
+ _a.res0->v.d+_a.offset, _a.stride,
546
+ _c.res0->v.d+_c.offset, _c.stride,
547
+ _n);
409
548
 
410
549
  return c;
411
550
  }
412
551
 
413
552
  // 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)
553
+ VALUE rb_double_vsmul(
554
+ VALUE cls,
555
+ VALUE a, VALUE a_offset, VALUE a_stride,
556
+ VALUE b,
557
+ VALUE c, VALUE c_offset, VALUE c_stride,
558
+ VALUE n)
415
559
  {
416
- VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
560
+ VdspArrayParam _a;
561
+ VdspArrayParam _c;
562
+
563
+ array_param(&_a, a, a_offset, a_stride);
417
564
  double _b = NUM2DBL(b);
418
- VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
565
+ array_param(&_c, c, c_offset, c_stride);
419
566
 
420
- vDSP_Stride _a_stride = FIX2LONG(a_stride);
421
- vDSP_Stride _c_stride = FIX2LONG(c_stride);
422
- vDSP_Stride _n = FIX2LONG(n);
567
+ vDSP_Stride _n = NUM2LONG(n);
423
568
 
424
- vDSP_vsmulD(_a->v.d, _a_stride, &_b, _c->v.d, _c_stride, _n);
569
+ vDSP_vsmulD(
570
+ _a.res0->v.d+_a.offset, _a.stride,
571
+ &_b,
572
+ _c.res0->v.d+_c.offset, _c.stride,
573
+ _n);
425
574
 
426
575
  return c;
427
576
  }
428
577
 
429
578
  // 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)
579
+ VALUE rb_double_vmul(
580
+ VALUE cls,
581
+ VALUE a, VALUE a_offset, VALUE a_stride,
582
+ VALUE b, VALUE b_offset, VALUE b_stride,
583
+ VALUE c, VALUE c_offset, VALUE c_stride,
584
+ VALUE n)
431
585
  {
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);
586
+ VdspArrayParam _a;
587
+ VdspArrayParam _b;
588
+ VdspArrayParam _c;
435
589
 
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);
590
+ array_param(&_a, a, a_offset, a_stride);
591
+ array_param(&_b, b, b_offset, b_stride);
592
+ array_param(&_c, c, c_offset, c_stride);
440
593
 
441
- vDSP_vmulD(_a->v.d, _a_stride, _b->v.d, _b_stride, _c->v.d, _c_stride, _n);
594
+ vDSP_Stride _n = NUM2LONG(n);
595
+
596
+ vDSP_vmulD(
597
+ _a.res0->v.d+_a.offset, _a.stride,
598
+ _b.res0->v.d+_b.offset, _b.stride,
599
+ _c.res0->v.d+_c.offset, _c.stride,
600
+ _n);
442
601
 
443
602
  return c;
444
603
  }
445
604
 
446
605
  // 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)
606
+ VALUE rb_double_vsdiv(
607
+ VALUE cls,
608
+ VALUE a, VALUE a_offset, VALUE a_stride,
609
+ VALUE b,
610
+ VALUE c, VALUE c_offset, VALUE c_stride,
611
+ VALUE n)
448
612
  {
449
- VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
613
+ VdspArrayParam _a;
614
+ VdspArrayParam _c;
615
+
616
+ array_param(&_a, a, a_offset, a_stride);
450
617
  double _b = NUM2DBL(b);
451
- VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
618
+ array_param(&_c, c, c_offset, c_stride);
452
619
 
453
- vDSP_Stride _a_stride = FIX2LONG(a_stride);
454
- vDSP_Stride _c_stride = FIX2LONG(c_stride);
455
- vDSP_Stride _n = FIX2LONG(n);
620
+ vDSP_Stride _n = NUM2LONG(n);
456
621
 
457
- vDSP_vsdivD(_a->v.d, _a_stride, &_b, _c->v.d, _c_stride, _n);
622
+ vDSP_vsdivD(
623
+ _a.res0->v.d+_a.offset, _a.stride,
624
+ &_b,
625
+ _c.res0->v.d+_c.offset, _c.stride,
626
+ _n);
458
627
 
459
628
  return c;
460
629
  }
461
630
 
462
631
  // 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)
632
+ VALUE rb_double_svdiv(
633
+ VALUE cls,
634
+ VALUE a,
635
+ VALUE b, VALUE b_offset, VALUE b_stride,
636
+ VALUE c, VALUE c_offset, VALUE c_stride,
637
+ VALUE n)
464
638
  {
639
+ VdspArrayParam _b;
640
+ VdspArrayParam _c;
641
+
465
642
  double _a = NUM2DBL(a);
466
- VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
467
- VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
643
+ array_param(&_b, b, b_offset, b_stride);
644
+ array_param(&_c, c, c_offset, c_stride);
468
645
 
469
- vDSP_Stride _b_stride = FIX2LONG(b_stride);
470
- vDSP_Stride _c_stride = FIX2LONG(c_stride);
471
- vDSP_Stride _n = FIX2LONG(n);
646
+ vDSP_Stride _n = NUM2LONG(n);
472
647
 
473
- vDSP_svdivD(&_a, _b->v.d, _b_stride, _c->v.d, _c_stride, _n);
648
+ vDSP_svdivD(
649
+ &_a,
650
+ _b.res0->v.d+_b.offset, _b.stride,
651
+ _c.res0->v.d+_c.offset, _c.stride,
652
+ _n);
474
653
 
475
654
  return c;
476
655
  }
477
656
 
478
657
  // o0[i] = i1[i] + i0[i]
479
658
  // 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)
659
+ VALUE rb_double_vaddsub(
660
+ VALUE cls,
661
+ VALUE i0, VALUE i0_offset, VALUE i0_stride,
662
+ VALUE i1, VALUE i1_offset, VALUE i1_stride,
663
+ VALUE o0, VALUE o0_offset, VALUE o0_stride,
664
+ VALUE o1, VALUE o1_offset, VALUE o1_stride,
665
+ VALUE n)
481
666
  {
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);
667
+ VdspArrayParam _i0;
668
+ VdspArrayParam _i1;
669
+ VdspArrayParam _o0;
670
+ VdspArrayParam _o1;
671
+
672
+ array_param(&_i0, i0, i0_offset, i0_stride);
673
+ array_param(&_i1, i1, i1_offset, i1_stride);
674
+ array_param(&_o0, o0, o0_offset, o0_stride);
675
+ array_param(&_o1, o1, o1_offset, o1_stride);
486
676
 
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);
677
+ vDSP_Stride _n = NUM2LONG(n);
492
678
 
493
- vDSP_vaddsubD(_i0->v.d, _i0_stride, _i1->v.d, _i1_stride, _o0->v.d, _o0_stride, _o1->v.d, _o1_stride, _n);
679
+ vDSP_vaddsubD(
680
+ _i0.res0->v.d+_i0.offset, _i0.stride,
681
+ _i1.res0->v.d+_i1.offset, _i1.stride,
682
+ _o0.res0->v.d+_o0.offset, _o0.stride,
683
+ _o1.res0->v.d+_o1.offset, _o1.stride,
684
+ _n);
494
685
 
495
686
  return rb_assoc_new(o0, o1);
496
687
  }
497
688
 
498
689
  // 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)
690
+ VALUE rb_double_vdiv(
691
+ VALUE cls,
692
+ VALUE b, VALUE b_offset, VALUE b_stride,
693
+ VALUE a, VALUE a_offset, VALUE a_stride,
694
+ VALUE c, VALUE c_offset, VALUE c_stride,
695
+ VALUE n)
500
696
  {
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);
697
+ VdspArrayParam _b;
698
+ VdspArrayParam _a;
699
+ VdspArrayParam _c;
700
+
701
+ array_param(&_b, b, b_offset, b_stride);
702
+ array_param(&_a, a, a_offset, a_stride);
703
+ array_param(&_c, c, c_offset, c_stride);
504
704
 
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);
705
+ vDSP_Stride _n = NUM2LONG(n);
509
706
 
510
- vDSP_vdivD(_b->v.d, _b_stride, _a->v.d, _a_stride, _c->v.d, _c_stride, _n);
707
+ vDSP_vdivD(
708
+ _b.res0->v.d+_b.offset, _c.stride,
709
+ _a.res0->v.d+_a.offset, _a.stride,
710
+ _c.res0->v.d+_c.offset, _c.stride,
711
+ _n);
511
712
 
512
713
  return c;
513
714
  }
514
715
 
515
716
  // 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)
717
+ VALUE rb_double_vasm(
718
+ VALUE cls,
719
+ VALUE a, VALUE a_offset, VALUE a_stride,
720
+ VALUE b, VALUE b_offset, VALUE b_stride,
721
+ VALUE c,
722
+ VALUE d, VALUE d_offset, VALUE d_stride,
723
+ VALUE n)
517
724
  {
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);
725
+ VdspArrayParam _a;
726
+ VdspArrayParam _b;
727
+ VdspArrayParam _d;
728
+
729
+ array_param(&_a, a, a_offset, a_stride);
730
+ array_param(&_b, b, b_offset, b_stride);
731
+ double _c = NUM2DBL(c);
732
+ array_param(&_d, d, d_offset, d_stride);
522
733
 
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);
734
+ vDSP_Stride _n = NUM2LONG(n);
527
735
 
528
- vDSP_vasmD(_a->v.d, _a_stride, _b->v.d, _b_stride, &_c, _d->v.d, _d_stride, _n);
736
+ vDSP_vasmD(
737
+ _a.res0->v.d+_a.offset, _a.stride,
738
+ _b.res0->v.d+_b.offset, _b.stride,
739
+ &_c,
740
+ _d.res0->v.d+_d.offset, _d.stride,
741
+ _n);
529
742
 
530
743
  return d;
531
744
  }
532
745
 
533
746
  // 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)
747
+ VALUE rb_double_vam(
748
+ VALUE cls,
749
+ VALUE a, VALUE a_offset, VALUE a_stride,
750
+ VALUE b, VALUE b_offset, VALUE b_stride,
751
+ VALUE c, VALUE c_offset, VALUE c_stride,
752
+ VALUE d, VALUE d_offset, VALUE d_stride,
753
+ VALUE n)
535
754
  {
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);
755
+ VdspArrayParam _a;
756
+ VdspArrayParam _b;
757
+ VdspArrayParam _c;
758
+ VdspArrayParam _d;
759
+
760
+ array_param(&_a, a, a_offset, a_stride);
761
+ array_param(&_b, b, b_offset, b_stride);
762
+ array_param(&_c, c, c_offset, c_stride);
763
+ array_param(&_d, d, d_offset, d_stride);
540
764
 
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);
765
+ vDSP_Stride _n = NUM2LONG(n);
546
766
 
547
- vDSP_vamD(_a->v.d, _a_stride, _b->v.d, _b_stride, _c->v.d, _c_stride, _d->v.d, _d_stride, _n);
767
+ vDSP_vamD(
768
+ _a.res0->v.d+_a.offset, _a.stride,
769
+ _b.res0->v.d+_b.offset, _c.stride,
770
+ _c.res0->v.d+_c.offset, _c.stride,
771
+ _d.res0->v.d+_d.offset, _d.stride,
772
+ _n);
548
773
 
549
774
  return d;
550
775
  }
551
776
 
552
777
  // 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)
778
+ VALUE rb_double_vsbsm(
779
+ VALUE cls,
780
+ VALUE a, VALUE a_offset, VALUE a_stride,
781
+ VALUE b, VALUE b_offset, VALUE b_stride,
782
+ VALUE c,
783
+ VALUE d, VALUE d_offset, VALUE d_stride,
784
+ VALUE n)
554
785
  {
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);
786
+ VdspArrayParam _a;
787
+ VdspArrayParam _b;
788
+ VdspArrayParam _d;
789
+
790
+ array_param(&_a, a, a_offset, a_stride);
791
+ array_param(&_b, b, b_offset, b_stride);
792
+ double _c = NUM2DBL(c);
793
+ array_param(&_d, d, d_offset, d_stride);
559
794
 
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);
795
+ vDSP_Stride _n = NUM2LONG(n);
564
796
 
565
- vDSP_vsbsmD(_a->v.d, _a_stride, _b->v.d, _b_stride, &_c, _d->v.d, _d_stride, _n);
797
+ vDSP_vsbsmD(
798
+ _a.res0->v.d+_a.offset, _a.stride,
799
+ _b.res0->v.d+_b.offset, _b.stride,
800
+ &_c,
801
+ _d.res0->v.d+_d.offset, _d.stride,
802
+ _n);
566
803
 
567
804
  return d;
568
805
  }
569
806
 
570
807
  // 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)
808
+ VALUE rb_double_vsbm(
809
+ VALUE cls,
810
+ VALUE a, VALUE a_offset, VALUE a_stride,
811
+ VALUE b, VALUE b_offset, VALUE b_stride,
812
+ VALUE c, VALUE c_offset, VALUE c_stride,
813
+ VALUE d, VALUE d_offset, VALUE d_stride,
814
+ VALUE n)
572
815
  {
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);
816
+ VdspArrayParam _a;
817
+ VdspArrayParam _b;
818
+ VdspArrayParam _c;
819
+ VdspArrayParam _d;
820
+
821
+ array_param(&_a, a, a_offset, a_stride);
822
+ array_param(&_b, b, b_offset, b_stride);
823
+ array_param(&_c, c, c_offset, c_stride);
824
+ array_param(&_d, d, d_offset, d_stride);
577
825
 
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);
826
+ vDSP_Stride _n = NUM2LONG(n);
583
827
 
584
- vDSP_vsbmD(_a->v.d, _a_stride, _b->v.d, _b_stride, _c->v.d, _c_stride, _d->v.d, _d_stride, _n);
828
+ vDSP_vsbmD(
829
+ _a.res0->v.d+_a.offset, _a.stride,
830
+ _b.res0->v.d+_b.offset, _c.stride,
831
+ _c.res0->v.d+_c.offset, _c.stride,
832
+ _d.res0->v.d+_d.offset, _d.stride,
833
+ _n);
585
834
 
586
835
  return d;
587
836
  }
588
837
 
589
838
  // 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)
839
+ VALUE rb_double_vmsa(
840
+ VALUE cls,
841
+ VALUE a, VALUE a_offset, VALUE a_stride,
842
+ VALUE b, VALUE b_offset, VALUE b_stride,
843
+ VALUE c,
844
+ VALUE d, VALUE d_offset, VALUE d_stride,
845
+ VALUE n)
591
846
  {
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);
847
+ VdspArrayParam _a;
848
+ VdspArrayParam _b;
849
+ VdspArrayParam _d;
850
+
851
+ array_param(&_a, a, a_offset, a_stride);
852
+ array_param(&_b, b, b_offset, b_stride);
853
+ double _c = NUM2DBL(c);
854
+ array_param(&_d, d, d_offset, d_stride);
596
855
 
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);
856
+ vDSP_Stride _n = NUM2LONG(n);
601
857
 
602
- vDSP_vmsaD(_a->v.d, _a_stride, _b->v.d, _b_stride, &_c, _d->v.d, _d_stride, _n);
858
+ vDSP_vmsaD(
859
+ _a.res0->v.d+_a.offset, _a.stride,
860
+ _b.res0->v.d+_b.offset, _b.stride,
861
+ &_c,
862
+ _d.res0->v.d+_d.offset, _d.stride,
863
+ _n);
603
864
 
604
865
  return d;
605
866
  }
606
867
 
607
868
  // 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)
869
+ VALUE rb_double_vsma(
870
+ VALUE cls,
871
+ VALUE a, VALUE a_offset, VALUE a_stride,
872
+ VALUE b,
873
+ VALUE c, VALUE c_offset, VALUE c_stride,
874
+ VALUE d, VALUE d_offset, VALUE d_stride,
875
+ VALUE n)
609
876
  {
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);
877
+ VdspArrayParam _a;
878
+ VdspArrayParam _c;
879
+ VdspArrayParam _d;
880
+
881
+ array_param(&_a, a, a_offset, a_stride);
882
+ double _b = NUM2DBL(b);
883
+ array_param(&_c, c, c_offset, c_stride);
884
+ array_param(&_d, d, d_offset, d_stride);
614
885
 
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);
886
+ vDSP_Stride _n = NUM2LONG(n);
619
887
 
620
- vDSP_vsmaD(_a->v.d, _a_stride, &_b, _c->v.d, _c_stride, _d->v.d, _d_stride, _n);
888
+ vDSP_vsmaD(
889
+ _a.res0->v.d+_a.offset, _a.stride,
890
+ &_b,
891
+ _c.res0->v.d+_c.offset, _c.stride,
892
+ _d.res0->v.d+_d.offset, _d.stride,
893
+ _n);
621
894
 
622
895
  return d;
623
896
  }
624
897
 
625
898
  // 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)
899
+ VALUE rb_double_vma(
900
+ VALUE cls,
901
+ VALUE a, VALUE a_offset, VALUE a_stride,
902
+ VALUE b, VALUE b_offset, VALUE b_stride,
903
+ VALUE c, VALUE c_offset, VALUE c_stride,
904
+ VALUE d, VALUE d_offset, VALUE d_stride,
905
+ VALUE n)
627
906
  {
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);
907
+ VdspArrayParam _a;
908
+ VdspArrayParam _b;
909
+ VdspArrayParam _c;
910
+ VdspArrayParam _d;
911
+
912
+ array_param(&_a, a, a_offset, a_stride);
913
+ array_param(&_b, b, b_offset, b_stride);
914
+ array_param(&_c, c, c_offset, c_stride);
915
+ array_param(&_d, d, d_offset, d_stride);
632
916
 
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);
917
+ vDSP_Stride _n = NUM2LONG(n);
638
918
 
639
- vDSP_vmaD(_a->v.d, _a_stride, _b->v.d, _b_stride, _c->v.d, _c_stride, _d->v.d, _d_stride, _n);
919
+ vDSP_vmaD(
920
+ _a.res0->v.d+_a.offset, _a.stride,
921
+ _b.res0->v.d+_b.offset, _c.stride,
922
+ _c.res0->v.d+_c.offset, _c.stride,
923
+ _d.res0->v.d+_d.offset, _d.stride,
924
+ _n);
640
925
 
641
926
  return d;
642
927
  }
643
928
 
644
929
  // 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)
930
+ VALUE rb_double_vmsb(
931
+ VALUE cls,
932
+ VALUE a, VALUE a_offset, VALUE a_stride,
933
+ VALUE b, VALUE b_offset, VALUE b_stride,
934
+ VALUE c, VALUE c_offset, VALUE c_stride,
935
+ VALUE d, VALUE d_offset, VALUE d_stride,
936
+ VALUE n)
646
937
  {
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);
938
+ VdspArrayParam _a;
939
+ VdspArrayParam _b;
940
+ VdspArrayParam _c;
941
+ VdspArrayParam _d;
651
942
 
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);
943
+ array_param(&_a, a, a_offset, a_stride);
944
+ array_param(&_b, b, b_offset, b_stride);
945
+ array_param(&_c, c, c_offset, c_stride);
946
+ array_param(&_d, d, d_offset, d_stride);
657
947
 
658
- vDSP_vmsbD(_a->v.d, _a_stride, _b->v.d, _b_stride, _c->v.d, _c_stride, _d->v.d, _d_stride, _n);
948
+ vDSP_Stride _n = NUM2LONG(n);
949
+
950
+ vDSP_vmsbD(
951
+ _a.res0->v.d+_a.offset, _a.stride,
952
+ _b.res0->v.d+_b.offset, _c.stride,
953
+ _c.res0->v.d+_c.offset, _c.stride,
954
+ _d.res0->v.d+_d.offset, _d.stride,
955
+ _n);
659
956
 
660
957
  return d;
661
958
  }
662
959
 
663
960
  // 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)
961
+ VALUE rb_double_vsmsma(
962
+ VALUE cls,
963
+ VALUE a, VALUE a_offset, VALUE a_stride,
964
+ VALUE b,
965
+ VALUE c, VALUE c_offset, VALUE c_stride,
966
+ VALUE d,
967
+ VALUE e, VALUE e_offset, VALUE e_stride,
968
+ VALUE n)
665
969
  {
666
- VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
970
+ VdspArrayParam _a;
971
+ VdspArrayParam _c;
972
+ VdspArrayParam _e;
973
+
974
+ array_param(&_a, a, a_offset, a_stride);
667
975
  double _b = NUM2DBL(b);
668
- VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
976
+ array_param(&_c, c, c_offset, c_stride);
669
977
  double _d = NUM2DBL(d);
670
- VdspArrayNativeResource *_e = get_vdsp_array_native_resource(e);
978
+ array_param(&_e, e, e_offset, e_stride);
671
979
 
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);
980
+ vDSP_Stride _n = NUM2LONG(n);
676
981
 
677
- vDSP_vsmsmaD(_a->v.d, _a_stride, &_b, _c->v.d, _c_stride, &_d, _e->v.d, _e_stride, _n);
982
+ vDSP_vsmsmaD(
983
+ _a.res0->v.d+_a.offset, _a.stride,
984
+ &_b,
985
+ _c.res0->v.d+_c.offset, _c.stride,
986
+ &_d,
987
+ _e.res0->v.d+_e.offset, _e.stride,
988
+ _n);
678
989
 
679
990
  return e;
680
991
  }
681
992
 
682
993
  // 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)
994
+ VALUE rb_double_vaam(int argc, VALUE *argv, VALUE cls)
684
995
  {
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);
996
+ if (argc!=16) {
997
+ rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 16)", argc);
998
+ }
999
+ VALUE a = argv[0];
1000
+ VALUE a_offset = argv[1];
1001
+ VALUE a_stride = argv[2];
1002
+ VALUE b = argv[3];
1003
+ VALUE b_offset = argv[4];
1004
+ VALUE b_stride = argv[5];
1005
+ VALUE c = argv[6];
1006
+ VALUE c_offset = argv[7];
1007
+ VALUE c_stride = argv[8];
1008
+ VALUE d = argv[9];
1009
+ VALUE d_offset = argv[10];
1010
+ VALUE d_stride = argv[11];
1011
+ VALUE e = argv[12];
1012
+ VALUE e_offset = argv[13];
1013
+ VALUE e_stride = argv[14];
1014
+ VALUE n = argv[15];
1015
+
1016
+ VdspArrayParam _a;
1017
+ VdspArrayParam _b;
1018
+ VdspArrayParam _c;
1019
+ VdspArrayParam _d;
1020
+ VdspArrayParam _e;
1021
+
1022
+ array_param(&_a, a, a_offset, a_stride);
1023
+ array_param(&_b, b, b_offset, b_stride);
1024
+ array_param(&_c, c, c_offset, c_stride);
1025
+ array_param(&_d, d, d_offset, d_stride);
1026
+ array_param(&_e, e, e_offset, e_stride);
1027
+
1028
+ vDSP_Stride _n = NUM2LONG(n);
1029
+
1030
+ vDSP_vaamD(
1031
+ _a.res0->v.d+_a.offset, _a.stride,
1032
+ _b.res0->v.d+_b.offset, _b.stride,
1033
+ _c.res0->v.d+_c.offset, _c.stride,
1034
+ _d.res0->v.d+_d.offset, _d.stride,
1035
+ _e.res0->v.d+_e.offset, _e.stride,
1036
+ _n);
690
1037
 
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);
1038
+ return e;
1039
+ }
697
1040
 
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);
1041
+ // e[i] = (a[i] * b[i]) - (c[i] * d[i])
1042
+ VALUE rb_double_vmmsb(int argc, VALUE *argv, VALUE cls)
1043
+ {
1044
+ if (argc!=16) {
1045
+ rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 16)", argc);
1046
+ }
1047
+ VALUE a = argv[0];
1048
+ VALUE a_offset = argv[1];
1049
+ VALUE a_stride = argv[2];
1050
+ VALUE b = argv[3];
1051
+ VALUE b_offset = argv[4];
1052
+ VALUE b_stride = argv[5];
1053
+ VALUE c = argv[6];
1054
+ VALUE c_offset = argv[7];
1055
+ VALUE c_stride = argv[8];
1056
+ VALUE d = argv[9];
1057
+ VALUE d_offset = argv[10];
1058
+ VALUE d_stride = argv[11];
1059
+ VALUE e = argv[12];
1060
+ VALUE e_offset = argv[13];
1061
+ VALUE e_stride = argv[14];
1062
+ VALUE n = argv[15];
1063
+
1064
+ VdspArrayParam _a;
1065
+ VdspArrayParam _b;
1066
+ VdspArrayParam _c;
1067
+ VdspArrayParam _d;
1068
+ VdspArrayParam _e;
1069
+
1070
+ array_param(&_a, a, a_offset, a_stride);
1071
+ array_param(&_b, b, b_offset, b_stride);
1072
+ array_param(&_c, c, c_offset, c_stride);
1073
+ array_param(&_d, d, d_offset, d_stride);
1074
+ array_param(&_e, e, e_offset, e_stride);
1075
+
1076
+ vDSP_Stride _n = NUM2LONG(n);
1077
+
1078
+ vDSP_vmmsbD(
1079
+ _a.res0->v.d+_a.offset, _a.stride,
1080
+ _b.res0->v.d+_b.offset, _b.stride,
1081
+ _c.res0->v.d+_c.offset, _c.stride,
1082
+ _d.res0->v.d+_d.offset, _d.stride,
1083
+ _e.res0->v.d+_e.offset, _e.stride,
1084
+ _n);
699
1085
 
700
1086
  return e;
701
1087
  }
702
1088
 
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)
1089
+ // e[i] = (a[i] - b[i]) * (c[i] - d[i])
1090
+ VALUE rb_double_vsbsbm(int argc, VALUE *argv, VALUE cls)
705
1091
  {
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);
1092
+ if (argc!=16) {
1093
+ rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 16)", argc);
1094
+ }
1095
+ VALUE a = argv[0];
1096
+ VALUE a_offset = argv[1];
1097
+ VALUE a_stride = argv[2];
1098
+ VALUE b = argv[3];
1099
+ VALUE b_offset = argv[4];
1100
+ VALUE b_stride = argv[5];
1101
+ VALUE c = argv[6];
1102
+ VALUE c_offset = argv[7];
1103
+ VALUE c_stride = argv[8];
1104
+ VALUE d = argv[9];
1105
+ VALUE d_offset = argv[10];
1106
+ VALUE d_stride = argv[11];
1107
+ VALUE e = argv[12];
1108
+ VALUE e_offset = argv[13];
1109
+ VALUE e_stride = argv[14];
1110
+ VALUE n = argv[15];
1111
+
1112
+ VdspArrayParam _a;
1113
+ VdspArrayParam _b;
1114
+ VdspArrayParam _c;
1115
+ VdspArrayParam _d;
1116
+ VdspArrayParam _e;
1117
+
1118
+ array_param(&_a, a, a_offset, a_stride);
1119
+ array_param(&_b, b, b_offset, b_stride);
1120
+ array_param(&_c, c, c_offset, c_stride);
1121
+ array_param(&_d, d, d_offset, d_stride);
1122
+ array_param(&_e, e, e_offset, e_stride);
1123
+
1124
+ vDSP_Stride _n = NUM2LONG(n);
1125
+
1126
+ vDSP_vsbsbmD(
1127
+ _a.res0->v.d+_a.offset, _a.stride,
1128
+ _b.res0->v.d+_b.offset, _b.stride,
1129
+ _c.res0->v.d+_c.offset, _c.stride,
1130
+ _d.res0->v.d+_d.offset, _d.stride,
1131
+ _e.res0->v.d+_e.offset, _e.stride,
1132
+ _n);
711
1133
 
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);
1134
+ return e;
1135
+ }
718
1136
 
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);
1137
+ // e[i] = (a[i] + b[i]) * (c[i] + d[i])
1138
+ VALUE rb_double_vasbm(int argc, VALUE *argv, VALUE cls)
1139
+ {
1140
+ if (argc!=16) {
1141
+ rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 16)", argc);
1142
+ }
1143
+ VALUE a = argv[0];
1144
+ VALUE a_offset = argv[1];
1145
+ VALUE a_stride = argv[2];
1146
+ VALUE b = argv[3];
1147
+ VALUE b_offset = argv[4];
1148
+ VALUE b_stride = argv[5];
1149
+ VALUE c = argv[6];
1150
+ VALUE c_offset = argv[7];
1151
+ VALUE c_stride = argv[8];
1152
+ VALUE d = argv[9];
1153
+ VALUE d_offset = argv[10];
1154
+ VALUE d_stride = argv[11];
1155
+ VALUE e = argv[12];
1156
+ VALUE e_offset = argv[13];
1157
+ VALUE e_stride = argv[14];
1158
+ VALUE n = argv[15];
1159
+
1160
+ VdspArrayParam _a;
1161
+ VdspArrayParam _b;
1162
+ VdspArrayParam _c;
1163
+ VdspArrayParam _d;
1164
+ VdspArrayParam _e;
1165
+
1166
+ array_param(&_a, a, a_offset, a_stride);
1167
+ array_param(&_b, b, b_offset, b_stride);
1168
+ array_param(&_c, c, c_offset, c_stride);
1169
+ array_param(&_d, d, d_offset, d_stride);
1170
+ array_param(&_e, e, e_offset, e_stride);
1171
+
1172
+ vDSP_Stride _n = NUM2LONG(n);
1173
+
1174
+ vDSP_vasbmD(
1175
+ _a.res0->v.d+_a.offset, _a.stride,
1176
+ _b.res0->v.d+_b.offset, _b.stride,
1177
+ _c.res0->v.d+_c.offset, _c.stride,
1178
+ _d.res0->v.d+_d.offset, _d.stride,
1179
+ _e.res0->v.d+_e.offset, _e.stride,
1180
+ _n);
720
1181
 
721
1182
  return e;
722
1183
  }
723
1184
 
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)
1185
+ // Vector Generation
1186
+
1187
+ VALUE rb_double_vramp(
1188
+ VALUE cls,
1189
+ VALUE a,
1190
+ VALUE b,
1191
+ VALUE c, VALUE c_offset, VALUE c_stride,
1192
+ VALUE n)
1193
+ {
1194
+ VdspArrayParam _c;
1195
+
1196
+ double _a = NUM2DBL(a);
1197
+ double _b = NUM2DBL(b);
1198
+ array_param(&_c, c, c_offset, c_stride);
1199
+
1200
+ vDSP_Stride _n = NUM2LONG(n);
1201
+
1202
+ vDSP_vrampD(
1203
+ &_a,
1204
+ &_b,
1205
+ _c.res0->v.d+_c.offset, _c.stride,
1206
+ _n);
1207
+
1208
+ return c;
1209
+ }
1210
+
1211
+ VALUE rb_double_vgen(
1212
+ VALUE cls,
1213
+ VALUE a,
1214
+ VALUE b,
1215
+ VALUE c, VALUE c_offset, VALUE c_stride,
1216
+ VALUE n)
1217
+ {
1218
+ VdspArrayParam _c;
1219
+
1220
+ double _a = NUM2DBL(a);
1221
+ double _b = NUM2DBL(b);
1222
+ array_param(&_c, c, c_offset, c_stride);
1223
+
1224
+ vDSP_Stride _n = NUM2LONG(n);
1225
+
1226
+ vDSP_vgenD(
1227
+ &_a,
1228
+ &_b,
1229
+ _c.res0->v.d+_c.offset, _c.stride,
1230
+ _n);
1231
+
1232
+ return c;
1233
+ }
1234
+
1235
+ VALUE rb_double_vrampmul(
1236
+ VALUE cls,
1237
+ VALUE i, VALUE i_offset, VALUE i_stride,
1238
+ VALUE start,
1239
+ VALUE step,
1240
+ VALUE o, VALUE o_offset, VALUE o_stride,
1241
+ VALUE n)
1242
+ {
1243
+ VdspArrayParam _i;
1244
+ VdspArrayParam _o;
1245
+
1246
+ array_param(&_i, i, i_offset, i_stride);
1247
+ double _start = NUM2DBL(start);
1248
+ double _step = NUM2DBL(step);
1249
+ array_param(&_o, o, o_offset, o_stride);
1250
+
1251
+ vDSP_Stride _n = NUM2LONG(n);
1252
+
1253
+ vDSP_vrampmulD(
1254
+ _i.res0->v.d+_i.offset, _i.stride,
1255
+ &_start,
1256
+ &_step,
1257
+ _o.res0->v.d+_o.offset, _o.stride,
1258
+ _n
1259
+ );
1260
+
1261
+ return o;
1262
+ }
1263
+
1264
+ VALUE rb_double_vrampmul2(
1265
+ VALUE cls,
1266
+ VALUE i0, VALUE i1, VALUE i_offset, VALUE i_stride,
1267
+ VALUE start,
1268
+ VALUE step,
1269
+ VALUE o0, VALUE o1, VALUE o_offset, VALUE o_stride,
1270
+ VALUE n)
1271
+ {
1272
+ VdspArrayParam _i;
1273
+ VdspArrayParam _o;
1274
+
1275
+ array_param2(&_i, i0, i1, i_offset, i_stride);
1276
+ double _start = NUM2DBL(start);
1277
+ double _step = NUM2DBL(step);
1278
+ array_param2(&_o, o0, o1, o_offset, o_stride);
1279
+
1280
+ vDSP_Stride _n = NUM2LONG(n);
1281
+
1282
+ vDSP_vrampmul2D(
1283
+ _i.res0->v.d+_i.offset, _i.res1->v.d+_i.offset, _i.stride,
1284
+ &_start,
1285
+ &_step,
1286
+ _o.res0->v.d+_o.offset, _o.res1->v.d+_o.offset, _o.stride,
1287
+ _n
1288
+ );
1289
+
1290
+ return rb_assoc_new(o0, o1);
1291
+ }
1292
+
1293
+ VALUE rb_double_vrampmuladd(
1294
+ VALUE cls,
1295
+ VALUE i, VALUE i_offset, VALUE i_stride,
1296
+ VALUE start,
1297
+ VALUE step,
1298
+ VALUE o, VALUE o_offset, VALUE o_stride,
1299
+ VALUE n)
1300
+ {
1301
+ VdspArrayParam _i;
1302
+ VdspArrayParam _o;
1303
+
1304
+ array_param(&_i, i, i_offset, i_stride);
1305
+ double _start = NUM2DBL(start);
1306
+ double _step = NUM2DBL(step);
1307
+ array_param(&_o, o, o_offset, o_stride);
1308
+
1309
+ vDSP_Stride _n = NUM2LONG(n);
1310
+
1311
+ vDSP_vrampmuladdD(
1312
+ _i.res0->v.d+_i.offset, _i.stride,
1313
+ &_start,
1314
+ &_step,
1315
+ _o.res0->v.d+_o.offset, _o.stride,
1316
+ _n
1317
+ );
1318
+
1319
+ return o;
1320
+ }
1321
+
1322
+ VALUE rb_double_vrampmuladd2(
1323
+ VALUE cls,
1324
+ VALUE i0, VALUE i1, VALUE i_offset, VALUE i_stride,
1325
+ VALUE start,
1326
+ VALUE step,
1327
+ VALUE o0, VALUE o1, VALUE o_offset, VALUE o_stride,
1328
+ VALUE n)
1329
+ {
1330
+ VdspArrayParam _i;
1331
+ VdspArrayParam _o;
1332
+
1333
+ array_param2(&_i, i0, i1, i_offset, i_stride);
1334
+ double _start = NUM2DBL(start);
1335
+ double _step = NUM2DBL(step);
1336
+ array_param2(&_o, o0, o1, o_offset, o_stride);
1337
+
1338
+ vDSP_Stride _n = NUM2LONG(n);
1339
+
1340
+ vDSP_vrampmuladd2D(
1341
+ _i.res0->v.d+_i.offset, _i.res1->v.d+_i.offset, _i.stride,
1342
+ &_start,
1343
+ &_step,
1344
+ _o.res0->v.d+_o.offset, _o.res1->v.d+_o.offset, _o.stride,
1345
+ _n
1346
+ );
1347
+
1348
+ return rb_assoc_new(o0, o1);
1349
+ }
1350
+
1351
+ VALUE rb_double_vgenp(
1352
+ VALUE cls,
1353
+ VALUE a, VALUE a_offset, VALUE a_stride,
1354
+ VALUE b, VALUE b_offset, VALUE b_stride,
1355
+ VALUE c, VALUE c_offset, VALUE c_stride,
1356
+ VALUE n,
1357
+ VALUE m)
726
1358
  {
727
- VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
728
- VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
1359
+ VdspArrayParam _a;
1360
+ VdspArrayParam _b;
1361
+ VdspArrayParam _c;
1362
+
1363
+ array_param(&_a, a, a_offset, a_stride);
1364
+ array_param(&_b, b, b_offset, b_stride);
1365
+ array_param(&_c, c, c_offset, c_stride);
1366
+
1367
+ vDSP_Stride _n = NUM2LONG(n);
1368
+ vDSP_Stride _m = NUM2LONG(m);
1369
+
1370
+ vDSP_vgenpD(
1371
+ _a.res0->v.d+_a.offset, _a.stride,
1372
+ _b.res0->v.d+_b.offset, _b.stride,
1373
+ _c.res0->v.d+_c.offset, _c.stride,
1374
+ _n,
1375
+ _m
1376
+ );
1377
+
1378
+ return c;
1379
+ }
1380
+
1381
+ VALUE rb_double_vtabi(
1382
+ VALUE cls,
1383
+ VALUE a, VALUE a_offset, VALUE a_stride,
1384
+ VALUE s1,
1385
+ VALUE s2,
1386
+ VALUE c,
1387
+ VALUE m,
1388
+ VALUE d, VALUE d_offset, VALUE d_stride,
1389
+ VALUE n)
1390
+ {
1391
+ VdspArrayParam _a;
1392
+ VdspArrayParam _d;
1393
+
1394
+ array_param(&_a, a, a_offset, a_stride);
1395
+ double _s1 = NUM2DBL(s1);
1396
+ double _s2 = NUM2DBL(s2);
729
1397
  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
1398
 
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);
1399
+ vDSP_Stride _m = NUM2LONG(m);
1400
+ vDSP_Stride _n = NUM2LONG(n);
739
1401
 
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);
1402
+ array_param(&_d, d, d_offset, d_stride);
741
1403
 
742
- return e;
1404
+ vDSP_vtabiD(
1405
+ _a.res0->v.d+_a.offset, _a.stride,
1406
+ &_s1,
1407
+ &_s2,
1408
+ _c->v.d,
1409
+ _m,
1410
+ _d.res0->v.d+_d.offset, _d.stride,
1411
+ _n
1412
+ );
1413
+
1414
+ return d;
743
1415
  }
744
1416
 
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)
1417
+ VALUE rb_double_blkman_window(VALUE cls, VALUE c, VALUE n, VALUE flag)
747
1418
  {
748
- VdspArrayNativeResource *_a = get_vdsp_array_native_resource(a);
749
- VdspArrayNativeResource *_b = get_vdsp_array_native_resource(b);
750
1419
  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);
1420
+ vDSP_Stride _n = NUM2LONG(n);
1421
+ int _flag = (int)NUM2LONG(flag);
753
1422
 
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);
1423
+ vDSP_blkman_windowD(_c->v.d, _n, _flag);
760
1424
 
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);
1425
+ return c;
1426
+ }
762
1427
 
763
- return e;
1428
+ VALUE rb_double_hamm_window(VALUE cls, VALUE c, VALUE n, VALUE flag)
1429
+ {
1430
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
1431
+ vDSP_Stride _n = NUM2LONG(n);
1432
+ int _flag = (int)NUM2LONG(flag);
1433
+
1434
+ vDSP_hamm_windowD(_c->v.d, _n, _flag);
1435
+
1436
+ return c;
1437
+ }
1438
+
1439
+ VALUE rb_double_hann_window(VALUE cls, VALUE c, VALUE n, VALUE flag)
1440
+ {
1441
+ VdspArrayNativeResource *_c = get_vdsp_array_native_resource(c);
1442
+ vDSP_Stride _n = NUM2LONG(n);
1443
+ int _flag = (int)NUM2LONG(flag);
1444
+
1445
+ vDSP_hann_windowD(_c->v.d, _n, _flag);
1446
+
1447
+ return c;
764
1448
  }
765
1449
 
766
1450
 
@@ -770,6 +1454,8 @@ void Init_vdsp()
770
1454
  {
771
1455
  // Vdsp
772
1456
  rb_mVdsp = rb_define_module("Vdsp");
1457
+ rb_define_const(rb_mVdsp, "HALF_WINDOW", LONG2NUM(vDSP_HALF_WINDOW));
1458
+ rb_define_const(rb_mVdsp, "FULL_WINDOW", LONG2NUM(0));
773
1459
 
774
1460
  // Vdsp::Scalar
775
1461
  rb_mVdspScalar = rb_define_module_under(rb_mVdsp, "Scalar");
@@ -802,31 +1488,49 @@ void Init_vdsp()
802
1488
  rb_define_method(rb_cDoubleArray, "[]=", rb_double_array_aset, 2);
803
1489
  rb_define_method(rb_cDoubleArray, "to_a", rb_double_array_get_values, 0);
804
1490
  rb_define_method(rb_cDoubleArray, "coerce", rb_double_array_coerce, 1);
1491
+ rb_define_singleton_method(rb_cDoubleArray, "vramp", rb_double_array_vramp, 3);
1492
+ rb_define_singleton_method(rb_cDoubleArray, "vgen", rb_double_array_vgen, 3);
1493
+ rb_define_singleton_method(rb_cDoubleArray, "blkman_window", rb_double_array_blkman_window, -1);
1494
+ rb_define_singleton_method(rb_cDoubleArray, "hamm_window", rb_double_array_hamm_window, -1);
1495
+ rb_define_singleton_method(rb_cDoubleArray, "hann_window", rb_double_array_hann_window, -1);
805
1496
 
806
- // Vdsp::Double
807
- rb_mDouble = rb_define_module_under(rb_mVdsp, "Double");
1497
+ // Vdsp::UnsafeDouble
1498
+ rb_mUnsafeDouble = rb_define_module_under(rb_mVdsp, "UnsafeDouble");
808
1499
 
809
1500
  // 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);
1501
+ rb_define_singleton_method(rb_mUnsafeDouble, "vsadd", rb_double_vsadd, 8);
1502
+ rb_define_singleton_method(rb_mUnsafeDouble, "vadd", rb_double_vadd, 10);
1503
+ rb_define_singleton_method(rb_mUnsafeDouble, "vsub", rb_double_vsub, 10);
1504
+ rb_define_singleton_method(rb_mUnsafeDouble, "vsmul", rb_double_vsmul, 8);
1505
+ rb_define_singleton_method(rb_mUnsafeDouble, "vmul", rb_double_vmul, 10);
1506
+ rb_define_singleton_method(rb_mUnsafeDouble, "vsdiv", rb_double_vsdiv, 8);
1507
+ rb_define_singleton_method(rb_mUnsafeDouble, "svdiv", rb_double_svdiv, 8);
1508
+ rb_define_singleton_method(rb_mUnsafeDouble, "vaddsub", rb_double_vaddsub, 13);
1509
+ rb_define_singleton_method(rb_mUnsafeDouble, "vdiv", rb_double_vdiv, 10);
1510
+ rb_define_singleton_method(rb_mUnsafeDouble, "vasm", rb_double_vasm, 11);
1511
+ rb_define_singleton_method(rb_mUnsafeDouble, "vam", rb_double_vam, 13);
1512
+ rb_define_singleton_method(rb_mUnsafeDouble, "vsbsm", rb_double_vsbsm, 11);
1513
+ rb_define_singleton_method(rb_mUnsafeDouble, "vsbm", rb_double_vsbm, 13);
1514
+ rb_define_singleton_method(rb_mUnsafeDouble, "vmsa", rb_double_vmsa, 11);
1515
+ rb_define_singleton_method(rb_mUnsafeDouble, "vsma", rb_double_vsma, 11);
1516
+ rb_define_singleton_method(rb_mUnsafeDouble, "vma", rb_double_vma, 13);
1517
+ rb_define_singleton_method(rb_mUnsafeDouble, "vmsb", rb_double_vmsb, 13);
1518
+ rb_define_singleton_method(rb_mUnsafeDouble, "vsmsma", rb_double_vsmsma, 12);
1519
+ rb_define_singleton_method(rb_mUnsafeDouble, "vaam", rb_double_vaam, -1);
1520
+ rb_define_singleton_method(rb_mUnsafeDouble, "vmmsb", rb_double_vmmsb, -1);
1521
+ rb_define_singleton_method(rb_mUnsafeDouble, "vsbsbm", rb_double_vsbsbm, -1);
1522
+ rb_define_singleton_method(rb_mUnsafeDouble, "vasbm", rb_double_vasbm, -1);
1523
+
1524
+ // Vector Generation
1525
+ rb_define_singleton_method(rb_mUnsafeDouble, "vramp", rb_double_vramp, 6);
1526
+ rb_define_singleton_method(rb_mUnsafeDouble, "vgen", rb_double_vgen, 6);
1527
+ rb_define_singleton_method(rb_mUnsafeDouble, "vrampmul", rb_double_vrampmul, 9);
1528
+ rb_define_singleton_method(rb_mUnsafeDouble, "vrampmul2", rb_double_vrampmul2, 11);
1529
+ rb_define_singleton_method(rb_mUnsafeDouble, "vrampmuladd", rb_double_vrampmuladd, 9);
1530
+ rb_define_singleton_method(rb_mUnsafeDouble, "vrampmuladd2", rb_double_vrampmuladd2, 11);
1531
+ rb_define_singleton_method(rb_mUnsafeDouble, "vgenp", rb_double_vgenp, 11);
1532
+ rb_define_singleton_method(rb_mUnsafeDouble, "vtabi", rb_double_vtabi, 11);
1533
+ rb_define_singleton_method(rb_mUnsafeDouble, "blkman_window", rb_double_blkman_window, 3);
1534
+ rb_define_singleton_method(rb_mUnsafeDouble, "hamm_window", rb_double_hamm_window, 3);
1535
+ rb_define_singleton_method(rb_mUnsafeDouble, "hann_window", rb_double_hann_window, 3);
832
1536
  }