фильтр

1D цифровой фильтр

Синтаксис

y = filter(b,a,x)
y = filter(b,a,x,zi)
y = filter(b,a,x,zi,dim)
[y,zf] = filter(___)

Описание

пример

y = filter(b,a,x) фильтрует входные данные x с помощью рациональной передаточной функции, заданной числителем и коэффициентами знаменателя b и a.

Если a(1) не равен 1, то filter нормализует коэффициенты фильтра a(1). Поэтому a(1) должен быть ненулевым.

  • Если x является вектором, то filter возвращает отфильтрованные данные как вектор, одного размера как x.

  • Если x является матрицей, то filter действует по первому измерению и возвращает отфильтрованные данные для каждого столбца.

  • Если x является многомерным массивом, то filter действует вдоль первого измерения массива, размер которого не равняется 1.

пример

y = filter(b,a,x,zi) использует начальные условия zi для задержек фильтра. Длина zi должна равняться max(length(a),length(b))-1.

пример

y = filter(b,a,x,zi,dim) действует по измерению dim. Например, если x является матрицей, то filter(b,a,x,zi,2) возвращает отфильтрованные данные для каждой строки.

пример

[y,zf] = filter(___) также возвращает итоговые условия zf задержек фильтра, с помощью любого из предыдущих синтаксисов.

Примеры

свернуть все

Фильтр скользящего среднего значения является общепринятой методикой, используемой для сглаживания шумных данных. Этот пример использует функцию filter, чтобы вычислить средние числа вдоль вектора данных.

Создайте 1 100 вектор - строку из синусоидальных данных, который повреждается случайным шумом.

t = linspace(-pi,pi,100);
rng default  %initialize random number generator
x = sin(t) + 0.25*rand(size(t));

Фильтр скользящего среднего значения двигает окно длины вдоль данных, вычислительных средних чисел данных, содержавшихся в каждом окне. Следующее разностное уравнение задает фильтр скользящего среднего значения вектора:

Для размера окна 5, вычислите числитель и коэффициенты знаменателя для рациональной передаточной функции.

windowSize = 5; 
b = (1/windowSize)*ones(1,windowSize);
a = 1;

Найдите скользящее среднее значение данных и постройте график его против исходных данных.

y = filter(b,a,x);

plot(t,x)
hold on
plot(t,y)
legend('Input Data','Filtered Data')

Этот пример фильтрует матрицу данных со следующей рациональной передаточной функцией.

Создайте 2 15 матрица случайных входных данных.

rng default  %initialize random number generator
x = rand(2,15);

Задайте числитель и коэффициенты знаменателя для рациональной передаточной функции.

b = 1;
a = [1 -0.2];

Примените передаточную функцию вдоль второго измерения x и возвратите 1D цифровой фильтр каждой строки. Постройте график первой строки исходных данных против отфильтрованных данных.

y = filter(b,a,x,[],2);

t = 0:length(x)-1;  %index vector

plot(t,x(1,:))
hold on
plot(t,y(1,:))
legend('Input Data','Filtered Data')
title('First Row')

Постройте график второй строки входных данных против отфильтрованных данных.

figure
plot(t,x(2,:))
hold on
plot(t,y(2,:))
legend('Input Data','Filtered Data')
title('Second Row')

Используйте начальные и итоговые условия для задержек фильтра, чтобы отфильтровать данные в разделах, особенно если ограничения памяти являются фактором.

Сгенерируйте большую случайную последовательность данных и разделите ее в два сегмента, x1 и x2.

x = randn(10000,1);

x1 = x(1:5000);
x2 = x(5001:end);

Целая последовательность, x, является вертикальной конкатенацией x1 и x2.

Задайте числитель и коэффициенты знаменателя для рациональной передаточной функции,

b = [2,3];
a = [1,0.2];

Отфильтруйте подпоследовательности x1 и x2 по одному. Выведите итоговые условия от фильтрации x1, чтобы сохранить внутреннее состояние фильтра в конце первого сегмента.

[y1,zf] = filter(b,a,x1);

Используйте итоговые условия от фильтрации x1 как начальные условия, чтобы отфильтровать второй сегмент, x2.

y2 = filter(b,a,x2,zf);

y1 является отфильтрованными данными от x1, и y2 является отфильтрованными данными от x2. Целая отфильтрованная последовательность является вертикальной конкатенацией y1 и y2.

Отфильтруйте целую последовательность одновременно для сравнения.

y = filter(b,a,x);

isequal(y,[y1;y2])
ans = logical
   1

Входные параметры

свернуть все

Коэффициенты числителя рациональной передаточной функции, заданной как вектор.

Типы данных: удвойтесь | единственный | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | логический
Поддержка комплексного числа: Да

Коэффициенты знаменателя рациональной передаточной функции, заданной как вектор.

Типы данных: удвойтесь | единственный | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | логический
Поддержка комплексного числа: Да

Входные данные, заданные как вектор, матрица или многомерный массив.

Типы данных: удвойтесь | единственный | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | логический
Поддержка комплексного числа: Да

Начальные условия для задержек фильтра, заданных как вектор, матрица или многомерный массив.

  • Если zi является вектором, то его длиной должен быть max(length(a),length(b))-1.

  • Если zi является матричным или многомерным массивом, то размером ведущей размерности должен быть max(length(a),length(b))-1. Размер каждого остального измерения должен совпадать с размером соответствующей размерности x. Например, рассмотрите использование filter вдоль второго измерения (dim = 2) 3 4 5 массивами x. Массив zi должен иметь размер [max(length(a),length(b))-1]-3-на-5.

Значение по умолчанию, заданное [], инициализирует все задержки фильтра с нулем.

Типы данных: удвойтесь | единственный | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | логический
Поддержка комплексного числа: Да

Величина для работы, заданная как положительный целый скаляр. Если значение не задано, то по умолчанию это первый размер массива, не равный 1.

Рассмотрите двумерный входной массив, x.

  • Если dim = 1, то filter(b,a,x,zi,1) работает вдоль строк x и возвращает фильтр, применился к каждому столбцу.

  • Если dim = 2, то filter(b,a,x,zi,2) работает вдоль столбцов x и возвращает фильтр, применился к каждой строке.

Если dim больше, чем ndims(x), то filter возвращает x.

Типы данных: удвойтесь | единственный | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | логический

Выходные аргументы

свернуть все

Фильтрованные данные, возвращенные как вектор, матрица или многомерный массив, одного размера как входные данные, x.

Если x имеет тип single, то filter исходно вычисляет в одинарной точности, и y имеет также тип single. В противном случае y возвращен как тип double.

Типы данных: double | single

Итоговые условия для задержек фильтра, возвращенных как вектор, матрица или многомерный массив.

  • Если x является вектором, то zf является вектором - столбцом длины max(length(a),length(b))-1.

  • Если x является матричным или многомерным массивом, то zf является массивом векторов - столбцов длины max(length(a),length(b))-1, такой, что количество столбцов в zf эквивалентно количеству столбцов в x. Например, рассмотрите использование filter вдоль второго измерения (dim = 2) 3 4 5 массивами x. Массив zf имеет размер [max(length(a),length(b))-1]-3-на-5.

Типы данных: double | single

Больше о

свернуть все

Рациональная передаточная функция

Описание операции ввода-вывода операции filter на векторе в области Z-преобразования является рациональной передаточной функцией. Рациональная передаточная функция имеет форму,

Y (z) =b (1) +b (2) z−1 +... +b (nb+1) z−nb1+a (2) z−1 +... +a (na+1) z−naX (z),

который обрабатывает и КИХ и БИХ-фильтры [1]. na является порядком фильтра обратной связи, и nb является порядком фильтра feedforward.

Также можно выразить рациональную передаточную функцию как следующее разностное уравнение,

(1) год (n) =b (1) x (n) +b (2) x (n−1) +... +b (nb+1) x (n−nb) −a (2) год (n−1) ...−a (na+1) y (n−na).

Кроме того, можно представлять рациональную передаточную функцию с помощью ее прямой формы II транспонированных реализаций, как в следующей схеме. Из-за нормализации, примите a(1) = 1.

Работа фильтра на выборке m задается разностными уравнениями во временной области

y (m) =b (1) x (m) +z1 (m−1) z1 (m) =b (2) x (m) +z2 (m−1) −a (2) год (m)       =                 ⋮zn−2 (m) =b (n−1) x (m) +zn−1 (m−1) −a (n−1) y (m) zn−1 (m) =b (n) x (m) −a (n) y (m).

Советы

  • Если у вас есть Обработка сигналов Toolbox™, можно разработать фильтр, d, с помощью designfilt. Затем можно использовать Y = filter(d,X), чтобы отфильтровать данные.

Ссылки

[1] Оппенхейм, Алан V, Рональд В. Шафер и Джон Р. Бак. Обработка сигналов дискретного времени. Верхний Сэддл-Ривер, NJ: Prentice Hall, 1999.

Расширенные возможности

Смотрите также

| | | |

Представлено до R2006a

Была ли эта тема полезной?