vdsp 1.11.0 → 1.12.0

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