C2000 2 15 сентября, 2023 Опубликовано 15 сентября, 2023 · Жалоба 9 minutes ago, looser said: А может просто фильтр рассчитать? Рассчитайте пожалуйста фильтр у которого не будет всплеска на страте, верните народ в реальность 3 hours ago, Arlleex said: Ну если не нужны какие-то адаптации, то нет, не нужен. Формулу можно такого фильтра скользящего среднего? 4 hours ago, aBoomest said: Всплеска просто не видно, если DC больше амплитуды. Вы хотите так сильно искусственно исказить сигнал? Да уже проверил и понял что это тупиковая идея 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
looser 8 15 сентября, 2023 Опубликовано 15 сентября, 2023 · Жалоба 51 минуту назад, C2000 сказал: А может просто фильтр рассчитать? А как? Переходный процесс будет. Это просто свойство фильтра. Может быть вы не ту задачу решаете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 15 сентября, 2023 Опубликовано 15 сентября, 2023 · Жалоба 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 Тыкалку прикладываю для иллюстрации - как видно, никакого массива памяти и не требуется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
looser 8 15 сентября, 2023 Опубликовано 15 сентября, 2023 · Жалоба 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 Тыкалку прикладываю для иллюстрации - как видно, никакого массива памяти и не требуется. Ну это разные дела. Хотя для практического применения вполне сойдет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
C2000 2 15 сентября, 2023 Опубликовано 15 сентября, 2023 · Жалоба Только у такого фильра в отличии от скользящего среднего всплеск на старте будет Ладно думаю можно заканчивать обсуждение. Понятно что либо буфер либо смирится с выбросом Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 52 15 сентября, 2023 Опубликовано 15 сентября, 2023 · Жалоба у первой половины периода синуса среднее значение совсем не равно нулю, а будет ли после первой половины периода ещё и вторая отрицательная половина периода чтобы среднее значение занулить, фильтр предсказать ну никак не может. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
looser 8 15 сентября, 2023 Опубликовано 15 сентября, 2023 · Жалоба 6 часов назад, C2000 сказал: Только у такого фильра в отличии от скользящего среднего всплеск на старте будет Ладно думаю можно заканчивать обсуждение. Понятно что либо буфер либо смирится с выбросом Вы про минимально фазовые цепи чего-нить слышали? Если не слышали - ну и ладно. А иначе - поинтересуйтесь. Будет полезный опыт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
C2000 2 16 сентября, 2023 Опубликовано 16 сентября, 2023 · Жалоба 12 hours ago, _pv said: у первой половины периода синуса среднее значение совсем не равно нулю, а будет ли после первой половины периода ещё и вторая отрицательная половина периода чтобы среднее значение занулить, фильтр предсказать ну никак не может. Фильтр и после второй половины не зануляет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 52 16 сентября, 2023 Опубликовано 16 сентября, 2023 · Жалоба 3 hours ago, C2000 said: Фильтр и после второй половины не зануляет простое скользящее среднее с длиной равной периоду вполне занулит, но выброс от первого полупериода всё равно будет, а своим более "медленным" фильтром (по сравнению со скользящим средним по периоду) вы этот выброс просто ещё дополнительно размазали, уменьшив амплитуду, но растянув по времени. причём интеграл от этого выброса будет неизменным и равным интегралу от первого полупериода, и делая фильтр всё более низкочастотным его амплитуду можно уменьшить только за счёт растягивания по времени. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 16 16 сентября, 2023 Опубликовано 16 сентября, 2023 · Жалоба On 9/14/2023 at 6:27 PM, C2000 said: При чисто синусоидальном сигнале когда постоянной составляющей нет, на выходе фильтра она есть. Возможно ли избавиться от этого эффекта? Какой тип фильтра позволит это сделать. Необходимо фильтровать 10Гц хотя бы на 40Дб, 50Гц на 60Дб, при этом на выходе сигнал должен установиться в течении 1-2секунд. Делайте сразу полосовой фильтр и тогда не придется делать отдельно ФВЧ и ФНЧ: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aBoomest 0 18 сентября, 2023 Опубликовано 18 сентября, 2023 · Жалоба On 9/15/2023 at 9:56 AM, Arlleex said: Ну если не нужны какие-то адаптации, то нет, не нужен. Можете пояснить, почему? Хранить отсчеты сигнала для усреднения вы где подразумеваете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 18 сентября, 2023 Опубликовано 18 сентября, 2023 · Жалоба 3 часа назад, aBoomest сказал: Можете пояснить, почему? Хранить отсчеты сигнала для усреднения вы где подразумеваете? Нигде их не надо хранить. Потому что это другая форма реализации одного и того же фильтра. Он настолько незначительно отличается от фильтра с буфером, что наличие буфера - как раз определяющий недостаток при выборе реализации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aBoomest 0 18 сентября, 2023 Опубликовано 18 сентября, 2023 · Жалоба Круто. Интересно. И как? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 3 19 сентября, 2023 Опубликовано 19 сентября, 2023 · Жалоба 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 не совладал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
looser 8 20 сентября, 2023 Опубликовано 20 сентября, 2023 · Жалоба В 18.09.2023 в 13:05, aBoomest сказал: Круто. Интересно. И как? Никак. Какую форму не запили длина памяти фильтра не изменится. Чудес не бывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться