C2000 3 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба Добрый день! Задача выделить постоянную составляющую сигнала low-pass фильтром. Окно или скользящее среднее справляются, но интересует именно IIR LPF. Проблема: При чисто синусоидальном сигнале когда постоянной составляющей нет, на выходе фильтра она есть) FIR получается большого порядка. Возможно ли избавиться от этого эффекта? Какой тип фильтра позволит это сделать. Необходимо фильтровать 10Гц хотя бы на 40Дб, 50Гц на 60Дб, при этом на выходе сигнал должен установиться в течении 1-2секунд. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 6 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба Еще существенный вопрос - какая частота дискретизации? Если высокая, то будет тяжело. Для 8 кГц считалка показывает, что Баттерворт 3-го порядка Вас удовлетворит, но считать нужно будет в плавучке с точностью мантиссы не меньше 24 разрядов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
C2000 3 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба 11 minutes ago, Alex11 said: Еще существенный вопрос - какая частота дискретизации? Если высокая, то будет тяжело. Для 8 кГц считалка показывает, что Баттерворт 3-го порядка Вас удовлетворит, но считать нужно будет в плавучке с точностью мантиссы не меньше 24 разрядов. Да не более 8КГц. Но моделирование показало что Баттерворд дает всплеск на старте. Если не трудно выложите коэффициенты фильтра который считаете подойдёт, попробую смоделировать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба В 14.09.2023 в 19:45, C2000 сказал: Но моделирование показало что Баттерворд дает всплеск на старте :))))) Ладно, открою один секрет - ЛЮБОЙ фильтр дает всплеск на старте... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба А чем не устраивает скользящее среднее по рекурсивной схеме? Буфер памяти, аккумулятор и вычитатель? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
C2000 3 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба 58 minutes ago, des00 said: А чем не устраивает скользящее среднее по рекурсивной схеме? Буфер памяти, аккумулятор и вычитатель? Длина буфера 1 hour ago, Самурай said: :))))) Ладно, открою один секрет - ЛЮБОЙ фильтр дает всплеск на старте... Это понятно. Думал может есть способ как то побороть Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба В 14.09.2023 в 22:00, C2000 сказал: Думал может есть способ как то побороть Может быть и есть какой способ, но Вы сначала скажите, чем этот "всплеск" Вам мешает? Что у Вас за сигналы? Какая задача? И вообще, если Вас не устраивает просто скользящее среднее, то может подойдет скользящее среднее с децимацией (он же CIC), там буфер не нужен... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
C2000 3 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба 13 minutes ago, Самурай said: Может быть и есть какой способ, но Вы сначала скажите, чем этот "всплеск" Вам мешает? Да не так чтобы сильно мешает, скорее раздражает. Работает и с ним, никто не заметит никогда. Возникла идея подмешать постоянную выше максимальной амплитуды. После фильтра её вычесть. Т.к. заметил что всплеск только при отсутствии этой самой постоянной составляющей, если она есть (выше амплитуды этого всплеска) то фильтр плавно на неё выходит. Нужно проверить на модели Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 26 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба 48 minutes ago, C2000 said: Длина буфера У меня как-то раз получилось: считал среднее от входных блоков размером Х и складывал полученные значения в кольцевой буфер длиной У, мне хватило считать скользящие от У. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 6 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
C2000 3 15 сентября, 2023 Опубликовано 15 сентября, 2023 · Жалоба 7 hours ago, Alex11 said: float DigFil(float invar) С кодом что то не так) C++ массивы не перемножает Возможно Ваша программа для расчёта фильтра еще какой хедер выдаёт с перегруженными операторами для float? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 15 сентября, 2023 Опубликовано 15 сентября, 2023 · Жалоба Осталось понять, зачем простому фильтру скользящего среднего некий буфер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aBoomest 0 15 сентября, 2023 Опубликовано 15 сентября, 2023 · Жалоба 11 hours ago, C2000 said: Да не так чтобы сильно мешает, скорее раздражает. Работает и с ним, никто не заметит никогда. Возникла идея подмешать постоянную выше максимальной амплитуды. После фильтра её вычесть. Т.к. заметил что всплеск только при отсутствии этой самой постоянной составляющей, если она есть (выше амплитуды этого всплеска) то фильтр плавно на неё выходит. Нужно проверить на модели Всплеска просто не видно, если DC больше амплитуды. Вы хотите так сильно искусственно исказить сигнал? 16 minutes ago, Arlleex said: Осталось понять, зачем простому фильтру скользящего среднего некий буфер. Не нужен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 15 сентября, 2023 Опубликовано 15 сентября, 2023 · Жалоба 17 минут назад, aBoomest сказал: Не нужен? Ну если не нужны какие-то адаптации, то нет, не нужен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
looser 8 15 сентября, 2023 Опубликовано 15 сентября, 2023 · Жалоба 3 часа назад, Arlleex сказал: Ну если не нужны какие-то адаптации, то нет, не нужен. А может просто фильтр рассчитать? Какая нафиг адаптация, когда все параметры помехи известны? Я похоже живу в параллельной реальности, где простые вещи превращаются в неразрешимые. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться