Method: Numo::Pocketfft.fftconvolve
- Defined in:
- lib/numo/pocketfft.rb
.fftconvolve(a, b) ⇒ Numo::DFloat/Numo::DComplex
Convolve two N-dimensinal arrays using dscrete Fourier Transform.
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
# File 'lib/numo/pocketfft.rb', line 192 def fftconvolve(a, b) raise ArgumentError, 'Expect class of input array to be Numo::NArray.' unless a.is_a?(Numo::NArray) && b.is_a?(Numo::NArray) raise ArgumentError, 'Expect input array to be non-empty.' if a.empty? || b.empty? raise ArgumentError, 'Input arrays should have the same dimensionarity' if a.ndim != b.ndim ashp = a.shape bshp = b.shape return a * b if (ashp + bshp).all? { |el| el == 1 } retshp = Array.new(a.ndim) { |n| ashp[n] + bshp[n] - 1 } a_zp = Numo::DComplex.zeros(*retshp).tap { |arr| arr[*ashp.map { |n| 0...n }] = a } b_zp = Numo::DComplex.zeros(*retshp).tap { |arr| arr[*bshp.map { |n| 0...n }] = b } ret = ifftn(fftn(a_zp) * fftn(b_zp)) return ret if a.is_a?(Numo::DComplex) || a.is_a?(Numo::SComplex) || b.is_a?(Numo::DComplex) || b.is_a?(Numo::SComplex) ret.real end |