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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7cd18e0b6e9eef27106756446b21cadd2e1cb8f2a2bfada08e4651aab9c6fd34
4
- data.tar.gz: 6576aa464cdaaace4c13a6bab237c7dd36f2f057955527c995d723bb7ac86f6a
3
+ metadata.gz: fa99481dbf2b00907473c9af631b12bf886d7057eeec5522ed48aec918d21bfc
4
+ data.tar.gz: 93410ea00651167eb8fe11728cf47e24593cfb49c8c8220550165dfd0cea1c3f
5
5
  SHA512:
6
- metadata.gz: c60da222d0d562ed6b093af5a07888bd528157c742c9402b0b9563c1061af21f1a9a5f0d34b39d084365348e9ff190b2590f6a80652bc247b4264dfba69354a1
7
- data.tar.gz: 4747c95fc60e550c82590ff00a0fe2990ae095226cbb0ff298bab037fdf2b06aaf7d0502ade4d46092e4d1c2aab074df8b780a7c6df15800c6063e4eb1cd9924
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 * p)
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
- return NULL;
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 * p)
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
- return NULL;
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
- if (argc<1 || 2<argc) {
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
- if (argc<1 || 2<argc) {
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
- if (argc<1 || 2<argc) {
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
- if (argc!=16) {
1636
- rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 16)", argc);
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
- if (argc!=16) {
1684
- rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 16)", argc);
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
- if (argc!=16) {
1732
- rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 16)", argc);
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
- if (argc!=16) {
1780
- rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 16)", argc);
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 rb_ary_new3(2, a, b);
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
@@ -1,3 +1,3 @@
1
1
  module Vdsp
2
- VERSION = "1.10.0"
2
+ VERSION = "1.11.0"
3
3
  end
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.10.0
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-10-23 00:00:00.000000000 Z
11
+ date: 2019-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler