File: src/filters/Convolution.js
/** * Based on Convolution.as originally written in as3. * Copyright (c) the Funnel development team * http://www.funnel.cc * * Ported to JavaScript by Jeff Hoefs * Copyright (c) 2011-2012 Jeff Hoefs <[email protected]> * * Released under the MIT license. See LICENSE file for details. */ JSUTILS.namespace('BO.filters.Convolution'); /** * @namespace BO.filters */ BO.filters.Convolution = (function() { "use strict"; var Convolution; // dependencies var FilterBase = BO.filters.FilterBase; /** * The Convolution object performs low-pass, high-pass and moving average * filtering on an analog input. * See [Breakout/examples/filters/convolution.html](https://github.com/soundanalogous/Breakout/blob/master/examples/filters/convolution.html) for an example application. * * @class Convolution * @constructor * @extends BO.filters.FilterBase * @param {Number[]} kernel An array of coefficients to be used with product-sum * operations for input buffers. */ Convolution = function(kernel) { this.name = "Convolution"; this._buffer = []; // use the coef setter this.coef = kernel; }; Convolution.prototype = JSUTILS.inherit(FilterBase.prototype); Convolution.prototype.constructor = Convolution; /** * An array of coefficients to be used with product-sum operations for input buffers. * If assigned a new array, the input buffer will be cleared. * @property coef * @type Number[] */ Object.defineProperty(Convolution.prototype, "coef", { get: function() { return this._coef; }, set: function(kernel) { this._coef = kernel; this._buffer = new Array(this._coef.length); var len = this._buffer.length; for (var i = 0; i < len; i++) { this._buffer[i] = 0; } } }); /** * Override FilterBase.processSample */ Convolution.prototype.processSample = function(val) { this._buffer.unshift(val); this._buffer.pop(); var result = 0; var len = this._buffer.length; for (var i = 0; i < len; i++) { result += this._coef[i] * this._buffer[i]; } return result; }; /** * Low-pass filter kernel. Use by passing this array to the constructor. * @property Convolution.LPF * @static */ Convolution.LPF = [1 / 3, 1 / 3, 1 / 3]; /** * High-pass filter kernel. Use by passing this array to the constructor. * @property Convolution.HPF * @static */ Convolution.HPF = [1 / 3, -2.0 / 3, 1 / 3]; /** * Moving average filter kernel. Use by passing this array to the constructor. * @property Convolution.MOVING_AVERAGE * @static */ Convolution.MOVING_AVERAGE = [1 / 8, 1 / 8, 1 / 8, 1 / 8, 1 / 8, 1 / 8, 1 / 8, 1 / 8]; return Convolution; }());
