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