vdsp 1.4.0 → 1.5.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 +4 -4
- data/ext/vdsp/vdsp.c +184 -19
- data/ext/vdsp/vdsp.h +26 -0
- data/lib/vdsp.rb +4 -0
- data/lib/vdsp/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a5d8f8b6a88c276a1379130a5714a2021405272cce868a929dc298e8fe53ffcd
|
4
|
+
data.tar.gz: a2519330af53222ed133f6acdf0b4d5fde5cdfe451a0d61f662a3d2c99db8405
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6557320864d0952107d09d705fd19fd1584e78cabacbada432b941a474de14ef0847cfaf5ffa7d468a1a4f8e678c63c74146222c8541562c5912cc7859cf1247
|
7
|
+
data.tar.gz: f346a56cca2958994da7d367bbfc788fb9a6aba0409e8475a4159af149ce0b80fa0f69dae7bb77162ea2c123d4fe179c4ec1af28d1b9d6d0d9e7b7061f1a7930
|
data/ext/vdsp/vdsp.c
CHANGED
@@ -5,18 +5,21 @@ VALUE rb_mVdsp;
|
|
5
5
|
|
6
6
|
VALUE rb_mVdspScalar;
|
7
7
|
VALUE rb_mVdspArray;
|
8
|
+
VALUE rb_mVdspBiquad;
|
8
9
|
|
9
10
|
VALUE rb_cDoubleScalar;
|
10
11
|
VALUE rb_cDoubleArray;
|
11
12
|
VALUE rb_mUnsafeDouble;
|
13
|
+
VALUE rb_cDoubleBiquad;
|
12
14
|
|
13
15
|
|
14
|
-
//
|
16
|
+
// Array native resource
|
15
17
|
|
16
18
|
void vdsp_array_native_resource_delete(VdspArrayNativeResource * p)
|
17
19
|
{
|
18
20
|
if (p->v.ptr) {
|
19
21
|
free(p->v.ptr);
|
22
|
+
p->v.ptr = NULL;
|
20
23
|
}
|
21
24
|
free(p);
|
22
25
|
}
|
@@ -38,23 +41,6 @@ VdspArrayNativeResource* get_vdsp_array_native_resource(VALUE va)
|
|
38
41
|
return p;
|
39
42
|
}
|
40
43
|
|
41
|
-
VdspArrayValue get_vdsp_array_value(VALUE va)
|
42
|
-
{
|
43
|
-
VdspArrayNativeResource *p = get_vdsp_array_native_resource(va);
|
44
|
-
return p->v;
|
45
|
-
}
|
46
|
-
|
47
|
-
double* get_double_array_value(VALUE va)
|
48
|
-
{
|
49
|
-
return get_vdsp_array_value(va).d;
|
50
|
-
}
|
51
|
-
|
52
|
-
long get_vdsp_array_length(VALUE va)
|
53
|
-
{
|
54
|
-
VdspArrayNativeResource *_a = get_vdsp_array_native_resource(va);
|
55
|
-
return _a->length;
|
56
|
-
}
|
57
|
-
|
58
44
|
void array_param(VdspArrayParam *param, VALUE arr0, VALUE offset, VALUE stride)
|
59
45
|
{
|
60
46
|
param->res0 = get_vdsp_array_native_resource(arr0);
|
@@ -71,6 +57,54 @@ void array_param2(VdspArrayParam *param, VALUE arr0, VALUE arr1, VALUE offset, V
|
|
71
57
|
}
|
72
58
|
|
73
59
|
|
60
|
+
// Biquad native resource
|
61
|
+
|
62
|
+
void vdsp_biquad_native_resource_delete(VdspBiquadNativeResource * p)
|
63
|
+
{
|
64
|
+
if (p->setup.ptr) {
|
65
|
+
if (p->type=='d') {
|
66
|
+
vDSP_biquad_DestroySetupD(p->setup.d);
|
67
|
+
p->setup.ptr = NULL;
|
68
|
+
}
|
69
|
+
}
|
70
|
+
if (p->delay.ptr) {
|
71
|
+
free(p->delay.ptr);
|
72
|
+
p->delay.ptr = NULL;
|
73
|
+
}
|
74
|
+
free(p);
|
75
|
+
}
|
76
|
+
|
77
|
+
VdspBiquadNativeResource* get_vdsp_biquad_native_resource(VALUE vb)
|
78
|
+
{
|
79
|
+
if (!rb_obj_is_kind_of(vb, rb_mVdspBiquad)) {
|
80
|
+
rb_raise(rb_eArgError, "Vdsp::Biquad required");
|
81
|
+
}
|
82
|
+
|
83
|
+
VALUE resource = rb_iv_get(vb, "native_resource");
|
84
|
+
if (resource==Qnil) {
|
85
|
+
return NULL;
|
86
|
+
}
|
87
|
+
|
88
|
+
VdspBiquadNativeResource *p;
|
89
|
+
Data_Get_Struct(resource, VdspBiquadNativeResource, p);
|
90
|
+
|
91
|
+
return p;
|
92
|
+
}
|
93
|
+
|
94
|
+
VdspBiquadSetup get_vdsp_biquad_setup(VALUE vb)
|
95
|
+
{
|
96
|
+
VdspBiquadNativeResource *p = get_vdsp_biquad_native_resource(vb);
|
97
|
+
return p->setup;
|
98
|
+
}
|
99
|
+
|
100
|
+
long get_vdsp_biquad_sections(VALUE vb)
|
101
|
+
{
|
102
|
+
VdspBiquadNativeResource *_b = get_vdsp_biquad_native_resource(vb);
|
103
|
+
return _b->sections;
|
104
|
+
}
|
105
|
+
|
106
|
+
|
107
|
+
|
74
108
|
// Vdsp::DoubleScalar
|
75
109
|
|
76
110
|
VALUE rb_double_scalar_initialize(VALUE self, VALUE val)
|
@@ -128,7 +162,8 @@ VALUE rb_double_scalar_div(VALUE self, VALUE other)
|
|
128
162
|
|
129
163
|
VALUE rb_vdsp_array_length(VALUE self)
|
130
164
|
{
|
131
|
-
|
165
|
+
VdspArrayNativeResource *p = get_vdsp_array_native_resource(self);
|
166
|
+
return LONG2NUM(p->length);
|
132
167
|
}
|
133
168
|
|
134
169
|
|
@@ -621,6 +656,97 @@ VALUE rb_double_array_svs(VALUE self)
|
|
621
656
|
}
|
622
657
|
|
623
658
|
|
659
|
+
// Vdsp::Biquad
|
660
|
+
|
661
|
+
VALUE rb_vdsp_biquad_sections(VALUE self)
|
662
|
+
{
|
663
|
+
return LONG2NUM(get_vdsp_biquad_sections(self));
|
664
|
+
}
|
665
|
+
|
666
|
+
|
667
|
+
// Vdsp::DoubleBiquad
|
668
|
+
|
669
|
+
VALUE rb_double_biquad_initialize(VALUE self, VALUE coefficients)
|
670
|
+
{
|
671
|
+
coefficients = rb_ary_new3(1, coefficients);
|
672
|
+
coefficients = rb_funcall(coefficients, rb_intern("flatten"), 0);
|
673
|
+
|
674
|
+
VALUE rb_cBiquadCoefficient = rb_const_get(rb_mVdspBiquad, rb_intern("Coefficient"));
|
675
|
+
|
676
|
+
long sections = RARRAY_LEN(coefficients);
|
677
|
+
for (long i=0; i<sections; i++) {
|
678
|
+
VALUE coefficient = RARRAY_AREF(coefficients, i);
|
679
|
+
if (!rb_obj_is_kind_of(coefficient, rb_cBiquadCoefficient)) {
|
680
|
+
rb_raise(rb_eArgError, "Vdsp::Biquad::Coefficient required");
|
681
|
+
}
|
682
|
+
}
|
683
|
+
|
684
|
+
VdspBiquadNativeResource *p = ALLOC(VdspBiquadNativeResource);
|
685
|
+
p->type = 'd';
|
686
|
+
p->coefs.ptr = NULL;
|
687
|
+
p->delay.ptr = NULL;
|
688
|
+
p->setup.ptr = NULL;
|
689
|
+
p->sections = 0;
|
690
|
+
|
691
|
+
VALUE resource = Data_Wrap_Struct(CLASS_OF(self), 0, vdsp_biquad_native_resource_delete, p);
|
692
|
+
rb_iv_set(self, "native_resource", resource);
|
693
|
+
|
694
|
+
p->coefs.ptr = calloc(sections*5, sizeof(double));
|
695
|
+
for (long i=0; i<sections; i++) {
|
696
|
+
VALUE coefficient = RARRAY_AREF(coefficients, i);
|
697
|
+
p->coefs.d[i*5+0] = NUM2DBL(rb_funcall(coefficient, rb_intern("b0"), 0));
|
698
|
+
p->coefs.d[i*5+1] = NUM2DBL(rb_funcall(coefficient, rb_intern("b1"), 0));
|
699
|
+
p->coefs.d[i*5+2] = NUM2DBL(rb_funcall(coefficient, rb_intern("b2"), 0));
|
700
|
+
p->coefs.d[i*5+3] = NUM2DBL(rb_funcall(coefficient, rb_intern("a1"), 0));
|
701
|
+
p->coefs.d[i*5+4] = NUM2DBL(rb_funcall(coefficient, rb_intern("a2"), 0));
|
702
|
+
}
|
703
|
+
p->delay.ptr = calloc(sections*2+2, sizeof(double));
|
704
|
+
p->setup.d = vDSP_biquad_CreateSetupD(p->coefs.d, sections);
|
705
|
+
p->sections = sections;
|
706
|
+
|
707
|
+
return self;
|
708
|
+
}
|
709
|
+
|
710
|
+
VALUE rb_double_biquad_apply(VALUE self, VALUE x)
|
711
|
+
{
|
712
|
+
//x = rb_funcall(x, rb_intern("to_da"), 0);
|
713
|
+
x = rb_funcall(rb_cDoubleArray, rb_intern("create"), 1, x);
|
714
|
+
VdspArrayNativeResource *_x = get_vdsp_array_native_resource(x);
|
715
|
+
|
716
|
+
VALUE lenv = LONG2NUM(_x->length);
|
717
|
+
VALUE y = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
|
718
|
+
VdspArrayNativeResource *_y = get_vdsp_array_native_resource(y);
|
719
|
+
|
720
|
+
VdspBiquadNativeResource *_b = get_vdsp_biquad_native_resource(self);
|
721
|
+
|
722
|
+
vDSP_biquadD(_b->setup.d, _b->delay.d, _x->v.d, 1, _y->v.d, 1, _x->length);
|
723
|
+
|
724
|
+
return y;
|
725
|
+
}
|
726
|
+
|
727
|
+
VALUE rb_double_biquad_coefficients(VALUE self)
|
728
|
+
{
|
729
|
+
VdspBiquadNativeResource *p = get_vdsp_biquad_native_resource(self);
|
730
|
+
VALUE ret = rb_ary_new2(p->sections);
|
731
|
+
|
732
|
+
VALUE rb_cBiquadCoefficient = rb_const_get(rb_mVdspBiquad, rb_intern("Coefficient"));
|
733
|
+
|
734
|
+
for (unsigned long i=0; i<p->sections; i++) {
|
735
|
+
VALUE argv[5] = {
|
736
|
+
DBL2NUM(p->coefs.d[i*5+0]),
|
737
|
+
DBL2NUM(p->coefs.d[i*5+1]),
|
738
|
+
DBL2NUM(p->coefs.d[i*5+2]),
|
739
|
+
DBL2NUM(p->coefs.d[i*5+3]),
|
740
|
+
DBL2NUM(p->coefs.d[i*5+4])
|
741
|
+
};
|
742
|
+
VALUE coef = rb_class_new_instance(5, argv, rb_cBiquadCoefficient);
|
743
|
+
rb_ary_push(ret, coef);
|
744
|
+
}
|
745
|
+
|
746
|
+
return ret;
|
747
|
+
}
|
748
|
+
|
749
|
+
|
624
750
|
// Vdsp static method
|
625
751
|
|
626
752
|
// c[i] = a[i] + b
|
@@ -1921,6 +2047,31 @@ VALUE rb_double_svs(
|
|
1921
2047
|
return DBL2NUM(_c);
|
1922
2048
|
}
|
1923
2049
|
|
2050
|
+
VALUE rb_double_biquad(
|
2051
|
+
VALUE cls,
|
2052
|
+
VALUE biquad,
|
2053
|
+
VALUE x, VALUE x_offset, VALUE x_stride,
|
2054
|
+
VALUE y, VALUE y_offset, VALUE y_stride,
|
2055
|
+
VALUE n)
|
2056
|
+
{
|
2057
|
+
VdspArrayParam _x;
|
2058
|
+
VdspArrayParam _y;
|
2059
|
+
|
2060
|
+
VdspBiquadNativeResource *_b = get_vdsp_biquad_native_resource(biquad);
|
2061
|
+
array_param(&_x, x, x_offset, x_stride);
|
2062
|
+
array_param(&_y, y, y_offset, y_stride);
|
2063
|
+
vDSP_Stride _n = NUM2LONG(n);
|
2064
|
+
|
2065
|
+
vDSP_biquadD(
|
2066
|
+
_b->setup.d,
|
2067
|
+
_b->delay.d,
|
2068
|
+
_x.res0->v.d+_x.offset, _x.stride,
|
2069
|
+
_y.res0->v.d+_y.offset, _y.stride,
|
2070
|
+
_n);
|
2071
|
+
|
2072
|
+
return y;
|
2073
|
+
}
|
2074
|
+
|
1924
2075
|
|
1925
2076
|
// Init
|
1926
2077
|
|
@@ -1997,6 +2148,17 @@ void Init_vdsp()
|
|
1997
2148
|
rb_define_method(rb_cDoubleArray, "sve_svesq", rb_double_array_sve_svesq, 0);
|
1998
2149
|
rb_define_method(rb_cDoubleArray, "svs", rb_double_array_svs, 0);
|
1999
2150
|
|
2151
|
+
// Vdsp::Biquad
|
2152
|
+
rb_mVdspBiquad = rb_define_module_under(rb_mVdsp, "Biquad");
|
2153
|
+
rb_define_method(rb_mVdspBiquad, "sections", rb_vdsp_biquad_sections, 0);
|
2154
|
+
|
2155
|
+
// Vdsp::DoubleBiquad
|
2156
|
+
rb_cDoubleBiquad = rb_define_class_under(rb_mVdsp, "DoubleBiquad", rb_cObject);
|
2157
|
+
rb_include_module(rb_cDoubleBiquad, rb_mVdspBiquad);
|
2158
|
+
rb_define_method(rb_cDoubleBiquad, "initialize", rb_double_biquad_initialize, 1);
|
2159
|
+
rb_define_method(rb_cDoubleBiquad, "apply", rb_double_biquad_apply, 1);
|
2160
|
+
rb_define_method(rb_cDoubleBiquad, "coefficients", rb_double_biquad_coefficients, 0);
|
2161
|
+
|
2000
2162
|
// Vdsp::UnsafeDouble
|
2001
2163
|
rb_mUnsafeDouble = rb_define_module_under(rb_mVdsp, "UnsafeDouble");
|
2002
2164
|
|
@@ -2060,4 +2222,7 @@ void Init_vdsp()
|
|
2060
2222
|
rb_define_singleton_method(rb_mUnsafeDouble, "svesq", rb_double_svesq, 4);
|
2061
2223
|
rb_define_singleton_method(rb_mUnsafeDouble, "sve_svesq", rb_double_sve_svesq, 4);
|
2062
2224
|
rb_define_singleton_method(rb_mUnsafeDouble, "svs", rb_double_svs, 4);
|
2225
|
+
|
2226
|
+
// Vdsp::UnsafeDouble Biquadratic IIR Filters
|
2227
|
+
rb_define_singleton_method(rb_mUnsafeDouble, "biquad", rb_double_biquad, 8);
|
2063
2228
|
}
|
data/ext/vdsp/vdsp.h
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
#include <ruby.h>
|
2
2
|
#include <Accelerate/Accelerate.h>
|
3
3
|
|
4
|
+
|
5
|
+
// VdspArray
|
6
|
+
|
4
7
|
typedef union {
|
5
8
|
void *ptr;
|
6
9
|
double *d;
|
@@ -18,6 +21,29 @@ typedef struct {
|
|
18
21
|
vDSP_Stride stride;
|
19
22
|
} VdspArrayParam;
|
20
23
|
|
24
|
+
|
25
|
+
// VdspBiquad
|
26
|
+
|
27
|
+
typedef union {
|
28
|
+
void *ptr;
|
29
|
+
struct vDSP_biquad_SetupStructD *d;
|
30
|
+
} VdspBiquadSetup;
|
31
|
+
|
32
|
+
typedef struct {
|
33
|
+
char type;
|
34
|
+
union {
|
35
|
+
void *ptr;
|
36
|
+
double *d;
|
37
|
+
} coefs;
|
38
|
+
union {
|
39
|
+
void *ptr;
|
40
|
+
double *d;
|
41
|
+
} delay;
|
42
|
+
VdspBiquadSetup setup;
|
43
|
+
unsigned long sections;
|
44
|
+
} VdspBiquadNativeResource;
|
45
|
+
|
46
|
+
|
21
47
|
extern VALUE rb_double_array_plus(VALUE self, VALUE other);
|
22
48
|
extern VALUE rb_double_array_mul(VALUE self, VALUE other);
|
23
49
|
|
data/lib/vdsp.rb
CHANGED
data/lib/vdsp/version.rb
CHANGED
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.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yoshida
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|