% -- Function File: convenv(m, G, k)
%    Compute the output of an (n, k, L) convolutional encoder with vector input
%    m and matrix of generator polynomials G.
%
%   The input vector m can be of arbitrary length.   G is a matrix with n rows
%   and k*(L+1) columns.  The rows of G are the generator polynomials for each
%   of the n output bits (per k input bits).
%
%   The output is a vector whose length is n*floor([length(m)+k*(L+1)-1]/k).
%   With two inputs, k is assumed to be equal to 1.
%
%   Example 1: Compute the output from a (2, 1, 2)  convolutional encoder
%   with generator polynomials g1 = [ 1 1 1 ] and g2 = [ 1 0 1 ]
%   when the input message is m = [ 1 1 0 1 1 1 0 0 1 0 0 0 ]
%
%   x = convenc(m, [g1; g2])
%   x = 1101010001100111111011000000
%
%   Example 2: Compute the output from a (3, 2, 1) conv encoder with
%   generator polynomials g1 = [ 1 0 1 1 ], g2 = [ 1 1 0 1 ] and
%   g3 = [ 1 0 1 0 ] when the input is m = [ 0   1   1   0   0   0   1   1 ]
%
%   x = convenc(m, [g1; g2; g3], 2)
%   x = 111 111 110 101
%
%   Note: This function is not compatible with Matlab's convenc()

function x = convenc(m, G, k=1)
	% Use conv2 to do repeated 1d convolutions of m with each
	% row of G. Keep only length(m) columns of the result.
	x = rem(conv2(1, m(:)', G),2)(:,1:numel(m));
	% Only cols with index a mult. of k are in the actual enc. output
	x = x(:,!rem(1:columns(x),k))(:)';
end
