Module: Convolver

Defined in:
lib/convolver-light.rb,
lib/convolver/version.rb,
ext/convolver/convolver.c

Constant Summary collapse

VERSION =
"0.3.3"

Class Method Summary collapse

Class Method Details

.convolve(signal, kernel) ⇒ NArray

The two parameters must have the same rank. The output has same rank, its size in each dimension d is given by

signal.shape[d] - kernel.shape[d] + 1

Parameters:

  • signal (NArray)

    must be same size or larger than kernel in each dimension

  • kernel (NArray)

    must be same size or smaller than signal in each dimension

Returns:

  • (NArray)

    result of convolving signal with kernel



12
13
14
# File 'lib/convolver-light.rb', line 12

def self.convolve(signal, kernel)
  convolve_basic signal, kernel
end

.convolve_basic(signal, kernel) ⇒ NArray

Calculates convolution of an array of floats representing a signal, with a second array representing a kernel. The two parameters must have the same rank. The output has same rank, its size in each dimension d is given by

signal.shape[d] - kernel.shape[d] + 1

Parameters:

  • signal (NArray)

    must be same size or larger than kernel in each dimension

  • kernel (NArray)

    must be same size or smaller than signal in each dimension

Returns:

  • (NArray)

    result of convolving signal with kernel



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'ext/convolver/convolver.c', line 79

static VALUE narray_convolve( VALUE self, VALUE a, VALUE b ) {
  struct NARRAY *na_a, *na_b, *na_c;
  volatile VALUE val_a, val_b, val_c;
  int target_rank, i;
  int target_shape[LARGEST_RANK];

  val_a = na_cast_object(a, NA_SFLOAT);
  GetNArray( val_a, na_a );

  val_b = na_cast_object(b, NA_SFLOAT);
  GetNArray( val_b, na_b );

  if ( na_a->rank != na_b->rank ) {
    rb_raise( rb_eArgError, "narray a must have equal rank to narray b (a rack %d, b rank %d)", na_a->rank,  na_b->rank );
  }

  if ( na_a->rank > LARGEST_RANK ) {
    rb_raise( rb_eArgError, "exceeded maximum narray rank for convolve of %d", LARGEST_RANK );
  }

  target_rank = na_a->rank;

  for ( i = 0; i < target_rank; i++ ) {
    target_shape[i] = na_a->shape[i] - na_b->shape[i] + 1;
    if ( target_shape[i] < 1 ) {
      rb_raise( rb_eArgError, "narray b is bigger in one or more dimensions than narray a" );
    }
  }

  val_c = na_make_object( NA_SFLOAT, target_rank, target_shape, CLASS_OF( val_a ) );
  GetNArray( val_c, na_c );

  convolve_raw(
    target_rank, na_a->shape, (float*) na_a->ptr,
    target_rank, na_b->shape, (float*) na_b->ptr,
    target_rank, target_shape, (float*) na_c->ptr );

  return val_c;
}