Форум программистов, компьютерный форум, киберфорум
Цифровая обработка сигналов
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.77/35: Рейтинг темы: голосов - 35, средняя оценка - 4.77
korsaj
152 / 119 / 11
Регистрация: 16.08.2013
Сообщений: 576
1

Алгоритм полосового фильтра Блэкмана

18.08.2015, 22:59. Просмотров 7002. Ответов 61
Метки нет (Все метки)

Добрый день!
Основываясь на http://habrahabr.ru/post/128140/
и книге Эммануил Айфичер "Цифровая обработка сигналов: практический подход"
написал метод полосового фильтра Блэкмана:
Java
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    /**
     * Filt Blakmena 
     */
    
    double[] Filter (int[] in, int sizeIn)
    {
        double Fd = 50; //Частота дискретизации входных данных
        double F1 = 15; //Частота начала полосы пропускания
        double F2 = 20; //Частота конца полосы пропускания
        int dF = 5;
        double dFn = dF/Fd;
        int N = (int)(5.5/dFn + 0.5); //Длина фильтра (округляем до ближайшего целого)
        
        double[] out = new double[sizeIn];      
    
        double[] H = new double[N]; //Импульсная характеристика фильтра
        double[] H_id = new double[N]; //Идеальная импульсная характеристика
        double[] W = new double[N]; //Весовая функция
 
        //Расчет импульсной характеристики фильтра
        double F1n = (F1 + dF/2) / Fd; //Normirovannaya chastota nachala polosi propyskaniya
        double F2n = (F2 - dF/2) / Fd; //Normirovannaya chastota konca polosi propyskaniya
    
        for (int i=0;i<N;i++)
        {
            // Полосовой фильтр с полосой пропускания от F1 до F2
            if (i==0) H_id[i] = 2*(F2n-F1n);
            else H_id[i] = 2*F2n*Math.sin(Math.PI*F2n*i)/(Math.PI*F2n*i) - 2*F1n*Math.sin(Math.PI*F1n*i)/(Math.PI*F1n*i);
            
            // весовая функция Блекмена
            W [i] = 0.42 - 0.5 * Math.cos((2*Math.PI*i) /( N-1)) + 0.08 * Math.cos((4*Math.PI*i) /( N-1));
            H [i] = H_id[i] * W[i];
        }
    
        //Нормировка импульсной характеристики
        double SUM=0;
        for (int i=0; i<N; i++) SUM +=H[i];
        for (int i=0; i<N; i++) H[i]/=SUM; //сумма коэффициентов равна 1
    
        //Фильтрация входных данных
        for (int i=0; i<sizeIn; i++)
        {
            out[i]=0;
            int M = Math.min(N, i);
            for (int j=0; j<M; j++){
                out[i]+= H[j]*in[i-j];// фильтр
            }
        }       
        return out;
    }
Но на выходе получаю какуюто несуразицу - выходные значения в несколько порядков превышают значения входных.
Если закоментировать нормировку импульсной хар-ки то выходные значения получаются меньше значений входных данных.

Подскажите что сделал не так?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2015, 22:59
Ответы с готовыми решениями:

fdatool. Расчет полосового фильтра
нужно рассчитать полосовой фильтр. какая формула у полосового фильстра? y=f(x)

Реализация полосового фильтра Баттерворта 3 порядка
Использование z-преобразования Ннч(S)--&gt; Hпф(z) с получением соответствующей матрицы, позволяет...

Расчет порядка нормированного прототипа ФНЧ при расчете полосового фильтра
Добрый день! После длительного перерыва опять занялся разработкой приложения на С++ для...

Рабочая схема полосового фильтра
Фильтр должен обрезать частоты ниже 20 герц и выше 500 Кгц. Расчеты сделал. Схему в протеусе...

61
korsaj
152 / 119 / 11
Регистрация: 16.08.2013
Сообщений: 576
19.08.2015, 10:31  [ТС] 2
Сделал расчет коэффициентов в екселе
Вот что получилось
0
Миниатюры
Алгоритм полосового фильтра Блэкмана  
androbro
359 / 315 / 72
Регистрация: 17.10.2014
Сообщений: 930
19.08.2015, 10:47 3
korsaj, красота
0
Pablito
2867 / 2279 / 768
Регистрация: 12.05.2014
Сообщений: 7,978
Завершенные тесты: 1
19.08.2015, 10:52 4
на всякий пожарный - Math.sin надо подавать угол в радианах, а не градусах (я в код не вникал, не в курсе в чём там)
0
Rube
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,079
19.08.2015, 11:27 5
korsaj, а где тут андроид? Мб в яве ответят?
0
A_Santik
148 / 129 / 18
Регистрация: 29.04.2015
Сообщений: 626
20.08.2015, 08:55 6
Рекомендую построить АЧХ и ФЧХ полученного фильтра. Сделать это просто. Надо сделать БПФ импульсной характеристики h(t).
0
korsaj
152 / 119 / 11
Регистрация: 16.08.2013
Сообщений: 576
20.08.2015, 08:58  [ТС] 7
А смысл? Ведь, скорее всего, ошибка в алгоритме..
0
A_Santik
148 / 129 / 18
Регистрация: 29.04.2015
Сообщений: 626
20.08.2015, 10:32 8
Ну тогда окно для начала убери :-)

Добавлено через 13 минут
А, понял где ошибка! См. https://www.cyberforum.ru/post7988076.html
0
korsaj
152 / 119 / 11
Регистрация: 16.08.2013
Сообщений: 576
20.08.2015, 10:45  [ТС] 9
Вы про какое окно?
Только я не понял где ошибка..
0
A_Santik
148 / 129 / 18
Регистрация: 29.04.2015
Сообщений: 626
20.08.2015, 11:00 10
Ну во-первых Вы не очень правильно называете свой фильтр "фильтр Блэкмана ".
Существует оконная (весовая) функция Блэкмана. Для поиска ошибки я и предлагал сделать "прямоугольное окно",
т.е. W[i]=1; АЧХ такого фильтра будет несколько хуже, но фильтр должен работать.
Но основная ошибка - H[i] - должна быть симметрична относительно центра - Н[0]
Т.е. все коэффициенты должны зеркально отразиться относительно Н[0]
Это касается и весовой функции!

http://www.dsplib.ru/content/win/win.html
0
korsaj
152 / 119 / 11
Регистрация: 16.08.2013
Сообщений: 576
20.08.2015, 12:05  [ТС] 11
Ну прямоугольное делать думаю не надо..
А вот симметрию попробую.
Получается нужно получить вот такой график
Я понял вашу идею с прямоугольным окном, она даст возможность проверить алгоритм программы
0
Миниатюры
Алгоритм полосового фильтра Блэкмана  
A_Santik
148 / 129 / 18
Регистрация: 29.04.2015
Сообщений: 626
20.08.2015, 12:15 12
Да, совершенно верно. Потом умножить на оконную функцию так, чтобы максимумы совпадали.
0
Миниатюры
Алгоритм полосового фильтра Блэкмана  
A_Santik
148 / 129 / 18
Регистрация: 29.04.2015
Сообщений: 626
20.08.2015, 12:32 13
Только следите за индексами (чтобы в отрицательные не попасть).
И учтите, что любой фильтр даёт временную задержку на число отсчетов равное N/2.
По фильтрации хороший сайт dsplib.ru ну и на статьи на https://www.cyberforum.ru/post7988076.html я ссылку уже давал.
Ссылки на форумы дать не могу. И так уже нахожусь под статьёй 5.8. :-)
Успехов!
1
korsaj
152 / 119 / 11
Регистрация: 16.08.2013
Сообщений: 576
20.08.2015, 13:12  [ТС] 14
Спасибо за помощь, вечером попробую, если время найду.
А ссылку можете кинуть в личку...
0
korsaj
152 / 119 / 11
Регистрация: 16.08.2013
Сообщений: 576
20.08.2015, 16:35  [ТС] 15
С учетом ваших рекомендаций вот что получилось
0
Миниатюры
Алгоритм полосового фильтра Блэкмана  
A_Santik
148 / 129 / 18
Регистрация: 29.04.2015
Сообщений: 626
20.08.2015, 19:25 16
Да, так примерно должно всё выглядеть!
Ну теперь что-нибудь отфильтровать нужно...:-)
0
korsaj
152 / 119 / 11
Регистрация: 16.08.2013
Сообщений: 576
20.08.2015, 19:55  [ТС] 17
Для упращения собственного труда начал писать макрос фильтра в екселе

Вот что он у меня выдает
0
Миниатюры
Алгоритм полосового фильтра Блэкмана  
A_Santik
148 / 129 / 18
Регистрация: 29.04.2015
Сообщений: 626
20.08.2015, 20:05 18
Смысла большого не вижу - в Excel тяжело будет длинные последовательности фильтровать. А коэффициенты - можно и Excel.
0
korsaj
152 / 119 / 11
Регистрация: 16.08.2013
Сообщений: 576
21.08.2015, 09:14  [ТС] 19
Попробовал фильтрацию
Почему то выходной сигнал по амплитуде превосходит входной на 4 порядка...
0
Миниатюры
Алгоритм полосового фильтра Блэкмана  
korsaj
152 / 119 / 11
Регистрация: 16.08.2013
Сообщений: 576
21.08.2015, 09:34  [ТС] 20
Отмаштабировал обычным делением на 2000 и вывел кусочек
0
Миниатюры
Алгоритм полосового фильтра Блэкмана  
21.08.2015, 09:34
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2015, 09:34

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Настройка полосового фильтра
Доброго времени суток. Возникла необходимость поставить полосовой фильтр(пропустить частоту 1100...

Проектирование полосового фильтра
Необходимо спроектировать полосовой фильтр с полосой пропускания 25-35 МГц.Ослабление в полосе...

Расчет полосового фильтра на базе ОУ
Найти: – величины элементов схемы для получения заданного коэффициента усиления K0, – нижнюю...

Как выглядит передаточная функция полосового фильтра
Нашел АЧХ и ФЧХ фильтра. А как найти саму передаточную функцию? Типа H(p)=N(p)/D(p). Могу...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.