реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Режекторный фильтр в Matlab, появляется усиление
Atlantis-
сообщение Sep 6 2016, 09:21
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Добрый день!
Столкнулся с такой проблемой: рассчитал в матлаб режекторный фильтр с одинарной точностью, реализую его на STM32F429 и как то получается, что выходной результат зашкаливает. На вход фильтра подаю случайное число с наложенной на него маской 0xFFFFFF (RND&0xFFFFFF), на выходе надеюсь получить тоже 24 бита, так как ЦАП у меня 24-битный. В реальности на выходе получается белый шум. Если на вход накладывать маску 0x3FFFFF, то получается нормальная характеристика. Или с тем же успехом можно сдвигать результат на 2 бита. Объясните пожалуйста, почему так происходит?
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Sep 6 2016, 16:26
Сообщение #2


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



А в Матлабе усиления нет? Ну то есть на частотах вне выреза режектора характеристика близка к 1?
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Sep 6 2016, 18:04
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(jorikdima @ Sep 6 2016, 19:26) *
А в Матлабе усиления нет? Ну то есть на частотах вне выреза режектора характеристика близка к 1?

Нет усиления, характеристика выходит в 0 дБ. В микроконтроллере коэффициенты немного обрезаются (например пишу а1=0.9925637453629, под отладкой показывает а1=а1=0.9925637). Но я смоделировал с обрезанными коэффициентами в маткаде - все нормально получилось, без усиления и характеристика не изменилась.

Реализую вот так:
Код
        struct {
        
        float a0;
        float a1;
        float a2;
        float b1;
        float b2;
        int k;
        int k1;
        int k2;    
            
        float X[4];
        float Y[4];
            
        int Y1;
            
    } NotchedFilter;


в прерывании I2S
Код
//выдаю данные
hsai_BlockA1.Instance->DR = noise.NotchedFilter.Y1;
hsai_BlockA1.Instance->DR = noise.NotchedFilter.Y1;
//считаю следующий отсчет
//                    noise.NotchedFilter.Y[noise.NotchedFilter.k] = noise.NotchedFilter.a2*noise.NotchedFilter.X[noise.NotchedFilter.k2] +
//                    noise.NotchedFilter.a1*noise.NotchedFilter.X[noise.NotchedFilter.k1] + noise.NotchedFilter.a0*noise.NotchedFilter.X[noise.NotchedFilter.k] -
//                    noise.NotchedFilter.b1*noise.NotchedFilter.Y[noise.NotchedFilter.k1] - noise.NotchedFilter.b2*noise.NotchedFilter.Y[noise.NotchedFilter.k2];
                    
                    noise.NotchedFilter.Y[noise.NotchedFilter.k] = noise.NotchedFilter.a2*(noise.NotchedFilter.X[noise.NotchedFilter.k2] + noise.NotchedFilter.X[noise.NotchedFilter.k]) +
                    noise.NotchedFilter.a1*(noise.NotchedFilter.X[noise.NotchedFilter.k1] - noise.NotchedFilter.Y[noise.NotchedFilter.k1]) -
                    noise.NotchedFilter.b2*noise.NotchedFilter.Y[noise.NotchedFilter.k2];
                    noise.NotchedFilter.Y1 = noise.NotchedFilter.Y[noise.NotchedFilter.k];//оптимизировал а0=а2, а1=b1
                    
                    noise.NotchedFilter.k = (noise.NotchedFilter.k + 1)&BUFFMASK;
                    noise.NotchedFilter.k1 = (noise.NotchedFilter.k - 1)&BUFFMASK;//посчитали индекс Xk-1
                    noise.NotchedFilter.k2 = (noise.NotchedFilter.k - 2)&BUFFMASK;//посчитали индекс Xk-2
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Sep 7 2016, 08:54
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Переполнения возникают, когда входной сигнал больше, чем 0x3FFFFF
Например если х[k]=0xE87132, то y[k]=011334E0
Возможно в этом ошибка? Я имею ввиду, что поданный мною на фильтр белый шум - это изначально int с наложенной маской 0xFFFFFF
После преобразования во float - это всегда положительное число

А ЦАП итоговый результат воспринимает как 24-битное знаковое число.
Хотя, наверно, если я на вход подаю 24-битное положительное число, то на выходе тоже должно получится 24-битное число?
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Sep 8 2016, 13:07
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Немного поэкспериментировал, теперь точнее могу задать свой вопрос.
Исходные данные: на вход режекторного фильтра, рассчитанного в матлаб, я подаю белый шум амплитудой от -8388607 до 8388607. После фильтра я получаю сигнал, некоторые значения которого выходят из заданного диапазона (от -8388607 до 8388607). Объясните мне пожалуйста, так и должно быть?
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Sep 8 2016, 16:27
Сообщение #6


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Ну так отладьте программу, посмотрите почему. Либобаг, либо ошибки арифметики (округление коэфициетов и пр.).
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Sep 9 2016, 06:34
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Как мне ее отладить? Ну поставил я точку останова в момент переполнения, посчитал, убедился, что расчет то верный. Все входные значения не выходят из заданного диапазона. А выходное, расчетное, выходит.
Насчет округлений...я разбил уравнение на пять слагаемых (а1*хk, a2*xk-1 и т.д.) и проверил как процессор их считает. А процессор считает только семь десятичных знаков. Допустим, я сложив сам на калькуляторе пять слагаемых получил 8855641,8 а процессор округлил до 8855641. Но мне коллеги сказали что в принципе это не страшно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 00:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016