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

Вопрос по цифровой фильтации

Здравствуйте, уважаемые коллеги, очень прошу подсказать в вопросе фильтрации данных АЦП.
С помощью программы Filter Solution 2020 сформировал цифровой полосовой фильтр Чебышева 4-го порядка. Работает вроде норамально.  Параметры сбора данных:
1. Данные с АЦП набираются в буфер;
2.  Частота входного сигнала - 3 кГц:
3. Количество периодов входного сигнала -  6;
4. Частота дискретизации входного сигнала - 810 кГц;
5. Количество выборок АЦП на период входного сигнала - 270.
На рисунках два сигнала: после фильтра и до фильтра. Когда переходной процесс в первом из шести периодов, то приходится первый период просто исключать.

1.thumb.png.609620d9083af1bdae85c0528969cc18.png

Но почему переходной процесс бывает  и на других периодах? При том, что сигнал стационарный, срывов нет, а фильтр не часто, но иногда сбоит. В чем может быть причина?

Такое поведение приводит в последствии к ошибкам.

2.thumb.png.237e6fc42d870470b64a6255088d5f80.png

Буду очень признателен за любую подсказку.

Исходный текст самого фильтра.

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;
    }
}

 

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


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

4 hours ago, eugen_pcad_ru said:

Эффект наблюдается всегда в начале буфера?

Почти всегда в начале сбора массива, и я  это принимаю за переходной процесс. Чтобы переходной процесс уменьшить по амплитуде, не обнуляю промежуточный вспомогательный массив фильтра, чтобы помнил историю, но этот переходный процесс есть всегда - это приемлемо. Но иногда один раз из двадцати этот переход появляется в середине - это приводит к большой ошибке в конечных данных. 

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


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

а может быть не в фильтре дело, а в данных массива есть разрыв? По коду вроде все четко, как вариант взять матлаб, сделать этот фильтр и подсунуть ему данные, посмотреть будет ли вести себя аналогично

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


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

Поскольку судя по графику вы берете выборку из 6 периодов, то вы напарываетесь на краевые эффекты, т.к. у вас сигнал начинается с разных начальных значений синусоиды, у вас не синхронная выборка. Соотв, как вариант можно умножить выборку на любую оконную функцию. А вообще не хватает данных по последующей математике результата.

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


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

5 hours ago, des00 said:

а может быть не в фильтре дело, а в данных массива есть разрыв? 

Стараюсь у себя искать ошибки в первую очередь. Много раз перепроверил - пока ошибок не нашел.

5 hours ago, seniorandre said:

 не синхронная выборка. Соотв, как вариант можно умножить выборку на любую оконную функцию. А вообще не хватает данных по последующей математике результата.

Выборка, конечно не абсолютно синхронная, но я пытаюсь ее сделать таковой. По предыдущим выборкам находится средний уровень, как уровень запуска АЦП.

А последующая обработка состоит в том, чтобы методом квадратурного демодулятора вычислить фазу сигнала. Эта часть работает хорошо, но вот из-за сбоев в НЧ-фильтре появляются ошибки. Их тоже можно отфильтровать, но сам факт их появления - не дает покоя, их не должно быть.

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


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

2 hours ago, Vladimir_T said:

Их тоже можно отфильтровать, но сам факт их появления - не дает покоя, их не должно быть.

а если обычный фир, с целочисленными коэффициентами поставить и посмотреть? Может округление где накапливается?

Ну и я все же за тест в матлабе)

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


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

5 hours ago, des00 said:

а если обычный фир, с целочисленными коэффициентами поставить и посмотреть? Может округление где накапливается?

Ну и я все же за тест в матлабе)

С МатЛабом не умею работать.

Для тестирования фильтра заранее сформирован табличный синус -сигнал, который подменяет сигнал АЦП.  В этом случае артефактов не замечено. Видать в сигнале все же есть помехи.

 

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


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

А сигнал на вход АЦП чем формируете?

Не может быть так, что генератор портит сигнал? Или генератор с платой АЦП..

Прием по USB?

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


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

14 hours ago, Александр77 said:

А сигнал на вход АЦП чем формируете?

Не может быть так, что генератор портит сигнал? Или генератор с платой АЦП..

Прием по USB?

Сигнал на АЦП приходит из усилителя с узкополосным фильтром. Генератор высокостабильный TXCO, вся система от него работает. Прием по USB, по протоколу, с контрольной суммой.

Ошибка, конечно, аппаратная набегает - буду продолжать ее поиски.

Благодарю всех за дельные советы и желание помочь. 

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


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

17 hours ago, Vladimir_T said:

Для тестирования фильтра заранее сформирован табличный синус -сигнал, который подменяет сигнал АЦП.  В этом случае артефактов не замечено. Видать в сигнале все же есть помехи.

синус не совсем хорошо для тестирования фильтров. Если можно записать ваш сигнал, то захватить его в файл и потом, в офлайне, попробовать разные фильтр в любом ПО, которым владете. В том же питоне например, с либами а-ля матлаб. Данный скил в любом случае пригодиться)

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


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

Нашел причину! Обнаружил причину в функции формирования условия формирования массива данных АЦП. Эта функция вычисляет средний уровень  Uср сигнала по предыдущим периодам, потом в прерываниях АЦП ожидается сигнал, по превышению Uср формируется флаг разрешения заполнения массива данными. Этот флаг иногда пере взводится, что и приводит к появлению ошибки в работе фильтра. Беспечность подвела - я был уверен в безупречности функции запуска. 

Еще раз всех сердечно благодарю за помощь.

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


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

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

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

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

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

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

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

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

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

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