[patch] Convolution: implement symmetric coefficients

Jules Bergmann jules at codesourcery.com
Tue Oct 4 20:21:20 UTC 2005


This patch extends convolution to work with symmetric kernels 
(sym_even_len_odd and sym_even_len_even).  It extends tests to cover 
these new cases, and also to cover cases where decimation != 1.

This uncovered a couple of specification issues:

  - First, the VSIPL++ spec defines the convolution accessor
    'kernel_size()' to return the domain having the same length for
    each dimension as 'filter_coeffs'.  However, when constructing a
    convolution with a symmetric kernel, 'filter_coeffs' only contains
    a subset of coefficients.  In those cases, the true kernel size is
    either '2 * filter_coeffs.size()' or '2 * filter_coeff.size() + 1'
    (for 1D).

    In contrast, the C-VSIPL spec defines the kernel size as M, and
    specifies the size of 'filter_coeffs' as either M if symmetry =
    non_sym, or 'floor(M/2)' if 'symmetry == sym_even_len_{odd,even}'

    (Issue #91)

  - Second, the VSIPL++ and C-VSIPL specs define the output size
    of a minimal support output convolution such that values outside
    of the input may be required for some decimations != 1.  This
    contradicts the equation that defines the output values

    (Issue #90)

Fixing the first issue is straight-forward.  The second issue is more
tricky since the C-VSIPL specs looks to be "wrong" as well and
changing the output size would break existing C-VSIPL implementations.
I've added an ifdef (VSIP_IMPL_CONV_CORRECT_MIN_SUPPORT_SIZE) that
controls whether we follow the spec or not.  When following the spec,
we treat accesses outside the input range as 0.  (This is probably the
right way to "fix" the C-VSIPL spec: keep the length defined as is and
specifiy that zero values are used when trying to access outside the
input range, similar to support_same and support_full).

				-- Jules



More information about the vsipl++ mailing list