Фильтр нижних частот R с использованием пакета Signal - PullRequest
0 голосов
/ 01 июня 2018

Я новичок в 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 или есть другой вариант для ослабления любого сигнала силы ниже нуля?

1 Ответ

0 голосов
/ 01 июня 2018

Преамбула

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

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

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

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

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

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

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

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

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

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

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

...