js实现滤波
滤波实现方法
在JavaScript中实现滤波通常涉及信号处理或数据平滑。以下是几种常见的滤波方法:
移动平均滤波
移动平均是最简单的滤波方法之一,通过计算数据点周围窗口的平均值来平滑数据。
function movingAverageFilter(data, windowSize) {
const result = [];
for (let i = 0; i < data.length; i++) {
const start = Math.max(0, i - Math.floor(windowSize / 2));
const end = Math.min(data.length, i + Math.ceil(windowSize / 2));
const window = data.slice(start, end);
const avg = window.reduce((sum, val) => sum + val, 0) / window.length;
result.push(avg);
}
return result;
}
指数平滑滤波
指数平滑给予近期数据更大的权重,适用于时间序列数据。
function exponentialSmoothing(data, alpha) {
const result = [data[0]];
for (let i = 1; i < data.length; i++) {
result.push(alpha * data[i] + (1 - alpha) * result[i - 1]);
}
return result;
}
中值滤波
中值滤波能有效去除脉冲噪声,通过取窗口中值代替当前值。
function medianFilter(data, windowSize) {
const result = [];
const halfWindow = Math.floor(windowSize / 2);
for (let i = 0; i < data.length; i++) {
const start = Math.max(0, i - halfWindow);
const end = Math.min(data.length, i + halfWindow + 1);
const window = data.slice(start, end);
window.sort((a, b) => a - b);
result.push(window[Math.floor(window.length / 2)]);
}
return result;
}
卡尔曼滤波
对于更复杂的系统,可以实现简单的卡尔曼滤波器。
class KalmanFilter {
constructor(initialState, initialUncertainty, measurementNoise, processNoise) {
this.state = initialState;
this.uncertainty = initialUncertainty;
this.measurementNoise = measurementNoise;
this.processNoise = processNoise;
}
update(measurement) {
const kalmanGain = this.uncertainty / (this.uncertainty + this.measurementNoise);
this.state = this.state + kalmanGain * (measurement - this.state);
this.uncertainty = (1 - kalmanGain) * this.uncertainty + this.processNoise;
return this.state;
}
}
应用场景选择
移动平均适合简单平滑需求;指数平滑适用于时间序列预测;中值滤波对去除离群点有效;卡尔曼滤波适合动态系统状态估计。实际应用中可根据噪声类型和处理需求选择适当方法。







