0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 64
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Функция filter08.12.2017, 17:57. Показов 12525. Ответов 22
Метки нет (Все метки)
Здравствуйте.
В MATLAB есть встроенная функция:
Подскажите, как реализовать данную функцию filter? То есть необходимо написать свою собственную функцию, которая по функционалу была бы аналогична встроенной функции filter в MATLAB. Входные параметры:
Код
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.
Поведение моей функции фильтрации около нуля очень странное. Идентичности между функцией filter и моей - нет. Переписала код, как по формуле (поменяла местами a и b в коде):
Моя функция фильтрации того же сигнала: Подскажите, где ошибка?
0
|
08.12.2017, 17:57 | |
Ответы с готовыми решениями:
22
Смысл функции filter. Перевести код функции filter в C++ Как реализовать Complex modulated filter bank Фильтрация сигнала (создать аналог функции filter на С#) Новичок не может понять, где в программе ошибка (Filter design analysis tool) |
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 отсчетов. Непонятно, почему для первого отсчета выхода особенная формула:
В данном примере количество коэффициентов a и b совпадает, но если эти вектора будут разной длины, то код тоже слетит...
0
|
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 64
|
||||||
12.12.2017, 18:31 [ТС] | 5 | |||||
Annza, Как учесть тот факт, что, если длины a и b разные, то код бы сохранил работоспособность? Если учесть Ваши замечания, то будет выводится следующее:
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. По-моему, это важное отличие. Почему такое происходит? Получилось следующее:
Не фильтрованный сигнал также находится в интервале от -2 до 2. И получается, что сигнал в итоге и не фильтруется вовсе. Если применить стандартную функцию, то сигнал имеет такой вид:
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 имеют другие значения. Вот, со всеми входными данными:
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) были.
Кликните здесь для просмотра всего текста
2
|
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 64
|
|||||||||||
12.12.2017, 21:29 [ТС] | 12 | ||||||||||
Krasme, ого. Спасибо!
Два вопроса: Почему в цикле по n мы идем от максимальной длины векторов a, b?
0
|
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
|
|||||||||||
12.12.2017, 21:35 | 13 | ||||||||||
смотрите логику в цикле
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)?
Встроенный фильтр:
0
|
6830 / 4890 / 2065
Регистрация: 02.02.2014
Сообщений: 13,048
|
|
12.12.2017, 21:47 | 16 |
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 | |
12.12.2017, 21:52 | |
Помогаю со студенческими работами здесь
20
Настройка Digital Filter Функция filter() Не понимаю как работает функция filter() Filter Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |