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

Добрый день!

Задача выделить постоянную составляющую сигнала low-pass фильтром. Окно или скользящее среднее справляются, но интересует именно IIR LPF.

Проблема: При чисто синусоидальном сигнале когда постоянной составляющей нет, на выходе фильтра она есть)

Screenshot_20230914_181940.thumb.png.a3fc309e4794f2ad136b1dc35df4f0dd.png

FIR получается большого порядка.

Возможно ли избавиться от этого эффекта? Какой тип фильтра позволит это сделать. Необходимо фильтровать 10Гц хотя бы на 40Дб, 50Гц на 60Дб, при этом на выходе сигнал должен установиться в течении 1-2секунд.

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


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

Еще существенный вопрос - какая частота дискретизации? Если высокая, то будет тяжело. Для 8 кГц считалка показывает, что Баттерворт 3-го порядка Вас удовлетворит, но считать нужно будет в плавучке с точностью мантиссы не меньше 24 разрядов.

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


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

11 minutes ago, Alex11 said:

Еще существенный вопрос - какая частота дискретизации? Если высокая, то будет тяжело. Для 8 кГц считалка показывает, что Баттерворт 3-го порядка Вас удовлетворит, но считать нужно будет в плавучке с точностью мантиссы не меньше 24 разрядов.

Да не более 8КГц. Но моделирование показало что Баттерворд дает всплеск на старте. Если не трудно выложите коэффициенты фильтра который считаете подойдёт, попробую смоделировать

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


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

В 14.09.2023 в 19:45, C2000 сказал:

Но моделирование показало что Баттерворд дает всплеск на старте

:)))))

Ладно, открою один секрет - ЛЮБОЙ фильтр дает всплеск на старте...

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


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

А чем не устраивает скользящее среднее по рекурсивной схеме? Буфер памяти, аккумулятор и вычитатель? 

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


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

58 minutes ago, des00 said:

А чем не устраивает скользящее среднее по рекурсивной схеме? Буфер памяти, аккумулятор и вычитатель? 

Длина буфера

1 hour ago, Самурай said:

:)))))

Ладно, открою один секрет - ЛЮБОЙ фильтр дает всплеск на старте...

Это понятно. Думал может есть способ как то побороть

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


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

В 14.09.2023 в 22:00, C2000 сказал:

Думал может есть способ как то побороть

Может быть и есть какой способ, но Вы сначала скажите, чем этот "всплеск" Вам мешает? Что у Вас за сигналы? Какая задача? И вообще, если Вас не устраивает просто скользящее среднее, то может подойдет скользящее среднее с децимацией (он же CIC), там буфер не нужен...

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


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

13 minutes ago, Самурай said:

Может быть и есть какой способ, но Вы сначала скажите, чем этот "всплеск" Вам мешает? 

Да не так чтобы сильно мешает, скорее раздражает. Работает и с ним, никто не заметит никогда.

Возникла идея подмешать постоянную выше максимальной амплитуды. После фильтра её вычесть. Т.к. заметил что всплеск только при отсутствии этой самой постоянной составляющей, если она есть (выше амплитуды этого всплеска) то фильтр плавно на неё выходит.

Нужно проверить на модели

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


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

48 minutes ago, C2000 said:

Длина буфера

У меня как-то раз получилось:

считал среднее от входных блоков размером Х и складывал полученные значения в кольцевой буфер длиной У, мне хватило считать скользящие от У.

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


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

Quote

Если не трудно выложите коэффициенты фильтра

float DigFil(float invar)
/******************************************************************************/
/* Filter Solutions Version 2016                 Nuhertz Technologies, L.L.C. */
/*                                                            www.nuhertz.com */
/*                                                            +1 602-279-2448 */
/* 3rd Order Low Pass Butterworth                                             */
/* Bilinear Transformation with Prewarping                                    */
/* Sample Frequency = 8.000 KHz                                               */
/* Parallel Form                                                              */
/* Arithmetic Precision = 6 Digits                                            */
/*                                                                            */
/* Pass Band Frequency = 1.000 Hz                                             */
/*                                                                            */
/******************************************************************************/
/*                                                                            */
/* Input Variable Definitions:                                                */
/* Inputs:                                                                    */
/*   invar    float       The input to the filter                             */
/*                                                                            */
/* Option Selections:                                                         */
/* C++;          Not Initializable;        Internal States;   Optimized;      */
/*                                                                            */
/* There is no requirement to ever initialize the filter.                     */
/* The default initialization is zero when the filter is first called         */
/*                                                                            */
/******************************************************************************/
/*                                                                            */
/* This software is automatically generated by Filter Solutions               */
/* no restrictions from Nuhertz Technologies, L.L.C. regarding the use and    */
/* distributions of this software.                                            */
/*                                                                            */
/******************************************************************************/

{
    static float states[2][3] = {
        {0.0,0.0},
        {0.0,0.0}
    };
    const static float znum[2][2] = {
        {0.000784782,0.0},
        {0.000784782,-0.000784781}
    };
    const static float zden[2][2] = {
        {-0.999215,1.0},
        {0.999215,-1.99921}
    };
    float sumnum = 6.05116e-11*invar;
    for (int i=0;i<=1;i++){
        float sumden=0.0;
        for (int j=0;j<(i==0?1:2);j++){
            sumden += states[j]*zden[j];
            sumnum += states[j]*znum[j];
            if (j<(i==0?0:1)) states[j] = states[j+1];
        }
        states[(i==0?0:1)] = (invar-sumden);
    }
    return sumnum;
}

 

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


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

7 hours ago, Alex11 said:

float DigFil(float invar)

С кодом что то не так) C++ массивы не перемножает

Возможно Ваша программа для расчёта фильтра еще какой хедер выдаёт с перегруженными операторами для float?

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


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

Осталось понять, зачем простому фильтру скользящего среднего некий буфер.

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


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

11 hours ago, C2000 said:

Да не так чтобы сильно мешает, скорее раздражает. Работает и с ним, никто не заметит никогда.

Возникла идея подмешать постоянную выше максимальной амплитуды. После фильтра её вычесть. Т.к. заметил что всплеск только при отсутствии этой самой постоянной составляющей, если она есть (выше амплитуды этого всплеска) то фильтр плавно на неё выходит.

Нужно проверить на модели

Всплеска просто не видно, если DC больше амплитуды. Вы хотите так сильно искусственно исказить сигнал?

16 minutes ago, Arlleex said:

Осталось понять, зачем простому фильтру скользящего среднего некий буфер.

Не нужен?

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


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

17 минут назад, aBoomest сказал:

Не нужен?

Ну если не нужны какие-то адаптации, то нет, не нужен.

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


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

3 часа назад, Arlleex сказал:

Ну если не нужны какие-то адаптации, то нет, не нужен.

А может просто фильтр рассчитать? Какая нафиг адаптация, когда все параметры помехи известны? Я похоже живу в параллельной реальности, где простые вещи превращаются в неразрешимые.

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


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

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

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

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

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

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

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

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

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

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