Полная версия этой страницы:
Режекторный фильтр в Matlab
Atlantis-
Sep 6 2016, 09:21
Добрый день!
Столкнулся с такой проблемой: рассчитал в матлаб режекторный фильтр с одинарной точностью, реализую его на STM32F429 и как то получается, что выходной результат зашкаливает. На вход фильтра подаю случайное число с наложенной на него маской 0xFFFFFF (RND&0xFFFFFF), на выходе надеюсь получить тоже 24 бита, так как ЦАП у меня 24-битный. В реальности на выходе получается белый шум. Если на вход накладывать маску 0x3FFFFF, то получается нормальная характеристика. Или с тем же успехом можно сдвигать результат на 2 бита. Объясните пожалуйста, почему так происходит?
jorikdima
Sep 6 2016, 16:26
А в Матлабе усиления нет? Ну то есть на частотах вне выреза режектора характеристика близка к 1?
Atlantis-
Sep 6 2016, 18:04
Цитата(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
Atlantis-
Sep 7 2016, 08:54
Переполнения возникают, когда входной сигнал больше, чем 0x3FFFFF
Например если х[k]=0xE87132, то y[k]=011334E0
Возможно в этом ошибка? Я имею ввиду, что поданный мною на фильтр белый шум - это изначально int с наложенной маской 0xFFFFFF
После преобразования во float - это всегда положительное число
А ЦАП итоговый результат воспринимает как 24-битное знаковое число.
Хотя, наверно, если я на вход подаю 24-битное положительное число, то на выходе тоже должно получится 24-битное число?
Atlantis-
Sep 8 2016, 13:07
Немного поэкспериментировал, теперь точнее могу задать свой вопрос.
Исходные данные: на вход режекторного фильтра, рассчитанного в матлаб, я подаю белый шум амплитудой от -8388607 до 8388607. После фильтра я получаю сигнал, некоторые значения которого выходят из заданного диапазона (от -8388607 до 8388607). Объясните мне пожалуйста, так и должно быть?
jorikdima
Sep 8 2016, 16:27
Ну так отладьте программу, посмотрите почему. Либобаг, либо ошибки арифметики (округление коэфициетов и пр.).
Atlantis-
Sep 9 2016, 06:34
Как мне ее отладить? Ну поставил я точку останова в момент переполнения, посчитал, убедился, что расчет то верный. Все входные значения не выходят из заданного диапазона. А выходное, расчетное, выходит.
Насчет округлений...я разбил уравнение на пять слагаемых (а1*хk, a2*xk-1 и т.д.) и проверил как процессор их считает. А процессор считает только семь десятичных знаков. Допустим, я сложив сам на калькуляторе пять слагаемых получил 8855641,8 а процессор округлил до 8855641. Но мне коллеги сказали что в принципе это не страшно.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.