Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/64: Рейтинг темы: голосов - 64, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 64
1

Функция filter

08.12.2017, 17:57. Показов 12525. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
В MATLAB есть встроенная функция:
Matlab M
1
y = filter(a, b, x);
Данная функция применяет фильтр к сигналу х.
Подскажите, как реализовать данную функцию filter? То есть необходимо написать свою собственную функцию, которая по функционалу была бы аналогична встроенной функции filter в MATLAB.
Входные параметры:
Matlab M
1
2
3
4
а = [0.0688 0.2750 0.4125 0.2750 0.0688], 
b = [1.0000 -0.4630 0.9703 -0.4596 0.2598],
t = 0 : 0.1 : 100;
x = sin(t/2) + sin(3*t);
Я нашла описание этой команды:
Код
 a(1)y(n) = b(1) * x(n) + b(2) * x(n - 1) + ... + b(nb + 1) * x(n - nb) 
                                           - a(2) * y(n - 1) - ... - a(na + 1) * y(n - na),

при этом входной параметр b = [b(1) b(2) ... b(nb + 1)], а параметр a = [a(1) a(2) ... ... a(na+1)].
но как это реализовать - не получается.
Спасибо.

Написала фильтр. Фильтрует, но фильтрует не как функция filter.

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
а = [0.0688 0.2750 0.4125 0.2750 0.0688], 
b = [1.0000 -0.4630 0.9703 -0.4596 0.2598],
x = sin(t/2) + sin(3*t);
 
y = zeros(1, length(x));
    y(1) = b(1)*x(1);
    for k = 2:length(x) 
        t = b(1) * x(k);
        for n= 2:length(a)
            if(k - n > 1)&&(k - n < length(a))
               y(k) = y(k) + a(n)*x(k - n) - b(n)*y(k - n);
            end            
        end 
        y(k) = y(k) + t; 
    end
В чем ошибка?

Поведение моей функции фильтрации около нуля очень странное.
Идентичности между функцией filter и моей - нет.
Переписала код, как по формуле (поменяла местами a и b в коде):

Matlab M
1
2
3
4
5
6
7
8
9
10
11
y = zeros(1, length(x));
    y(1) = b(1)*x(1);
    for k = 2:length(x) 
        t = b(1) * x(k);
        for n= 2:length(a)
            if(k - n > 1)&&(k - n < length(a))
               y(k) = y(k) + b(n)*x(k - n) - a(n)*y(k - n);
            end            
        end 
        y(k) = y(k) + t; 
    end
Функция filter:
Функция filter

Моя функция фильтрации того же сигнала:
Функция filter

Функция filter


Подскажите, где ошибка?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2017, 17:57
Ответы с готовыми решениями:

Смысл функции filter. Перевести код функции filter в C++
Всем привет! у меня такая проблема. Нужно перевести код функции filter в C++. для функции y =...

Как реализовать Complex modulated filter bank
Мне нужно реализовать Complex modulated filter bank У меня есть отчеты Импульсной...

Фильтрация сигнала (создать аналог функции filter на С#)
Привет! Помогите, пожалуйста, создать функцию фильтра, подобную функции MatLabа = filter(b, a, x,...

Новичок не может понять, где в программе ошибка (Filter design analysis tool)
Только начинаю осваивать матлаб, как в принципе и ЦОС поэтому не судите строго :) Пытаюсь уже...

22
79 / 61 / 25
Регистрация: 07.04.2013
Сообщений: 204
12.12.2017, 17:55 2
В интернетах вроде уже как написали код функции filter, попробуйте сравнить своё https://www.mathworks.com/matl... ode-filter
0
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 64
12.12.2017, 18:10  [ТС] 3
Annza, смотрела. Там как-то и проверки на вылет из индексов массива нет и параметр z присутствует, который мне не нужен.
0
79 / 61 / 25
Регистрация: 07.04.2013
Сообщений: 204
12.12.2017, 18:18 4
Ну в окрестности 0 переходный процесс, можно отбрасывать первые length(b)/2 отсчетов. Непонятно, почему для первого отсчета выхода особенная формула:
Matlab M
1
 y(1) = b(1)*x(1);
Потом, зачем отдельно прибавлять текущий вход, умноженный на b(1):
Matlab M
1
y(k) = y(k) + t;
почему нельзя индексацию по n вести от 1.

В данном примере количество коэффициентов a и b совпадает, но если эти вектора будут разной длины, то код тоже слетит...
0
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 64
12.12.2017, 18:31  [ТС] 5
Annza, Как учесть тот факт, что, если длины a и b разные, то код бы сохранил работоспособность? Если учесть Ваши замечания, то будет выводится следующее:

Matlab M
1
2
3
4
5
6
7
8
9
10
11
function y = myFilter(b, a, x)
    y = zeros(1, length(x));    
    for k = 2:length(x)   
        y(k) = b(1) * x(k);
        for n= 1:length(b)
            if(k - n > 1)&&(k - n < length(b))
               y(k) = y(k) + b(n)*x(k - n) - a(n)*y(k - n);
            end            
        end         
    end    
end
Функция filter
0
79 / 61 / 25
Регистрация: 07.04.2013
Сообщений: 204
12.12.2017, 18:50 6
Сделайте два внутренних цикла, один по индексам коэффициентов числителя передаточной функции b, другой по - a и добавляйте прямые и обратные связи по отдельности к сигналу. В остальном код соответствует приведенной в 1 сообщении формуле
0
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 64
12.12.2017, 18:59  [ТС] 7
Annza, кстати, внешний цикл по k от 1?
Если стандартной функцией фильтровать, то сигнал от -1.5 до 1.5, а с помощью моего фильтра от -2 до 2. По-моему, это важное отличие. Почему такое происходит?
Получилось следующее:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function y = myFilter(b, a, x)
    y = zeros(1, length(x));    
    for k = 1:length(x)   
        y(k) = b(1) * x(k);
        for n = 1:length(b)
            if(k - n > 1)&&(k - n < length(b))
               y(k) = y(k) + b(n)*x(k - n);
            end            
        end  
        for n = 1:length(a)
            if(k - n > 1)&&(k - n < length(b))
               y(k) = y(k) - a(n)*y(k - n);
            end            
        end 
    end    
end
Функция filter


Не фильтрованный сигнал также находится в интервале от -2 до 2. И получается, что сигнал в итоге и не фильтруется вовсе.
Если применить стандартную функцию, то сигнал имеет такой вид:
Функция filter
0
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
12.12.2017, 19:47 8
у меня такой не получается...
видимо, другой код выкладываете
0
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 64
12.12.2017, 19:53  [ТС] 9
Krasme, Дико извиняюсь. Массивы a и b имеют другие значения. Вот, со всеми входными данными:

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
а = [0.0000595 0.0002381 0.0003572 0.0002381 0.0000595], 
b = [1.0000 -3.7087 5.2313 -3.3234 0.8020],
x = sin(t/2) + sin(3*t);
y = zeros(1, length(x));    
    for k = 1:length(x)   
        y(k) = b(1) * x(k);
        for n = 1:length(b)
            if(k - n > 1)&&(k - n < length(b))
               y(k) = y(k) + b(n)*x(k - n);
            end            
        end  
        for n = 1:length(a)
            if(k - n > 1)&&(k - n < length(b))
               y(k) = y(k) - a(n)*y(k - n);
            end            
        end 
    end
Krasme, если я правильно поняла, то у массива а - это умножение значений на 10 в минус третьей степени.
Функция filter


Krasme, но даже при измененных входных параметрах, общая картина с графиками остается той же. И следствие из этого - фильтр не рабочий.
0
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 64
12.12.2017, 21:14  [ТС] 10
Сравнила исходный массив сигнала и массив сигнала после применения моего фильтра. Они абсолютно идентичны (кроме первых 10 значений). Значит, с кодом точно что-то не порядок...В чем может быть ошибка?

Добавлено через 10 минут
Подозреваю, что ошибка где-то в условии if.
0
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
12.12.2017, 21:21 11
Лучший ответ Сообщение было отмечено any5957 как решение

Решение

вектор а другой, чтобы разные размеры (a,b) были.
Кликните здесь для просмотра всего текста
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function lklklk
clc; clear all; clf;
a = [0.0000595 0.0000595 0.0000595 0.0002381 0.0003572 0.0002381 0.0000595];
b = [1.0000 -3.7087 5.2313 -3.3234 0.8020];
t = 0 : 0.1 : 25;
x = sin(t/2) + sin(3*t);
y = filter(a, b, x);
z=myFilter(b,a,x);
plot(t,x,'g',t,y,'.b',t,z,'or')
legend('Orig','filter','MyFilt',0)
end
 
function y = myFilter(a, b, x)
na=length(a);
nb=length(b);
y = zeros(1,length(x));
for n=max(na,nb):length(x);
    y(n)=b(1)*x(n);
    NB=0; NA=0;
    for k=2:nb
        NB=NB+b(k)*x(n-k+1);
    end
    for k=2:na
        NA=NA+a(k)*y(n-k+1);
    end    
    y(n)=y(n)+NB-NA;
     y(n)=y(n)*a(1);
end
end
 
%   a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb)
%                         - a(2)*y(n-1) - ... - a(na+1)*y(n-na)
2
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 64
12.12.2017, 21:29  [ТС] 12
Krasme, ого. Спасибо!
Два вопроса:
Почему в цикле по n мы идем от максимальной длины векторов a, b?
Matlab M
1
for n=max(na,nb):length(x);
Почему мы в коэффициенте у х прибавляем еще единицу?
Matlab M
1
NB=NB+b(k)*x(n-k+1);
0
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
12.12.2017, 21:35 13
Цитата Сообщение от any5957 Посмотреть сообщение
коэффициенте у х прибавляем еще единицу?
смотрите логику в цикле
Matlab M
1
b(2)*x(n-1)
Цитата Сообщение от any5957 Посмотреть сообщение
цикле по n мы идем от максимальной длины векторов a, b?
надо учитывать отступ по массиву
Matlab M
1
    x(n-k+1);
если взять n меньше, чем na или nb, то будет ошибка индекса массива x
1
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 64
12.12.2017, 21:41  [ТС] 14
Krasme, поняла. Спасибо
0
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 64
12.12.2017, 21:45  [ТС] 15
Krasme, фото результата работы нашего фильтра. Он такой и должен получиться (умножение на 10 в минус 7)?
Функция filter

Встроенный фильтр:
Функция filter
0
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
12.12.2017, 21:47 16
Кликните здесь для просмотра всего текста
Функция filter
0
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 64
12.12.2017, 21:48  [ТС] 17
Krasme, это для Ваших входных данных.
А для моих что-то вот так выводит...
0
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
12.12.2017, 21:50 18
а вы повторили код, который я выложила?
0
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 64
12.12.2017, 21:51  [ТС] 19
Krasme, да, конечно. Я им заменила код в своей функции. Только входные данные остались свои и отрисовка графика.
0
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
12.12.2017, 21:52 20
ну давайте свой новый код полностью... посмотрю
0
12.12.2017, 21:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2017, 21:52
Помогаю со студенческими работами здесь

Настройка Digital Filter
нужно настроить Digital Filter так чтобы он стал согласованным для последовательности 1 1 1 1 1 1...

Функция filter()
print(list(filter(lambda x: x % 2, ))) функция выводит: Подскажите, что не так, как...

Не понимаю как работает функция filter()
Всем привет, изучал функцию filter(), и не могу до конца разобраться в ней: a = def func(x):...

Filter
Почему нельзя сделать так: Private Sub Combo33_Change() Me.Filter = &quot;Name = Combo33.Value&quot; End...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru