Jump to content
    

Добрый день!

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

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

Screenshot_20230914_181940.thumb.png.a3fc309e4794f2ad136b1dc35df4f0dd.png

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

11 minutes ago, Alex11 said:

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

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

Share this post


Link to post
Share on other sites

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

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

:)))))

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

58 minutes ago, des00 said:

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

Длина буфера

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

:)))))

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

48 minutes ago, C2000 said:

Длина буфера

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

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

7 hours ago, Alex11 said:

float DigFil(float invar)

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

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

Share this post


Link to post
Share on other sites

11 hours ago, C2000 said:

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

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

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

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

16 minutes ago, Arlleex said:

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

Не нужен?

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...