Реализация цифрового фильтра скользящей средней
Мне нужно реализовать цифровой фильтр скользящего среднего для постобработки некоторых записанных осциллографических сигналов в Scilab. Я подготовил скрипт с приведенным ниже кодом (рекурсивная реализация с окном усреднения, содержащим 256 образцов)
// 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
Вывод сценария следующий (синяя форма волны - записанные данные, красная форма волны - отфильтрованные данные)
Проблема в том, что я не уверен, правильна ли моя реализация скользящего среднего (я нашел много реализаций, в основном основанных на свертке). Вывод кажется каким-то образом отфильтрованным, но для меня было бы полезно, если бы кто-нибудь мог подтвердить мне, что это правильно. Заранее спасибо.
1 ответ
В вашей реализации нет ничего плохого. Фактически, это обычная реализация рекурсивной формулировки, приведенной на https://stats.stackexchange.com/a/24739 и в википедии: