convolveAlt = filter => signal =>
signal.map((_, i) => {
const [numerator, denominator] = filter.reduce(
([numerator, denominator], f, j) => {
const offsetI = i - Math.floor(filter.length / 2) + j;
return offsetI >= 0 && offsetI < signal.length
? [numerator + f * signal[offsetI], denominator + f]
: [numerator, denominator];
},
[0, 0]
);
return numerator / denominator;
})