Удалите неизвестное смещение постоянного тока из непериодического дискретного сигнала времени

Есть ли какой-то процесс, который может определить/удалить неизвестное смещение постоянного тока от непериодического дискретного сигнала времени?

Сигнал, о котором идет речь, имеет частоту дискретизации 25 Гц и имеет интересующие гармоники от 0,25 до 3 Гц.

Я пробовал использовать смешанные результаты с фильтрами верхних частот, сначала я использовал гуасиан 10-го порядка с Fc = 0 Гц, это неплохо справилось с удалением смещения, но оно сильно ослабляло AC, хотя оно оставило форму сигнала неповрежденной, затем Я использовал эквидистант 168-го порядка с полосой пропускания на частоте 0 Гц и полосой пропускания на частоте 0,25 Гц, сдвиг фазы был слишком сильным, а форма сигнала слишком искажалась, возможно, искажение могло быть уменьшено, если полоса пропускания была снижена до 0,1 Гц, но это просто увеличьте фазовый сдвиг, который мне нужно соблюдать до минимума.

До и после применения x - LPF (x), как было предложено Paul R

enter image description here

Ответ 1

Я рекомендую использовать режекторный фильтр на DC и используя filtfilt, чтобы сделать его нулевой фазой.

a = [1 , -0.98]; b = [1,-1];

y = filtfilt(b,a,x);

Чем ближе второе значение a дойдет до -1, тем более узким будет ваш вырез.

Ответ 2

Смещение по постоянному току означает, что к сигналу добавлено некоторое постоянное значение (название происходит от добавления постоянного напряжения к аналоговому сигналу переменного тока). Если постоянная составляющая действительно постоянна (и не меняется очень медленно), то вам не нужно создавать некоторые высокочастотные (и потенциально неустойчивые) фильтры высоких частот - вы можете просто вычесть среднее значение вашего сигнала из сигнала - который, конечно же, также имеет фильтр верхних частот (усреднение является типом нижнего прохода, а "1 минус среднее" - высоким), но очень простой.

Если, с другой стороны, у вас есть причина полагать, что компонент DC не является DC, а скорее AC с очень низкой частотой, тогда вам лучше усреднять сегменты вашего сигнала, а не сигнал как целое, что совпадает с использованием фильтра нижних частот с импульсным откликом, который короче длины сигнала. В этом случае вы должны сделать некоторые предположения о компоненте "DC".

Ответ 3

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

y = HPF(x)

сделайте следующее:

y = x - LPF(x)

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

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

Ответ 4

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

Если вы по-прежнему хотите использовать подход к фильтрации, вы можете устранить сильное искажение из-за фазового запаздывания, используя filtfilt. Эта функция фильтрует ваши таймеры один раз в направлении вперед, а затем один раз в обратном направлении, так что фазовые искажения отменяются.

Ответ 5

Вы можете создать симметричный FIR-фильтр в качестве фильтра нижних частот, который оценивает DC, а затем вычитает выходной сигнал из вашего входного сигнала. Этот фильтр имеет постоянную групповую задержку.