vdsp 1.11.0 → 1.12.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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/ext/vdsp/vdsp.c +95 -11
  3. data/lib/vdsp/version.rb +1 -1
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa99481dbf2b00907473c9af631b12bf886d7057eeec5522ed48aec918d21bfc
4
- data.tar.gz: 93410ea00651167eb8fe11728cf47e24593cfb49c8c8220550165dfd0cea1c3f
3
+ metadata.gz: a957ab0300b98fe324433a6ce9c6df4a7675fb9a0236121277cf9108f4296afa
4
+ data.tar.gz: f5496fd85f20e5101453cf42bd290c58d7d13b5cb1fde34bad41c53bc7901285
5
5
  SHA512:
6
- metadata.gz: eb0e1248e5a7deedc29bccc11e2d038f36e16723015bae32f7123beb0831819722a5ab148de45af60416a21d6eee2be798ad049788e3373a669e26252e8f41e0
7
- data.tar.gz: 21921f2e175eac1aa4818fce034d0e88310a4136a0f20d2002bf006df9cc1dd1a8e9106513ca8fa912445bed4956b3895f0639c89c011df09579dfb7d56313cd
6
+ metadata.gz: 150786ad2737a6fd5eb949c0a8e1aeea96650f051463bc21d70f92770b5694947db0067b6b2cf865331d3a0590be99767729418b0a64b05f5f0fd1ad81591b11
7
+ data.tar.gz: 250b4b1ebce4641842d2b683695bab52c4c4db062a4358b8ea1aa81d0d500ae41f080c936d8434872b83670a551644774de2d5f61b7e1f072fb9ad548fb5791e
data/ext/vdsp/vdsp.c CHANGED
@@ -1135,7 +1135,7 @@ VALUE rb_double_fft_initialize(int argc, const VALUE *argv, VALUE self)
1135
1135
  return self;
1136
1136
  }
1137
1137
 
1138
- VALUE double_fft_forward1(VALUE fft, VALUE va)
1138
+ VALUE double_fft_forward_r(VALUE fft, VALUE va)
1139
1139
  {
1140
1140
  VdspFFTNativeResource *_vf = get_vdsp_fft_native_resource(fft);
1141
1141
  VdspArrayNativeResource *_va = get_vdsp_array_native_resource(va);
@@ -1164,7 +1164,7 @@ VALUE double_fft_forward1(VALUE fft, VALUE va)
1164
1164
  return rb_assoc_new(real, imag);
1165
1165
  }
1166
1166
 
1167
- VALUE double_fft_forward2(VALUE fft, VALUE real, VALUE imag)
1167
+ VALUE double_fft_forward_z(VALUE fft, VALUE real, VALUE imag)
1168
1168
  {
1169
1169
  VdspFFTNativeResource *_vf = get_vdsp_fft_native_resource(fft);
1170
1170
  VdspArrayNativeResource *_real = get_vdsp_array_native_resource(real);
@@ -1196,9 +1196,68 @@ VALUE rb_double_fft_forward(int argc, const VALUE *argv, VALUE self)
1196
1196
  {
1197
1197
  rb_check_arity(argc, 1, 2);
1198
1198
  if (argc==2 && argv[1]!=Qnil) {
1199
- return double_fft_forward2(self, argv[0], argv[1]);
1199
+ return double_fft_forward_z(self, argv[0], argv[1]);
1200
+ }
1201
+ return double_fft_forward_r(self, argv[0]);
1202
+ }
1203
+
1204
+ VALUE double_fft_inverse_r(VALUE fft, VALUE real, VALUE imag)
1205
+ {
1206
+ real = rb_funcall(real, rb_intern("clone"), 0);
1207
+ imag = rb_funcall(imag, rb_intern("clone"), 0);
1208
+
1209
+ VdspFFTNativeResource *_vf = get_vdsp_fft_native_resource(fft);
1210
+ VdspArrayNativeResource *_real = get_vdsp_array_native_resource(real);
1211
+ VdspArrayNativeResource *_imag = get_vdsp_array_native_resource(imag);
1212
+
1213
+ DSPDoubleSplitComplex z;
1214
+ z.realp = _real->v.d;
1215
+ z.imagp = _imag->v.d;
1216
+
1217
+ vDSP_fft_zripD(_vf->setup.d, &z, 1, _vf->log2n, FFT_INVERSE);
1218
+
1219
+ VALUE lenv = LONG2NUM(_vf->length);
1220
+ VALUE inverse = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
1221
+ VdspArrayNativeResource *_inverse = get_vdsp_array_native_resource(inverse);
1222
+
1223
+ vDSP_ztocD(&z, 1, (DSPDoubleComplex *)_inverse->v.d, 2, _vf->halflength);
1224
+
1225
+ return rb_assoc_new(inverse, Qnil);
1226
+ }
1227
+
1228
+ VALUE double_fft_inverse_z(VALUE fft, VALUE real, VALUE imag)
1229
+ {
1230
+ real = rb_funcall(real, rb_intern("clone"), 0);
1231
+ imag = rb_funcall(imag, rb_intern("clone"), 0);
1232
+
1233
+ VdspFFTNativeResource *_vf = get_vdsp_fft_native_resource(fft);
1234
+ VdspArrayNativeResource *_real = get_vdsp_array_native_resource(real);
1235
+ VdspArrayNativeResource *_imag = get_vdsp_array_native_resource(imag);
1236
+
1237
+ DSPDoubleSplitComplex z;
1238
+ z.realp = _real->v.d;
1239
+ z.imagp = _imag->v.d;
1240
+
1241
+ vDSP_fft_zipD(_vf->setup.d, &z, 1, _vf->log2n, FFT_INVERSE);
1242
+
1243
+ return rb_assoc_new(real, imag);
1244
+ }
1245
+
1246
+ VALUE rb_double_fft_inverse(VALUE self, VALUE real, VALUE imag)
1247
+ {
1248
+ VdspFFTNativeResource *_vf = get_vdsp_fft_native_resource(self);
1249
+ VdspArrayNativeResource *_real = get_vdsp_array_native_resource(real);
1250
+ VdspArrayNativeResource *_imag = get_vdsp_array_native_resource(imag);
1251
+
1252
+ if (_vf->length==_real->length) {
1253
+ return double_fft_inverse_z(self, real, imag);
1254
+
1255
+ } else if (_vf->halflength==_real->length) {
1256
+ return double_fft_inverse_r(self, real, imag);
1257
+
1258
+ } else {
1259
+ rb_raise(rb_eArgError, "wrong length: Vdsp::FFT=%ld Vdsp::Array(real)=%ld Vdsp::Array(imag)=%ld", _vf->length, _real->length, _imag->length);
1200
1260
  }
1201
- return double_fft_forward1(self, argv[0]);
1202
1261
  }
1203
1262
 
1204
1263
  VALUE rb_double_fft_spectrum(int argc, const VALUE *argv, VALUE self)
@@ -1207,19 +1266,42 @@ VALUE rb_double_fft_spectrum(int argc, const VALUE *argv, VALUE self)
1207
1266
  VALUE real = RARRAY_AREF(ri, 0);
1208
1267
  VALUE imag = RARRAY_AREF(ri, 1);
1209
1268
 
1210
- VdspFFTNativeResource *_vf = get_vdsp_fft_native_resource(self);
1211
1269
  VdspArrayNativeResource *_real = get_vdsp_array_native_resource(real);
1212
1270
  VdspArrayNativeResource *_imag = get_vdsp_array_native_resource(imag);
1213
1271
 
1214
- VALUE lenv = LONG2NUM(_real->length);
1215
- VALUE mag = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
1272
+ DSPDoubleSplitComplex z;
1273
+ z.realp = _real->v.d;
1274
+ z.imagp = _imag->v.d;
1275
+
1276
+ VALUE lenv = LONG2NUM(_real->length*2);
1277
+ VALUE tmp = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
1278
+ VdspArrayNativeResource *_tmp = get_vdsp_array_native_resource(tmp);
1279
+
1280
+ vDSP_ztocD(&z, 1, (DSPDoubleComplex *)_tmp->v.d, 2, _real->length);
1281
+ vDSP_polarD(_tmp->v.d, 2, _tmp->v.d, 2, _real->length);
1282
+ vDSP_ctozD((DSPDoubleComplex *)_tmp->v.d, 2, &z, 1, _real->length);
1283
+
1284
+ return rb_assoc_new(real, imag);
1285
+ }
1286
+
1287
+ VALUE rb_double_fft_inverse_spectrum(VALUE self, VALUE mag, VALUE pha)
1288
+ {
1216
1289
  VdspArrayNativeResource *_mag = get_vdsp_array_native_resource(mag);
1290
+ VdspArrayNativeResource *_pha = get_vdsp_array_native_resource(pha);
1291
+
1292
+ DSPDoubleSplitComplex z;
1293
+ z.realp = _mag->v.d;
1294
+ z.imagp = _pha->v.d;
1295
+
1296
+ VALUE lenv = LONG2NUM(_mag->length*2);
1297
+ VALUE tmp = rb_class_new_instance(1, &lenv, rb_cDoubleArray);
1298
+ VdspArrayNativeResource *_tmp = get_vdsp_array_native_resource(tmp);
1217
1299
 
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);
1300
+ vDSP_ztocD(&z, 1, (DSPDoubleComplex *)_tmp->v.d, 2, _mag->length);
1301
+ vDSP_rectD(_tmp->v.d, 2, _tmp->v.d, 2, _mag->length);
1302
+ vDSP_ctozD((DSPDoubleComplex *)_tmp->v.d, 2, &z, 1, _mag->length);
1221
1303
 
1222
- return mag;
1304
+ return rb_double_fft_inverse(self, mag, pha);
1223
1305
  }
1224
1306
 
1225
1307
 
@@ -2983,7 +3065,9 @@ void Init_vdsp()
2983
3065
  rb_include_module(rb_cDoubleFFT, rb_mVdspFFT);
2984
3066
  rb_define_method(rb_cDoubleFFT, "initialize", rb_double_fft_initialize, -1);
2985
3067
  rb_define_method(rb_cDoubleFFT, "forward", rb_double_fft_forward, -1);
3068
+ rb_define_method(rb_cDoubleFFT, "inverse", rb_double_fft_inverse, 2);
2986
3069
  rb_define_method(rb_cDoubleFFT, "spectrum", rb_double_fft_spectrum, -1);
3070
+ rb_define_method(rb_cDoubleFFT, "inverse_spectrum", rb_double_fft_inverse_spectrum, 2);
2987
3071
 
2988
3072
  // Vdsp::UnsafeDouble
2989
3073
  rb_mUnsafeDouble = rb_define_module_under(rb_mVdsp, "UnsafeDouble");
data/lib/vdsp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Vdsp
2
- VERSION = "1.11.0"
2
+ VERSION = "1.12.0"
3
3
  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.11.0
4
+ version: 1.12.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-06 00:00:00.000000000 Z
11
+ date: 2019-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler