numo-pocketfft 0.1.0 → 0.1.1
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 +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +2 -0
- data/ext/numo/pocketfft/pocketfftext.c +45 -9
- data/lib/numo/pocketfft.rb +36 -0
- data/lib/numo/pocketfft/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 170eebc1e93586a62ba569d77a3a48bf8c1deb2a
|
4
|
+
data.tar.gz: a40006057f6538de447002968f1e5d17d7f72ab3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a93c018c1f75ad1c903d5235e874ed6e881cddf33523ac9be7ebff7c047e2767561db48204c2a5ec13f72d243cee1e49394bfa0362b63b20f395245801700d9
|
7
|
+
data.tar.gz: 4c23f877e13768d2641f69ddf000b54603038df559b250179a320f395c0920f31a162cfb76b2bde310add0ea1ce8f8b5540da8429dfaf2b93b9c64dc5ca8539c
|
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
# Numo::Pocketfft
|
2
2
|
|
3
|
+
[](https://badge.fury.io/rb/numo-pocketfft)
|
3
4
|
[](https://travis-ci.org/yoshoku/numo-pocketfft)
|
4
5
|
[](https://coveralls.io/github/yoshoku/numo-pocketfft?branch=master)
|
5
6
|
[](https://github.com/yoshoku/numo-liblinear/blob/master/LICENSE.txt)
|
7
|
+
[](http://www.rubydoc.info/gems/numo-pocketfft/0.1.1)
|
6
8
|
|
7
9
|
Numo::Pocketfft provides functions for performing descrete Fourier Transform with
|
8
10
|
[Numo::NArray](https://github.com/ruby-numo/numo-narray) by using
|
@@ -12,6 +12,7 @@ VALUE numo_pocketfft_fft(VALUE x_val, int is_forward)
|
|
12
12
|
int n_repeats;
|
13
13
|
int i;
|
14
14
|
int res;
|
15
|
+
int fail;
|
15
16
|
double fct;
|
16
17
|
VALUE z_val;
|
17
18
|
double* z_pt;
|
@@ -30,22 +31,27 @@ VALUE numo_pocketfft_fft(VALUE x_val, int is_forward)
|
|
30
31
|
length = NA_SHAPE(x_nary)[n_dims - 1];
|
31
32
|
x_pt = (double*)na_get_pointer_for_read(x_val);
|
32
33
|
|
34
|
+
plan = make_cfft_plan(length);
|
35
|
+
if (!plan) {
|
36
|
+
rb_raise(rb_eNoMemError, "Failed to allocate memory for plan of pocketfft.");
|
37
|
+
return Qnil;
|
38
|
+
}
|
39
|
+
|
33
40
|
z_val = nary_s_new_like(numo_cDComplex, x_val);
|
34
41
|
z_pt = (double*)na_get_pointer_for_write(z_val);
|
35
42
|
GetNArray(z_val, z_nary);
|
36
43
|
for (i = 0; i < (int)(NA_SIZE(z_nary) * 2); z_pt[i++] = 0.0);
|
37
44
|
|
45
|
+
fail = 0;
|
38
46
|
fct = is_forward == 1 ? 1.0 : 1.0 / length;
|
39
|
-
plan = make_cfft_plan(length);
|
40
|
-
if (!plan) {
|
41
|
-
return Qnil;
|
42
|
-
}
|
43
|
-
|
44
47
|
n_repeats = (int)(NA_SIZE(x_nary)) / length;
|
45
48
|
for (i = 0; i < n_repeats; i++) {
|
46
49
|
memcpy(z_pt, x_pt, 2 * length * sizeof(double));
|
47
50
|
res = is_forward == 1 ? cfft_forward(plan, z_pt, fct) : cfft_backward(plan, z_pt, fct);
|
48
|
-
if (res != 0) {
|
51
|
+
if (res != 0) {
|
52
|
+
fail = 1;
|
53
|
+
break;
|
54
|
+
}
|
49
55
|
z_pt += length * 2;
|
50
56
|
x_pt += length * 2;
|
51
57
|
}
|
@@ -54,6 +60,12 @@ VALUE numo_pocketfft_fft(VALUE x_val, int is_forward)
|
|
54
60
|
destroy_cfft_plan(plan);
|
55
61
|
}
|
56
62
|
|
63
|
+
if (fail) {
|
64
|
+
rb_raise(rb_eNoMemError, "Failed to allocate memory in function of pocketfft.");
|
65
|
+
rb_funcall(z_val, rb_intern("free"), 0);
|
66
|
+
return Qnil;
|
67
|
+
}
|
68
|
+
|
57
69
|
return z_val;
|
58
70
|
}
|
59
71
|
|
@@ -84,6 +96,7 @@ static VALUE numo_pocketfft_rfft(VALUE self, VALUE x_val)
|
|
84
96
|
size_t length;
|
85
97
|
int n_repeats;
|
86
98
|
int i;
|
99
|
+
int fail;
|
87
100
|
size_t* z_shape;
|
88
101
|
VALUE z_val;
|
89
102
|
narray_t* z_nary;
|
@@ -105,6 +118,7 @@ static VALUE numo_pocketfft_rfft(VALUE self, VALUE x_val)
|
|
105
118
|
|
106
119
|
plan = make_rfft_plan(length);
|
107
120
|
if (!plan) {
|
121
|
+
rb_raise(rb_eNoMemError, "Failed to allocate memory for plan of pocketfft.");
|
108
122
|
return Qnil;
|
109
123
|
}
|
110
124
|
|
@@ -118,12 +132,16 @@ static VALUE numo_pocketfft_rfft(VALUE self, VALUE x_val)
|
|
118
132
|
GetNArray(z_val, z_nary);
|
119
133
|
for (i = 0; i < (int)(NA_SIZE(z_nary) * 2); z_pt[i++] = 0.0);
|
120
134
|
|
135
|
+
fail = 0;
|
121
136
|
z_step = (int)(NA_SHAPE(z_nary)[n_dims - 1]) * 2;
|
122
137
|
n_repeats = (int)(NA_SIZE(x_nary)) / length;
|
123
138
|
for (i = 0; i < n_repeats; i++) {
|
124
139
|
z_pt[z_step - 1] = 0.0;
|
125
140
|
memcpy(z_pt + 1, x_pt, length * sizeof(double));
|
126
|
-
if (rfft_forward(plan, z_pt + 1, 1.0) != 0) {
|
141
|
+
if (rfft_forward(plan, z_pt + 1, 1.0) != 0) {
|
142
|
+
fail = 1;
|
143
|
+
break;
|
144
|
+
}
|
127
145
|
z_pt[0] = z_pt[1];
|
128
146
|
z_pt[1] = 0.0;
|
129
147
|
z_pt += z_step;
|
@@ -134,6 +152,12 @@ static VALUE numo_pocketfft_rfft(VALUE self, VALUE x_val)
|
|
134
152
|
destroy_rfft_plan(plan);
|
135
153
|
}
|
136
154
|
|
155
|
+
if (fail) {
|
156
|
+
rb_raise(rb_eNoMemError, "Failed to allocate memory in function of pocketfft.");
|
157
|
+
rb_funcall(z_val, rb_intern("free"), 0);
|
158
|
+
return Qnil;
|
159
|
+
}
|
160
|
+
|
137
161
|
return z_val;
|
138
162
|
}
|
139
163
|
|
@@ -148,6 +172,7 @@ static VALUE numo_pocketfft_irfft(VALUE self, VALUE x_val)
|
|
148
172
|
int n_dims;
|
149
173
|
int n_repeats;
|
150
174
|
int i;
|
175
|
+
int fail;
|
151
176
|
double fct;
|
152
177
|
size_t* z_shape;
|
153
178
|
VALUE z_val;
|
@@ -166,10 +191,10 @@ static VALUE numo_pocketfft_irfft(VALUE self, VALUE x_val)
|
|
166
191
|
n_dims = NA_NDIM(x_nary);
|
167
192
|
length = NA_SHAPE(x_nary)[n_dims - 1];
|
168
193
|
x_pt = (double*)na_get_pointer_for_read(x_val);
|
169
|
-
fct = 1.0 / length;
|
170
194
|
|
171
195
|
plan = make_rfft_plan(length);
|
172
196
|
if (!plan) {
|
197
|
+
rb_raise(rb_eNoMemError, "Failed to allocate memory for plan of pocketfft.");
|
173
198
|
return Qnil;
|
174
199
|
}
|
175
200
|
|
@@ -183,11 +208,16 @@ static VALUE numo_pocketfft_irfft(VALUE self, VALUE x_val)
|
|
183
208
|
GetNArray(z_val, z_nary);
|
184
209
|
for (i = 0; i < (int)NA_SIZE(z_nary); z_pt[i++] = 0.0);
|
185
210
|
|
211
|
+
fail = 0;
|
212
|
+
fct = 1.0 / length;
|
186
213
|
n_repeats = (int)(NA_SIZE(z_nary)) / length;
|
187
214
|
for (i = 0; i < n_repeats; i++) {
|
188
215
|
memcpy(z_pt + 1, x_pt + 2, (length - 1) * sizeof(double));
|
189
216
|
z_pt[0] = x_pt[0];
|
190
|
-
if (rfft_backward(plan, z_pt, fct) != 0) {
|
217
|
+
if (rfft_backward(plan, z_pt, fct) != 0) {
|
218
|
+
fail = 1;
|
219
|
+
break;
|
220
|
+
}
|
191
221
|
z_pt += length;
|
192
222
|
x_pt += length * 2;
|
193
223
|
}
|
@@ -196,6 +226,12 @@ static VALUE numo_pocketfft_irfft(VALUE self, VALUE x_val)
|
|
196
226
|
destroy_rfft_plan(plan);
|
197
227
|
}
|
198
228
|
|
229
|
+
if (fail) {
|
230
|
+
rb_raise(rb_eNoMemError, "Failed to allocate memory in function of pocketfft.");
|
231
|
+
rb_funcall(z_val, rb_intern("free"), 0);
|
232
|
+
return Qnil;
|
233
|
+
}
|
234
|
+
|
199
235
|
return z_val;
|
200
236
|
}
|
201
237
|
|
data/lib/numo/pocketfft.rb
CHANGED
@@ -12,7 +12,10 @@ module Numo
|
|
12
12
|
# @param a [Numo::DFloat/Numo::DComplex] Real or complex 1-dimensional input array.
|
13
13
|
# @return [Numo::DComplex] Transformed data.
|
14
14
|
def fft(a)
|
15
|
+
raise ArgumentError, 'Expect class of input array to be Numo::NArray.' unless a.is_a?(Numo::NArray)
|
16
|
+
raise ArgumentError, 'Expect input array to be non-empty.' if a.empty?
|
15
17
|
raise ArgumentError, 'Expect input array to be one-dimensional.' unless a.ndim == 1
|
18
|
+
|
16
19
|
raw_fft(a, 0, inverse: false, real: false)
|
17
20
|
end
|
18
21
|
|
@@ -20,7 +23,10 @@ module Numo
|
|
20
23
|
# @param a [Numo::DComplex] Complex 1-dimensional input array.
|
21
24
|
# @return [Numo::DComplex] Inversed transformed data.
|
22
25
|
def ifft(a)
|
26
|
+
raise ArgumentError, 'Expect class of input array to be Numo::NArray.' unless a.is_a?(Numo::NArray)
|
27
|
+
raise ArgumentError, 'Expect input array to be non-empty.' if a.empty?
|
23
28
|
raise ArgumentError, 'Expect input array to be one-dimensional.' unless a.ndim == 1
|
29
|
+
|
24
30
|
raw_fft(a, 0, inverse: true, real: false)
|
25
31
|
end
|
26
32
|
|
@@ -28,7 +34,10 @@ module Numo
|
|
28
34
|
# @param a [Numo::DFloat/Numo::DComplex] Real or complex 2-dimensional input array.
|
29
35
|
# @return [Numo::DComplex] Transformed data.
|
30
36
|
def fft2(a)
|
37
|
+
raise ArgumentError, 'Expect class of input array to be Numo::NArray.' unless a.is_a?(Numo::NArray)
|
38
|
+
raise ArgumentError, 'Expect input array to be non-empty.' if a.empty?
|
31
39
|
raise ArgumentError, 'Expect input array to be two-dimensional.' unless a.ndim == 2
|
40
|
+
|
32
41
|
fftn(a)
|
33
42
|
end
|
34
43
|
|
@@ -36,7 +45,10 @@ module Numo
|
|
36
45
|
# @param a [Numo::DComplex] Complex 2-dimensional input array.
|
37
46
|
# @return [Numo::DComplex] Inversed transformed data.
|
38
47
|
def ifft2(a)
|
48
|
+
raise ArgumentError, 'Expect class of input array to be Numo::NArray.' unless a.is_a?(Numo::NArray)
|
49
|
+
raise ArgumentError, 'Expect input array to be non-empty.' if a.empty?
|
39
50
|
raise ArgumentError, 'Expect input array to be two-dimensional.' unless a.ndim == 2
|
51
|
+
|
40
52
|
ifftn(a)
|
41
53
|
end
|
42
54
|
|
@@ -44,6 +56,9 @@ module Numo
|
|
44
56
|
# @param a [Numo::DFloat/Numo::DComplex] Real or complex input array with any-dimension.
|
45
57
|
# @return [Numo::DComplex] Transformed data.
|
46
58
|
def fftn(a)
|
59
|
+
raise ArgumentError, 'Expect class of input array to be Numo::NArray.' unless a.is_a?(Numo::NArray)
|
60
|
+
raise ArgumentError, 'Expect input array to be non-empty.' if a.empty?
|
61
|
+
|
47
62
|
b = a.dup
|
48
63
|
(0...b.ndim).to_a.reverse.each { |ax_id| b = raw_fft(b, ax_id, inverse: false, real: false) }
|
49
64
|
b
|
@@ -53,6 +68,9 @@ module Numo
|
|
53
68
|
# @param a [Numo::DComplex] Complex input array with any-dimension.
|
54
69
|
# @return [Numo::DComplex] Inversed transformed data.
|
55
70
|
def ifftn(a)
|
71
|
+
raise ArgumentError, 'Expect class of input array to be Numo::NArray.' unless a.is_a?(Numo::NArray)
|
72
|
+
raise ArgumentError, 'Expect input array to be non-empty.' if a.empty?
|
73
|
+
|
56
74
|
b = a.dup
|
57
75
|
(0...b.ndim).to_a.each { |ax_id| b = raw_fft(b, ax_id, inverse: true, real: false) }
|
58
76
|
b
|
@@ -62,7 +80,10 @@ module Numo
|
|
62
80
|
# @param a [Numo::DFloat] Real 1-dimensional input array.
|
63
81
|
# @return [Numo::DComplex] Transformed data.
|
64
82
|
def rfft(a)
|
83
|
+
raise ArgumentError, 'Expect class of input array to be Numo::NArray.' unless a.is_a?(Numo::NArray)
|
84
|
+
raise ArgumentError, 'Expect input array to be non-empty.' if a.empty?
|
65
85
|
raise ArgumentError, 'Expect input array to be one-dimensional.' unless a.ndim == 1
|
86
|
+
|
66
87
|
raw_fft(a, 0, inverse: false, real: true)
|
67
88
|
end
|
68
89
|
|
@@ -70,7 +91,10 @@ module Numo
|
|
70
91
|
# @param a [Numo::DComplex] Complex 1-dimensional input array.
|
71
92
|
# @return [Numo::DFloat] Inverse transformed data.
|
72
93
|
def irfft(a)
|
94
|
+
raise ArgumentError, 'Expect class of input array to be Numo::NArray.' unless a.is_a?(Numo::NArray)
|
95
|
+
raise ArgumentError, 'Expect input array to be non-empty.' if a.empty?
|
73
96
|
raise ArgumentError, 'Expect input array to be one-dimensional.' unless a.ndim == 1
|
97
|
+
|
74
98
|
raw_fft(a, 0, inverse: true, real: true)
|
75
99
|
end
|
76
100
|
|
@@ -78,7 +102,10 @@ module Numo
|
|
78
102
|
# @param a [Numo::DFloat] Real 2-dimensional input array.
|
79
103
|
# @return [Numo::DComplex] Transformed data.
|
80
104
|
def rfft2(a)
|
105
|
+
raise ArgumentError, 'Expect class of input array to be Numo::NArray.' unless a.is_a?(Numo::NArray)
|
106
|
+
raise ArgumentError, 'Expect input array to be non-empty.' if a.empty?
|
81
107
|
raise ArgumentError, 'Expect input array to be two-dimensional.' unless a.ndim == 2
|
108
|
+
|
82
109
|
rfftn(a)
|
83
110
|
end
|
84
111
|
|
@@ -86,7 +113,10 @@ module Numo
|
|
86
113
|
# @param a [Numo::DComplex] Complex 2-dimensional input array.
|
87
114
|
# @return [Numo::DFloat] Inverse transformed data.
|
88
115
|
def irfft2(a)
|
116
|
+
raise ArgumentError, 'Expect class of input array to be Numo::NArray.' unless a.is_a?(Numo::NArray)
|
117
|
+
raise ArgumentError, 'Expect input array to be non-empty.' if a.empty?
|
89
118
|
raise ArgumentError, 'Expect input array to be two-dimensional.' unless a.ndim == 2
|
119
|
+
|
90
120
|
irfftn(a)
|
91
121
|
end
|
92
122
|
|
@@ -94,6 +124,9 @@ module Numo
|
|
94
124
|
# @param a [Numo::DFloat] Real input array with any-dimension.
|
95
125
|
# @return [Numo::DComplex] Transformed data.
|
96
126
|
def rfftn(a)
|
127
|
+
raise ArgumentError, 'Expect class of input array to be Numo::NArray.' unless a.is_a?(Numo::NArray)
|
128
|
+
raise ArgumentError, 'Expect input array to be non-empty.' if a.empty?
|
129
|
+
|
97
130
|
last_axis_id = a.ndim - 1
|
98
131
|
b = raw_fft(a, last_axis_id, inverse: false, real: true)
|
99
132
|
(0...last_axis_id).to_a.reverse.each { |ax_id| b = raw_fft(b, ax_id, inverse: false, real: false) }
|
@@ -104,6 +137,9 @@ module Numo
|
|
104
137
|
# @param a [Numo::DComplex] Complex input array with any-dimension.
|
105
138
|
# @return [Numo::DFloat] Inverse transformed data.
|
106
139
|
def irfftn(a)
|
140
|
+
raise ArgumentError, 'Expect class of input array to be Numo::NArray.' unless a.is_a?(Numo::NArray)
|
141
|
+
raise ArgumentError, 'Expect input array to be non-empty.' if a.empty?
|
142
|
+
|
107
143
|
last_axis_id = a.ndim - 1
|
108
144
|
b = a.dup
|
109
145
|
(0...last_axis_id).to_a.each { |ax_id| b = raw_fft(b, ax_id, inverse: true, real: false) }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: numo-pocketfft
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yoshoku
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-08-
|
11
|
+
date: 2019-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: numo-narray
|
@@ -110,6 +110,7 @@ files:
|
|
110
110
|
- ".gitmodules"
|
111
111
|
- ".rspec"
|
112
112
|
- ".travis.yml"
|
113
|
+
- CHANGELOG.md
|
113
114
|
- CODE_OF_CONDUCT.md
|
114
115
|
- Gemfile
|
115
116
|
- LICENSE.txt
|