Vladimir_T 1 29 ноября, 2021 Опубликовано 29 ноября, 2021 · Жалоба Здравствуйте, уважаемые коллеги, очень прошу подсказать в вопросе фильтрации данных АЦП. С помощью программы Filter Solution 2020 сформировал цифровой полосовой фильтр Чебышева 4-го порядка. Работает вроде норамально. Параметры сбора данных: 1. Данные с АЦП набираются в буфер; 2. Частота входного сигнала - 3 кГц: 3. Количество периодов входного сигнала - 6; 4. Частота дискретизации входного сигнала - 810 кГц; 5. Количество выборок АЦП на период входного сигнала - 270. На рисунках два сигнала: после фильтра и до фильтра. Когда переходной процесс в первом из шести периодов, то приходится первый период просто исключать. Но почему переходной процесс бывает и на других периодах? При том, что сигнал стационарный, срывов нет, а фильтр не часто, но иногда сбоит. В чем может быть причина? Такое поведение приводит в последствии к ошибкам. Буду очень признателен за любую подсказку. Исходный текст самого фильтра. long double DigFil_Cheb_4 (__packed u16 *invar, long double initval, int setic) /******************************************************************************/ /* 4th Order Low Pass Chebyshev I */ /* Bilinear Transformation with Prewarping */ /* Sample Frequency = 810.0 KHz */ /* With 3rd Order Sin(X)/X Correction */ /* Standard Form */ /* Arithmetic Precision = 16 Digits */ /* */ /* Pass Band Frequency = 3.000 KHz */ /* Pass Band Ripple = 0.5 dB */ /* */ /******************************************************************************/ { long double sumnum=0.0, sumden=0.0; int i=0; static long double states[7] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0}; static long double znum[8] = { 0.0, 0.0, 0.0, 1.037407205012938e-08, 4.14962882005175e-08, 6.224443230077626e-08, 4.14962882005175e-08, 1.037407205012938e-08 }; static long double zden[7] = { 5.789401890785755e-03, -5.037903441204501e-02, .3103400477673596, .1064201415196578, -2.763130885390835, 5.182779870521576, -3.791819375911347 }; if (setic==1){ for (i=0;i<7;i++) states[i] = 6024635.234649306*initval; return initval; } else{ sumnum = sumden = 0.0; for (i=0;i<7;i++){ sumden += states[i]*zden[i]; sumnum += states[i]*znum[i]; if (i<6) states[i] = states[i+1]; } states[6] = *invar - sumden; sumnum += states[6]*znum[7]; return sumnum; } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
eugen_pcad_ru 0 29 ноября, 2021 Опубликовано 29 ноября, 2021 · Жалоба Эффект наблюдается всегда в начале буфера? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 29 ноября, 2021 Опубликовано 29 ноября, 2021 · Жалоба 4 hours ago, eugen_pcad_ru said: Эффект наблюдается всегда в начале буфера? Почти всегда в начале сбора массива, и я это принимаю за переходной процесс. Чтобы переходной процесс уменьшить по амплитуде, не обнуляю промежуточный вспомогательный массив фильтра, чтобы помнил историю, но этот переходный процесс есть всегда - это приемлемо. Но иногда один раз из двадцати этот переход появляется в середине - это приводит к большой ошибке в конечных данных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 30 ноября, 2021 Опубликовано 30 ноября, 2021 · Жалоба а может быть не в фильтре дело, а в данных массива есть разрыв? По коду вроде все четко, как вариант взять матлаб, сделать этот фильтр и подсунуть ему данные, посмотреть будет ли вести себя аналогично Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
seniorandre 0 30 ноября, 2021 Опубликовано 30 ноября, 2021 · Жалоба Поскольку судя по графику вы берете выборку из 6 периодов, то вы напарываетесь на краевые эффекты, т.к. у вас сигнал начинается с разных начальных значений синусоиды, у вас не синхронная выборка. Соотв, как вариант можно умножить выборку на любую оконную функцию. А вообще не хватает данных по последующей математике результата. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 30 ноября, 2021 Опубликовано 30 ноября, 2021 · Жалоба 5 hours ago, des00 said: а может быть не в фильтре дело, а в данных массива есть разрыв? Стараюсь у себя искать ошибки в первую очередь. Много раз перепроверил - пока ошибок не нашел. 5 hours ago, seniorandre said: не синхронная выборка. Соотв, как вариант можно умножить выборку на любую оконную функцию. А вообще не хватает данных по последующей математике результата. Выборка, конечно не абсолютно синхронная, но я пытаюсь ее сделать таковой. По предыдущим выборкам находится средний уровень, как уровень запуска АЦП. А последующая обработка состоит в том, чтобы методом квадратурного демодулятора вычислить фазу сигнала. Эта часть работает хорошо, но вот из-за сбоев в НЧ-фильтре появляются ошибки. Их тоже можно отфильтровать, но сам факт их появления - не дает покоя, их не должно быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 30 ноября, 2021 Опубликовано 30 ноября, 2021 · Жалоба 2 hours ago, Vladimir_T said: Их тоже можно отфильтровать, но сам факт их появления - не дает покоя, их не должно быть. а если обычный фир, с целочисленными коэффициентами поставить и посмотреть? Может округление где накапливается? Ну и я все же за тест в матлабе) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 30 ноября, 2021 Опубликовано 30 ноября, 2021 · Жалоба 5 hours ago, des00 said: а если обычный фир, с целочисленными коэффициентами поставить и посмотреть? Может округление где накапливается? Ну и я все же за тест в матлабе) С МатЛабом не умею работать. Для тестирования фильтра заранее сформирован табличный синус -сигнал, который подменяет сигнал АЦП. В этом случае артефактов не замечено. Видать в сигнале все же есть помехи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Александр77 1 30 ноября, 2021 Опубликовано 30 ноября, 2021 · Жалоба А сигнал на вход АЦП чем формируете? Не может быть так, что генератор портит сигнал? Или генератор с платой АЦП.. Прием по USB? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 1 декабря, 2021 Опубликовано 1 декабря, 2021 · Жалоба 14 hours ago, Александр77 said: А сигнал на вход АЦП чем формируете? Не может быть так, что генератор портит сигнал? Или генератор с платой АЦП.. Прием по USB? Сигнал на АЦП приходит из усилителя с узкополосным фильтром. Генератор высокостабильный TXCO, вся система от него работает. Прием по USB, по протоколу, с контрольной суммой. Ошибка, конечно, аппаратная набегает - буду продолжать ее поиски. Благодарю всех за дельные советы и желание помочь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 1 декабря, 2021 Опубликовано 1 декабря, 2021 · Жалоба 17 hours ago, Vladimir_T said: Для тестирования фильтра заранее сформирован табличный синус -сигнал, который подменяет сигнал АЦП. В этом случае артефактов не замечено. Видать в сигнале все же есть помехи. синус не совсем хорошо для тестирования фильтров. Если можно записать ваш сигнал, то захватить его в файл и потом, в офлайне, попробовать разные фильтр в любом ПО, которым владете. В том же питоне например, с либами а-ля матлаб. Данный скил в любом случае пригодиться) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 1 декабря, 2021 Опубликовано 1 декабря, 2021 · Жалоба Нашел причину! Обнаружил причину в функции формирования условия формирования массива данных АЦП. Эта функция вычисляет средний уровень Uср сигнала по предыдущим периодам, потом в прерываниях АЦП ожидается сигнал, по превышению Uср формируется флаг разрешения заполнения массива данными. Этот флаг иногда пере взводится, что и приводит к появлению ошибки в работе фильтра. Беспечность подвела - я был уверен в безупречности функции запуска. Еще раз всех сердечно благодарю за помощь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться