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 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