фильтр

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));

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

y(n)=1windowSize(x(n)+x(n-1)+...+x(n-(windowSize-1))).

Для размера окна 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')

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

H(z)=b(1)a(1)+a(2)z-1=11-0.2z-1

Создайте 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.

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

H(z)=b(1)+b(2)z-1a(1)+a(2)z-1=2+3z-11+0.2z-1.

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

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

свернуть все

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

Типы данных: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
Поддержка комплексного числа: Да

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

Типы данных: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
Поддержка комплексного числа: Да

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

Типы данных: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
Поддержка комплексного числа: Да

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

  • Если 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.

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

Типы данных: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
Поддержка комплексного числа: Да

Величина для работы, заданная как положительный целый скаляр. Если значение не задано, то по умолчанию это первый размер массива, не равный 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.

Типы данных: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

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

свернуть все

Фильтрованные данные, возвращенные как вектор, матрица или многомерный массив, одного размера как входные данные, 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)z1+...+b(nb+1)znb1+a(2)z1+...+a(na+1)znaX(z),

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

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

a(1)y(n)=b(1)x(n)+b(2)x(n1)+...+b(nb+1)x(nnb)a(2)y(n1)...a(na+1)y(nna).

Кроме того, можно представлять рациональную передаточную функцию с помощью ее прямой формы II транспонированных реализаций, как в следующей схеме. Здесь, na = nb.

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

y(m)=b(1)x(m)+w1(m1)w1(m)=b(2)x(m)+w2(m1)a(2)y(m)       =                 wn2(m)=b(n1)x(m)+wn1(m1)a(n1)y(m)wn1(m)=b(n)x(m)a(n)y(m).

Советы

  • Если у вас есть Signal Processing Toolbox™, используйте y = filter(d,x), чтобы отфильтровать входной сигнал x с объектом digitalFilter d. Чтобы сгенерировать d на основе спецификаций частотной характеристики, используйте designfilt.

  • Чтобы использовать функцию filter с коэффициентами b от КИХ-фильтра, используйте y = filter(b,1,x).

  • Смотрите Цифровую Фильтрацию (Signal Processing Toolbox) для больше при фильтрации функций.

Ссылки

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

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

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

|

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