Filter 移动平均数字滤波器的实现

Filter 移动平均数字滤波器的实现,filter,signal-processing,scilab,oscilloscope,Filter,Signal Processing,Scilab,Oscilloscope,我需要实现移动平均数字滤波器的一些后处理 在Scilab中记录示波器波形。我已经准备了一个剧本 下面给出的代码(包含256个样本的平均窗口的递归实现) 脚本输出如下(蓝色波形-记录数据,红色波形-过滤数据) 问题是,我不确定我是否执行移动平均线 是正确的(我发现很多实现大多基于卷积)。输出似乎经过某种程度的过滤,但这会有所帮助 对我来说,如果有人能向我证实这是正确的。提前感谢。您的实现没有问题。事实上,它是在和上给出的递归公式的常见实现: 看起来不错。有什么问题吗?谢谢NickJH的反应。问题

我需要实现移动平均数字滤波器的一些后处理 在Scilab中记录示波器波形。我已经准备了一个剧本 下面给出的代码(包含256个样本的平均窗口的递归实现)

脚本输出如下(蓝色波形-记录数据,红色波形-过滤数据)

问题是,我不确定我是否执行移动平均线 是正确的(我发现很多实现大多基于卷积)。输出似乎经过某种程度的过滤,但这会有所帮助
对我来说,如果有人能向我证实这是正确的。提前感谢。

您的实现没有问题。事实上,它是在和上给出的递归公式的常见实现:


看起来不错。有什么问题吗?谢谢NickJH的反应。问题是我不确定我的实现是否正确(到目前为止,我发现的每个实现都与我的实现不同)。基于这一发现,我认为有问题。你可以用合成测试用例让自己放心(或者找到一个bug!),例如,一个高度为10L的脉冲应该产生一个宽度为L、高度为10的脉冲;恒定输入应保持不变(从零开始初始爬升后)。如果这两种方法都有效,那么就不会有太多问题。NickJH感谢您为测试提供的好提示。
// number of samples
N = 350000;
// vector of voltage samples
voltage = M(1:N, 2)';

// filtered values
filt_voltage = zeros(1:N);
// window length
L = 256;
// sum of the samples in the averaging window
sum = 0

for i = 1:N_01
    // averaging window full?
    if i > L
        // remove the oldest sample in the averaging window
        sum = sum - voltage(i - L);
    end
    // add the newest sample into the averaging window
    sum = sum + voltage(i);
    // average of the samples in the averaging window
    filt_voltage(i) = sum/L; 
end