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

9 minutes ago, looser said:

А может просто фильтр рассчитать?

Рассчитайте пожалуйста фильтр у которого не будет всплеска на страте, верните народ в реальность

3 hours ago, Arlleex said:

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

Формулу можно такого фильтра скользящего среднего?

4 hours ago, aBoomest said:

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

Да уже проверил и понял что это тупиковая идея

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


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

51 минуту назад, C2000 сказал:

А может просто фильтр рассчитать?

А как? Переходный процесс будет. Это просто свойство фильтра. Может быть вы не ту задачу решаете?

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


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

41 минуту назад, C2000 сказал:

Формулу можно такого фильтра скользящего среднего?

Экспоненциальное бегущее среднее.

Спойлер
#define divrnd(a, b) (((a) + (b) / 2) / (b))

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  static unsigned int x = 0;
  int adc = TrackBar1->Position;
  Label1->Caption  = (UnicodeString)adc;
  
  static unsigned int filt = 0;
  
  filt = (600 * adc + 97 * filt) / 100; // вот он весь фильтр y = 0.03x + 0.97y
  
  Label2->Caption = (UnicodeString)(divrnd(filt, 200));
  Series1->AddXY(x, divrnd(filt, 200));
  
  if(++x == 999) {
    x = 0;
    Series1->Clear();
  }
}

Потыкать в реале.exe

Тыкалку прикладываю для иллюстрации - как видно, никакого массива памяти и не требуется.

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


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

9 минут назад, Arlleex сказал:

Экспоненциальное бегущее среднее.

  Показать контент
#define divrnd(a, b) (((a) + (b) / 2) / (b))

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  static unsigned int x = 0;
  int adc = TrackBar1->Position;
  Label1->Caption  = (UnicodeString)adc;
  
  static unsigned int filt = 0;
  
  filt = (600 * adc + 97 * filt) / 100; // вот он весь фильтр y = 0.03x + 0.97y
  
  Label2->Caption = (UnicodeString)(divrnd(filt, 200));
  Series1->AddXY(x, divrnd(filt, 200));
  
  if(++x == 999) {
    x = 0;
    Series1->Clear();
  }
}

Потыкать в реале.exe

Тыкалку прикладываю для иллюстрации - как видно, никакого массива памяти и не требуется.

Ну это разные дела. Хотя для практического применения вполне  сойдет.

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


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

Только у такого фильра в отличии от скользящего среднего всплеск на старте будет

Ладно думаю можно заканчивать обсуждение. Понятно что либо буфер либо смирится с выбросом

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


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

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

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


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

6 часов назад, C2000 сказал:

Только у такого фильра в отличии от скользящего среднего всплеск на старте будет

Ладно думаю можно заканчивать обсуждение. Понятно что либо буфер либо смирится с выбросом

Вы про минимально фазовые цепи чего-нить слышали? Если не слышали - ну и ладно. А иначе - поинтересуйтесь. Будет полезный опыт.

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


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

12 hours ago, _pv said:

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

Фильтр и после второй половины не зануляет

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


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

3 hours ago, C2000 said:

Фильтр и после второй половины не зануляет

простое скользящее среднее с длиной равной периоду вполне занулит,

но выброс от первого полупериода всё равно будет,

а своим более "медленным" фильтром (по сравнению со скользящим средним по периоду) вы этот выброс просто ещё дополнительно размазали, уменьшив амплитуду, но растянув по времени.

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

image.thumb.png.f11b5e43c14b084b7bb3ba89a0b82be8.png

 

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


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

On 9/14/2023 at 6:27 PM, C2000 said:

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

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

Делайте сразу полосовой фильтр и тогда не придется делать отдельно ФВЧ и ФНЧ:

image.thumb.jpeg.30cde70df396ae87b3b0273118cf9799.jpeg

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


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

On 9/15/2023 at 9:56 AM, Arlleex said:

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

Можете пояснить, почему? Хранить отсчеты сигнала для усреднения вы где подразумеваете?

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


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

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

Можете пояснить, почему? Хранить отсчеты сигнала для усреднения вы где подразумеваете?

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

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


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

Quote

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

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

Прошу прощения, с HTML не совладал.

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


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

В 18.09.2023 в 13:05, aBoomest сказал:

Круто. Интересно. И как?

Никак. Какую форму не запили длина памяти фильтра не изменится. Чудес не бывает.

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


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

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

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

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

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

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

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

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

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

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