Перейти к содержанию
    

Режекторный фильтр в Matlab

Добрый день!

Столкнулся с такой проблемой: рассчитал в матлаб режекторный фильтр с одинарной точностью, реализую его на STM32F429 и как то получается, что выходной результат зашкаливает. На вход фильтра подаю случайное число с наложенной на него маской 0xFFFFFF (RND&0xFFFFFF), на выходе надеюсь получить тоже 24 бита, так как ЦАП у меня 24-битный. В реальности на выходе получается белый шум. Если на вход накладывать маску 0x3FFFFF, то получается нормальная характеристика. Или с тем же успехом можно сдвигать результат на 2 бита. Объясните пожалуйста, почему так происходит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в Матлабе усиления нет? Ну то есть на частотах вне выреза режектора характеристика близка к 1?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в Матлабе усиления нет? Ну то есть на частотах вне выреза режектора характеристика близка к 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Переполнения возникают, когда входной сигнал больше, чем 0x3FFFFF

Например если х[k]=0xE87132, то y[k]=011334E0

Возможно в этом ошибка? Я имею ввиду, что поданный мною на фильтр белый шум - это изначально int с наложенной маской 0xFFFFFF

После преобразования во float - это всегда положительное число

 

А ЦАП итоговый результат воспринимает как 24-битное знаковое число.

Хотя, наверно, если я на вход подаю 24-битное положительное число, то на выходе тоже должно получится 24-битное число?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Немного поэкспериментировал, теперь точнее могу задать свой вопрос.

Исходные данные: на вход режекторного фильтра, рассчитанного в матлаб, я подаю белый шум амплитудой от -8388607 до 8388607. После фильтра я получаю сигнал, некоторые значения которого выходят из заданного диапазона (от -8388607 до 8388607). Объясните мне пожалуйста, так и должно быть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну так отладьте программу, посмотрите почему. Либобаг, либо ошибки арифметики (округление коэфициетов и пр.).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как мне ее отладить? Ну поставил я точку останова в момент переполнения, посчитал, убедился, что расчет то верный. Все входные значения не выходят из заданного диапазона. А выходное, расчетное, выходит.

Насчет округлений...я разбил уравнение на пять слагаемых (а1*хk, a2*xk-1 и т.д.) и проверил как процессор их считает. А процессор считает только семь десятичных знаков. Допустим, я сложив сам на калькуляторе пять слагаемых получил 8855641,8 а процессор округлил до 8855641. Но мне коллеги сказали что в принципе это не страшно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...