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