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