Фильтр нижних частот R с использованием пакета Signal

Я новичок в R, и у меня возникли проблемы с установкой фильтра нижних частот для моих данных. Я измеряю Force нагрузки на беговой дорожке за период 30 seconds с частотой дискретизации 250/с или 250Hz.

Данные содержат отрицательные значения силы, как видно на этом изображении

Это происходит из-за пульсаций сигнала или фонового шума. Мне нужно иметь возможность отфильтровывать любой сигнал силы <0, и для этого я использовал функцию Butter в пакете Signal:

ritLowPass = function(s, frqCutOff, bPlot = F ) 

  {
  f = butter( 4, frqCutOff/(smpRate/2), "low" ); # lowpass filter 

  s.lp = rev( filter( f, rev( filter( f, s ))) );
  if( bPlot ) {


    idx=(1*smpRate):(4*smpRate);
    plot( x=idx/smpRate, y=s[idx], xlab="time/s", ylab="signal", ty="l" );
    lines( x=idx/smpRate, y=s.lp[idx], col="red", lwd=2) 
  }


  return(data.frame(s.lp));
}


VT_filter <- ritLowPass(guest$Fz, 250, bPlot)

образец данных:

Time    Fz
0        3.769
0.004   -32.94
0.008   -117.305
0.012   -142.329
0.016   -55.35
0.02    -27.362
0.024   29.039
0.028   73.718
0.032   76.633
0.036   4.482
0.04    -80.949
0.044   -114.279
0.048   -102.968
0.052   -9.76
0.056   35.405
0.06    152.541
0.064   79.249
0.068   50.147
0.072   22.547
0.076   47.757
0.08    -29.123
0.084   57.384
0.088   88.715
0.092   195.115
0.096   118.752
0.1     183.22
0.104   157.957
0.108   37.992
0.112   -7.893

Когда я запускаю код, я получаю следующую ошибку:

 VT_filter <- ritLowPass(guest$Fz, 250, bPlot)
Error in butter.default(4, frqCutOff/(smpRate/2), "low") : 
  butter: critical frequencies must be in (0 1)
Called from: butter.default(4, frqCutOff/(smpRate/2), "low")

Интересно, следует ли мне вместо этого использовать HighPass или есть другой вариант для ослабления любого сигнала силы ниже нуля?


person amir.fathi    schedule 31.05.2018    source источник


Ответы (2)


Преамбула

Я не уверен, что вижу в данных что-либо, что указывает на то, что ваша частота преступника составляет 250 Гц, или что вы должны обрезать частоты выше этого значения.

Если вы пытаетесь удалить шум сигнала на определенной частоте, вам нужно сначала найти частоту шума. spectrum твой друг.

Однако, если вы действительно хотите отфильтровать частоты выше 250 Гц:

Короткий ответ

Если вы хотите отфильтровать частоты выше 250 Гц, частота дискретизации должна быть не менее 500 Гц.

Длинный ответ

Ваш фильтр может фильтровать только между частотами 0 и частотой Найквиста, то есть от 0 до (частота дискретизации)/2. Это жесткое ограничение теории информации, а не проблема реализации.

Вы просите его отфильтровать то, что в два раза превышает частоту Найквиста.

help(butter) дает следующее о параметре W:

W: критические частоты фильтра. ... Для цифровых фильтров W должно быть между 0 и 1, где 1 — частота Найквиста.

Значение отсечки, которое вы пытаетесь присвоить фильтру, равно (250)/(250/2) = 2. Функция сообщает вам, что это выходит за рамки ее возможностей (или возможностей любого цифрового фильтра).

person Jason    schedule 01.06.2018
comment
Спасибо, Джейсон. Суть моего вопроса в том, что если я хочу удалить любые данные Силы, которые составляют ‹ 0 ньютонов, как я могу добиться этого, чтобы у меня не было отрицательных значений по оси Y? - person amir.fathi; 03.06.2018
comment
Прежде всего, самое главное: имеете ли вы право удалять отрицательные значения силы? В настройке нет ничего упругого или пружинящего? - person Jason; 04.06.2018
comment
Что касается того, как их удалить: я думаю, что решение этого в частотной области делает это трудным путем. Если вы хотите отображать только положительные значения, но сохранить те же данные: plot(x, y, type="l", ylim=c(0, your_upper_limit_here). Если вы хотите удалить данные, где y ‹ 0: y_pos <- y ; y_pos[ y_pos<0] <- NA Если вы хотите плавно отфильтровать их, вам нужно выяснить, какие частоты способствуют этому. Я не знаю общего способа сделать это; обычно это связано с некоторыми исследованиями в частотной области. - person Jason; 04.06.2018
comment
Хорошо подметил Джейсон - отрицательные значения силы связаны с отдачей пружины, но не должны быть включены в анализ данных, поэтому я должен их удалить. Данные о силе поступают с вертикальной беговой дорожки, используемой для имитации бега при низкой гравитации, например, на Луне. Это достигается за счет подвешивания беговой дорожки в воздухе вертикально с помощью системы пружин и шкивов, поэтому она создает некоторую нежелательную отрицательную силу. Я реализую ваш код, чтобы удалить негативы. Спасибо. - person amir.fathi; 04.06.2018
comment
Хорошо, если вы пытаетесь устранить влияние колебания пружины, а частота пружины отличается от других частот воздействия, вы добьетесь большего успеха с режекторным фильтром в частотной области. Простое удаление негативов по-прежнему будет включать положительный вклад пружины, чего, я полагаю, вы не хотите. Поиграйте с spectrum, чтобы увидеть, можно ли разделить частоту пружины. - person Jason; 04.06.2018

Судя по вопросу, вы не удосужились прочитать весь вывод ?butter руководства. Частоты почти для всех функций проектирования фильтров в пакете используются только относительно частоты Найквиста, поэтому всякий раз, когда функция запрашивает у вас частоту f_1, вы должны предоставить ей f_1/(f_sample/2), и ожидается, что результат будет между 0 и 1, потому что ожидается, что ваш сигнал не будет иметь неисправимых искажений. Они не говорят вам в точности простое уравнение, и в руководствах есть некоторые ошибки (например, формула для функции билинейного преобразования), но, конечно, ожидается, что вы обладаете некоторыми общими и базовыми знаниями по теме, прежде чем пытаться использовать пакет, так что это не имеет большого значения.

Кроме того, если единственное, что заставляет вас беспокоиться по какой-либо причине, - это отрицательные значения сигнала, то зачем вообще пытаться его фильтровать? Здесь я использую определение слова «фильтрация», найденное в книгах, связанных с DSP, конечно, что, вероятно, не то, что вы имеете в виду в вопросе. Вы можете просто сделать что-то вроде guest$Fz[guest$Fz<0]=0. Как правило, это лучшая идея, чем использование NA или полное удаление выборок, потому что пропущенные значения и, следовательно, нерегулярная выборка создают глобальные артефакты сигнала, и это намного хуже, чем локальные высокочастотные пики из-за простой замены одного значения выборки другим. Затем вы можете использовать какой-либо метод сглаживания данных, чтобы ваш сигнал выглядел лучше, если вы чувствуете в этом необходимость.

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

person mrKirushko    schedule 30.12.2020