vdsp 1.10.0 → 1.11.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 +180 -26
- data/ext/vdsp/vdsp.h +17 -0
- data/lib/vdsp/version.rb +1 -1
- data/lib/vdsp.rb +17 -0
- 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: fa99481dbf2b00907473c9af631b12bf886d7057eeec5522ed48aec918d21bfc
|
4
|
+
data.tar.gz: 93410ea00651167eb8fe11728cf47e24593cfb49c8c8220550165dfd0cea1c3f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb0e1248e5a7deedc29bccc11e2d038f36e16723015bae32f7123beb0831819722a5ab148de45af60416a21d6eee2be798ad049788e3373a669e26252e8f41e0
|
7
|
+
data.tar.gz: 21921f2e175eac1aa4818fce034d0e88310a4136a0f20d2002bf006df9cc1dd1a8e9106513ca8fa912445bed4956b3895f0639c89c011df09579dfb7d56313cd
|
data/ext/vdsp/vdsp.c
CHANGED
@@ -6,16 +6,18 @@ VALUE rb_mVdsp;
|
|
6
6
|
VALUE rb_mVdspScalar;
|
7
7
|
VALUE rb_mVdspArray;
|
8
8
|
VALUE rb_mVdspBiquad;
|
9
|
+
VALUE rb_mVdspFFT;
|
9
10
|
|
10
11
|
VALUE rb_cDoubleScalar;
|
11
12
|
VALUE rb_cDoubleArray;
|
12
13
|
VALUE rb_mUnsafeDouble;
|
13
14
|
VALUE rb_cDoubleBiquad;
|
15
|
+
VALUE rb_cDoubleFFT;
|
14
16
|
|
15
17
|
|
16
18
|
// Array native resource
|
17
19
|
|
18
|
-
void vdsp_array_native_resource_delete(VdspArrayNativeResource *
|
20
|
+
void vdsp_array_native_resource_delete(VdspArrayNativeResource *p)
|
19
21
|
{
|
20
22
|
if (p->v.ptr) {
|
21
23
|
free(p->v.ptr);
|
@@ -32,7 +34,7 @@ VdspArrayNativeResource* get_vdsp_array_native_resource(VALUE va)
|
|
32
34
|
|
33
35
|
VALUE resource = rb_iv_get(va, "native_resource");
|
34
36
|
if (resource==Qnil) {
|
35
|
-
|
37
|
+
rb_raise(rb_eArgError, "Vdsp::Array has no native resource");
|
36
38
|
}
|
37
39
|
|
38
40
|
VdspArrayNativeResource *p;
|
@@ -59,7 +61,7 @@ void array_param2(VdspArrayParam *param, VALUE arr0, VALUE arr1, VALUE offset, V
|
|
59
61
|
|
60
62
|
// Biquad native resource
|
61
63
|
|
62
|
-
void vdsp_biquad_native_resource_delete(VdspBiquadNativeResource *
|
64
|
+
void vdsp_biquad_native_resource_delete(VdspBiquadNativeResource *p)
|
63
65
|
{
|
64
66
|
if (p->setup.ptr) {
|
65
67
|
if (p->type=='d') {
|
@@ -82,7 +84,7 @@ VdspBiquadNativeResource* get_vdsp_biquad_native_resource(VALUE vb)
|
|
82
84
|
|
83
85
|
VALUE resource = rb_iv_get(vb, "native_resource");
|
84
86
|
if (resource==Qnil) {
|
85
|
-
|
87
|
+
rb_raise(rb_eArgError, "Vdsp::Biquad has no native resource");
|
86
88
|
}
|
87
89
|
|
88
90
|
VdspBiquadNativeResource *p;
|
@@ -92,6 +94,36 @@ VdspBiquadNativeResource* get_vdsp_biquad_native_resource(VALUE vb)
|
|
92
94
|
}
|
93
95
|
|
94
96
|
|
97
|
+
// FFT native resource
|
98
|
+
|
99
|
+
void vdsp_fft_native_resource_delete(VdspFFTNativeResource *p)
|
100
|
+
{
|
101
|
+
if (p->setup.value) {
|
102
|
+
if (p->type=='d') {
|
103
|
+
vDSP_destroy_fftsetupD(p->setup.d);
|
104
|
+
}
|
105
|
+
}
|
106
|
+
free(p);
|
107
|
+
}
|
108
|
+
|
109
|
+
VdspFFTNativeResource* get_vdsp_fft_native_resource(VALUE vf)
|
110
|
+
{
|
111
|
+
if (!rb_obj_is_kind_of(vf, rb_mVdspFFT)) {
|
112
|
+
rb_raise(rb_eArgError, "Vdsp::FFT required");
|
113
|
+
}
|
114
|
+
|
115
|
+
VALUE resource = rb_iv_get(vf, "native_resource");
|
116
|
+
if (resource==Qnil) {
|
117
|
+
rb_raise(rb_eArgError, "Vdsp::FFT has no native resource");
|
118
|
+
}
|
119
|
+
|
120
|
+
VdspFFTNativeResource *p;
|
121
|
+
Data_Get_Struct(resource, VdspFFTNativeResource, p);
|
122
|
+
|
123
|
+
return p;
|
124
|
+
}
|
125
|
+
|
126
|
+
|
95
127
|
// Vdsp::DoubleScalar
|
96
128
|
|
97
129
|
VALUE rb_double_scalar_initialize(VALUE self, VALUE val)
|
@@ -635,6 +667,7 @@ VALUE rb_double_array_resize(VALUE self, VALUE size)
|
|
635
667
|
VALUE rb_double_array_concat(int argc, const VALUE *argv, VALUE self)
|
636
668
|
{
|
637
669
|
rb_check_frozen(self);
|
670
|
+
rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
|
638
671
|
|
639
672
|
VdspArrayNativeResource *_a = get_vdsp_array_native_resource(self);
|
640
673
|
VdspArrayNativeResource *_argv[argc];
|
@@ -756,9 +789,7 @@ VALUE rb_double_array_vgen(VALUE cls, VALUE a, VALUE b, VALUE n)
|
|
756
789
|
|
757
790
|
VALUE rb_double_array_blkman_window(int argc, const VALUE *argv, VALUE cls)
|
758
791
|
{
|
759
|
-
|
760
|
-
rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 1..2)", argc);
|
761
|
-
}
|
792
|
+
rb_check_arity(argc, 1, 2);
|
762
793
|
VALUE n = argv[0];
|
763
794
|
|
764
795
|
vDSP_Length _n = NUM2LONG(n);
|
@@ -777,9 +808,7 @@ VALUE rb_double_array_blkman_window(int argc, const VALUE *argv, VALUE cls)
|
|
777
808
|
|
778
809
|
VALUE rb_double_array_hamm_window(int argc, const VALUE *argv, VALUE cls)
|
779
810
|
{
|
780
|
-
|
781
|
-
rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 1..2)", argc);
|
782
|
-
}
|
811
|
+
rb_check_arity(argc, 1, 2);
|
783
812
|
VALUE n = argv[0];
|
784
813
|
|
785
814
|
vDSP_Length _n = NUM2LONG(n);
|
@@ -798,9 +827,7 @@ VALUE rb_double_array_hamm_window(int argc, const VALUE *argv, VALUE cls)
|
|
798
827
|
|
799
828
|
VALUE rb_double_array_hann_window(int argc, const VALUE *argv, VALUE cls)
|
800
829
|
{
|
801
|
-
|
802
|
-
rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 1..2)", argc);
|
803
|
-
}
|
830
|
+
rb_check_arity(argc, 1, 2);
|
804
831
|
VALUE n = argv[0];
|
805
832
|
|
806
833
|
vDSP_Length _n = NUM2LONG(n);
|
@@ -1078,6 +1105,124 @@ VALUE rb_double_biquad_apply(VALUE self, VALUE x)
|
|
1078
1105
|
}
|
1079
1106
|
|
1080
1107
|
|
1108
|
+
// Vdsp::DoubleFFT
|
1109
|
+
|
1110
|
+
VALUE rb_double_fft_initialize(int argc, const VALUE *argv, VALUE self)
|
1111
|
+
{
|
1112
|
+
rb_check_arity(argc, 1, 2);
|
1113
|
+
long length = NUM2LONG(argv[0]);
|
1114
|
+
FFTRadix radix = kFFTRadix2;
|
1115
|
+
if (argc==2) {
|
1116
|
+
radix = (FFTRadix)NUM2LONG(argv[1]);
|
1117
|
+
}
|
1118
|
+
|
1119
|
+
VdspFFTNativeResource *p = ALLOC(VdspFFTNativeResource);
|
1120
|
+
p->type = 'd';
|
1121
|
+
p->length = 0;
|
1122
|
+
p->log2n = 0;
|
1123
|
+
p->radix = 0;
|
1124
|
+
p->setup.value = NULL;
|
1125
|
+
|
1126
|
+
VALUE resource = Data_Wrap_Struct(CLASS_OF(self), 0, vdsp_fft_native_resource_delete, p);
|
1127
|
+
rb_iv_set(self, "native_resource", resource);
|
1128
|
+
|
1129
|
+
p->length = length;
|
1130
|
+
p->halflength = length / 2;
|
1131
|
+
p->log2n = log2(length);
|
1132
|
+
p->radix = radix;
|
1133
|
+
p->setup.d = vDSP_create_fftsetupD(p->log2n, radix);
|
1134
|
+
|
1135
|
+
return self;
|
1136
|
+
}
|
1137
|
+
|
1138
|
+
VALUE double_fft_forward1(VALUE fft, VALUE va)
|
1139
|
+
{
|
1140
|
+
VdspFFTNativeResource *_vf = get_vdsp_fft_native_resource(fft);
|
1141
|
+
VdspArrayNativeResource *_va = get_vdsp_array_native_resource(va);
|
1142
|
+
|
1143
|
+
if (_vf->length!=_va->length) {
|
1144
|
+
rb_raise(rb_eArgError, "wrong length: Vdsp::FFT=%ld Vdsp::Array(real)=%ld", _vf->length, _va->length);
|
1145
|
+
}
|
1146
|
+
|
1147
|
+
VALUE lenv = LONG2NUM(_vf->halflength);
|
1148
|
+
VALUE real = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
|
1149
|
+
VALUE imag = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
|
1150
|
+
VdspArrayNativeResource *_real = get_vdsp_array_native_resource(real);
|
1151
|
+
VdspArrayNativeResource *_imag = get_vdsp_array_native_resource(imag);
|
1152
|
+
|
1153
|
+
DSPDoubleSplitComplex z;
|
1154
|
+
z.realp = _real->v.d;
|
1155
|
+
z.imagp = _imag->v.d;
|
1156
|
+
|
1157
|
+
vDSP_ctozD((DSPDoubleComplex *)_va->v.d, 2, &z, 1, _vf->halflength);
|
1158
|
+
vDSP_fft_zripD(_vf->setup.d, &z, 1, _vf->log2n, FFT_FORWARD);
|
1159
|
+
|
1160
|
+
double scale = 1.0 / (_vf->length * 2);
|
1161
|
+
vDSP_vsmulD(z.realp, 1, &scale, z.realp, 1, _vf->halflength);
|
1162
|
+
vDSP_vsmulD(z.imagp, 1, &scale, z.imagp, 1, _vf->halflength);
|
1163
|
+
|
1164
|
+
return rb_assoc_new(real, imag);
|
1165
|
+
}
|
1166
|
+
|
1167
|
+
VALUE double_fft_forward2(VALUE fft, VALUE real, VALUE imag)
|
1168
|
+
{
|
1169
|
+
VdspFFTNativeResource *_vf = get_vdsp_fft_native_resource(fft);
|
1170
|
+
VdspArrayNativeResource *_real = get_vdsp_array_native_resource(real);
|
1171
|
+
VdspArrayNativeResource *_imag = get_vdsp_array_native_resource(imag);
|
1172
|
+
|
1173
|
+
if (_vf->length!=_real->length || _real->length!=_imag->length) {
|
1174
|
+
rb_raise(rb_eArgError, "wrong length: Vdsp::FFT=%ld Vdsp::Array(real)=%ld Vdsp::Array(imag)=%ld", _vf->length, _real->length, _imag->length);
|
1175
|
+
}
|
1176
|
+
|
1177
|
+
real = rb_funcall(real, rb_intern("clone"), 0);
|
1178
|
+
imag = rb_funcall(imag, rb_intern("clone"), 0);
|
1179
|
+
_real = get_vdsp_array_native_resource(real);
|
1180
|
+
_imag = get_vdsp_array_native_resource(imag);
|
1181
|
+
|
1182
|
+
DSPDoubleSplitComplex z;
|
1183
|
+
z.realp = _real->v.d;
|
1184
|
+
z.imagp = _imag->v.d;
|
1185
|
+
|
1186
|
+
vDSP_fft_zipD(_vf->setup.d, &z, 1, _vf->log2n, FFT_FORWARD);
|
1187
|
+
|
1188
|
+
double scale = 1.0 / _vf->length;
|
1189
|
+
vDSP_vsmulD(z.realp, 1, &scale, z.realp, 1, _vf->length);
|
1190
|
+
vDSP_vsmulD(z.imagp, 1, &scale, z.imagp, 1, _vf->length);
|
1191
|
+
|
1192
|
+
return rb_assoc_new(real, imag);
|
1193
|
+
}
|
1194
|
+
|
1195
|
+
VALUE rb_double_fft_forward(int argc, const VALUE *argv, VALUE self)
|
1196
|
+
{
|
1197
|
+
rb_check_arity(argc, 1, 2);
|
1198
|
+
if (argc==2 && argv[1]!=Qnil) {
|
1199
|
+
return double_fft_forward2(self, argv[0], argv[1]);
|
1200
|
+
}
|
1201
|
+
return double_fft_forward1(self, argv[0]);
|
1202
|
+
}
|
1203
|
+
|
1204
|
+
VALUE rb_double_fft_spectrum(int argc, const VALUE *argv, VALUE self)
|
1205
|
+
{
|
1206
|
+
VALUE ri = rb_double_fft_forward(argc, argv, self);
|
1207
|
+
VALUE real = RARRAY_AREF(ri, 0);
|
1208
|
+
VALUE imag = RARRAY_AREF(ri, 1);
|
1209
|
+
|
1210
|
+
VdspFFTNativeResource *_vf = get_vdsp_fft_native_resource(self);
|
1211
|
+
VdspArrayNativeResource *_real = get_vdsp_array_native_resource(real);
|
1212
|
+
VdspArrayNativeResource *_imag = get_vdsp_array_native_resource(imag);
|
1213
|
+
|
1214
|
+
VALUE lenv = LONG2NUM(_real->length);
|
1215
|
+
VALUE mag = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
|
1216
|
+
VdspArrayNativeResource *_mag = get_vdsp_array_native_resource(mag);
|
1217
|
+
|
1218
|
+
// real**2 + imag**2
|
1219
|
+
vDSP_vmulD(_real->v.d, 1, _real->v.d, 1, _mag->v.d, 1, _mag->length);
|
1220
|
+
vDSP_vmaD(_imag->v.d, 1, _imag->v.d, 1, _mag->v.d, 1, _mag->v.d, 1, _mag->length);
|
1221
|
+
|
1222
|
+
return mag;
|
1223
|
+
}
|
1224
|
+
|
1225
|
+
|
1081
1226
|
// Vdsp static method
|
1082
1227
|
|
1083
1228
|
// c[i] = a[i]
|
@@ -1632,9 +1777,8 @@ VALUE rb_double_vsmsma(
|
|
1632
1777
|
// e[i] = (a[i] + b[i]) * (c[i] + d[i])
|
1633
1778
|
VALUE rb_double_vaam(int argc, const VALUE *argv, VALUE cls)
|
1634
1779
|
{
|
1635
|
-
|
1636
|
-
|
1637
|
-
}
|
1780
|
+
rb_check_arity(argc, 16, 16);
|
1781
|
+
|
1638
1782
|
VALUE a = argv[0];
|
1639
1783
|
VALUE a_offset = argv[1];
|
1640
1784
|
VALUE a_stride = argv[2];
|
@@ -1680,9 +1824,8 @@ VALUE rb_double_vaam(int argc, const VALUE *argv, VALUE cls)
|
|
1680
1824
|
// e[i] = (a[i] * b[i]) - (c[i] * d[i])
|
1681
1825
|
VALUE rb_double_vmmsb(int argc, const VALUE *argv, VALUE cls)
|
1682
1826
|
{
|
1683
|
-
|
1684
|
-
|
1685
|
-
}
|
1827
|
+
rb_check_arity(argc, 16, 16);
|
1828
|
+
|
1686
1829
|
VALUE a = argv[0];
|
1687
1830
|
VALUE a_offset = argv[1];
|
1688
1831
|
VALUE a_stride = argv[2];
|
@@ -1728,9 +1871,8 @@ VALUE rb_double_vmmsb(int argc, const VALUE *argv, VALUE cls)
|
|
1728
1871
|
// e[i] = (a[i] - b[i]) * (c[i] - d[i])
|
1729
1872
|
VALUE rb_double_vsbsbm(int argc, const VALUE *argv, VALUE cls)
|
1730
1873
|
{
|
1731
|
-
|
1732
|
-
|
1733
|
-
}
|
1874
|
+
rb_check_arity(argc, 16, 16);
|
1875
|
+
|
1734
1876
|
VALUE a = argv[0];
|
1735
1877
|
VALUE a_offset = argv[1];
|
1736
1878
|
VALUE a_stride = argv[2];
|
@@ -1776,9 +1918,8 @@ VALUE rb_double_vsbsbm(int argc, const VALUE *argv, VALUE cls)
|
|
1776
1918
|
// e[i] = (a[i] + b[i]) * (c[i] - d[i])
|
1777
1919
|
VALUE rb_double_vasbm(int argc, const VALUE *argv, VALUE cls)
|
1778
1920
|
{
|
1779
|
-
|
1780
|
-
|
1781
|
-
}
|
1921
|
+
rb_check_arity(argc, 16, 16);
|
1922
|
+
|
1782
1923
|
VALUE a = argv[0];
|
1783
1924
|
VALUE a_offset = argv[1];
|
1784
1925
|
VALUE a_stride = argv[2];
|
@@ -2426,7 +2567,7 @@ VALUE rb_double_vswap(
|
|
2426
2567
|
_n
|
2427
2568
|
);
|
2428
2569
|
|
2429
|
-
return
|
2570
|
+
return rb_assoc_new(a, b);
|
2430
2571
|
}
|
2431
2572
|
|
2432
2573
|
VALUE rb_double_vtmerg(
|
@@ -2831,6 +2972,19 @@ void Init_vdsp()
|
|
2831
2972
|
rb_define_method(rb_cDoubleBiquad, "coefficients", rb_double_biquad_get_coefficients, 0);
|
2832
2973
|
rb_define_method(rb_cDoubleBiquad, "apply", rb_double_biquad_apply, 1);
|
2833
2974
|
|
2975
|
+
// Vdsp::FFT
|
2976
|
+
rb_mVdspFFT = rb_define_module_under(rb_mVdsp, "FFT");
|
2977
|
+
rb_define_const(rb_mVdspFFT, "Radix2", LONG2NUM(kFFTRadix2));
|
2978
|
+
rb_define_const(rb_mVdspFFT, "Radix3", LONG2NUM(kFFTRadix3));
|
2979
|
+
rb_define_const(rb_mVdspFFT, "Radix5", LONG2NUM(kFFTRadix5));
|
2980
|
+
|
2981
|
+
// Vdsp::DoubleFFT
|
2982
|
+
rb_cDoubleFFT = rb_define_class_under(rb_mVdsp, "DoubleFFT", rb_cObject);
|
2983
|
+
rb_include_module(rb_cDoubleFFT, rb_mVdspFFT);
|
2984
|
+
rb_define_method(rb_cDoubleFFT, "initialize", rb_double_fft_initialize, -1);
|
2985
|
+
rb_define_method(rb_cDoubleFFT, "forward", rb_double_fft_forward, -1);
|
2986
|
+
rb_define_method(rb_cDoubleFFT, "spectrum", rb_double_fft_spectrum, -1);
|
2987
|
+
|
2834
2988
|
// Vdsp::UnsafeDouble
|
2835
2989
|
rb_mUnsafeDouble = rb_define_module_under(rb_mVdsp, "UnsafeDouble");
|
2836
2990
|
rb_define_singleton_method(rb_mUnsafeDouble, "copy", rb_double_copy, 7);
|
data/ext/vdsp/vdsp.h
CHANGED
@@ -45,6 +45,23 @@ typedef struct {
|
|
45
45
|
} VdspBiquadNativeResource;
|
46
46
|
|
47
47
|
|
48
|
+
// VdspFFT
|
49
|
+
|
50
|
+
typedef union {
|
51
|
+
void *value;
|
52
|
+
FFTSetupD d;
|
53
|
+
} VdspFFTSetup;
|
54
|
+
|
55
|
+
typedef struct {
|
56
|
+
char type;
|
57
|
+
VdspFFTSetup setup;
|
58
|
+
unsigned long length;
|
59
|
+
unsigned long halflength;
|
60
|
+
vDSP_Length log2n;
|
61
|
+
FFTRadix radix;
|
62
|
+
} VdspFFTNativeResource;
|
63
|
+
|
64
|
+
|
48
65
|
extern VALUE rb_double_array_plus(VALUE self, VALUE other);
|
49
66
|
extern VALUE rb_double_array_mul(VALUE self, VALUE other);
|
50
67
|
extern void double_array_resize(VdspArrayNativeResource *_a, unsigned long len);
|
data/lib/vdsp/version.rb
CHANGED
data/lib/vdsp.rb
CHANGED
@@ -5,6 +5,23 @@ module Vdsp
|
|
5
5
|
class Error < StandardError; end
|
6
6
|
# Your code goes here...
|
7
7
|
|
8
|
+
module Array
|
9
|
+
def blkman_window(flag=FULL_WINDOW)
|
10
|
+
window = self.class.blkman_window(self.length, flag)
|
11
|
+
self * window
|
12
|
+
end
|
13
|
+
|
14
|
+
def hamm_window(flag=FULL_WINDOW)
|
15
|
+
window = self.class.hamm_window(self.length, flag)
|
16
|
+
self * window
|
17
|
+
end
|
18
|
+
|
19
|
+
def hann_window(flag=FULL_WINDOW)
|
20
|
+
window = self.class.hann_window(self.length, flag)
|
21
|
+
self * window
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
8
25
|
module Biquad
|
9
26
|
Coefficient = Struct.new("Coefficient", :b0, :b1, :b2, :a1, :a2)
|
10
27
|
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.
|
4
|
+
version: 1.11.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-
|
11
|
+
date: 2019-11-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|