2012-11-08 10 views
2

'buttord'및 'butter'기능으로 버터 워스 계수를 계산하는 데 어려움이 있습니다. 내 목표는 내가 만든 시계열의 노이즈를 필터링하는 것이다. 시계열에는 적색 잡음 성분과 0.3Hz의 주파수를 갖는 초 누손 (sinuosoid) 신호가 있습니다. 시계열의 샘플링 빈도는 10Hz입니다.MATLAB - 버터 워스 필터 설계를위한 입력 주파수

Wp = 0.33/(sfreq/2); Ws = 0.37/(sfreq/2); 
passripp = 0.1; stopatten = 40; 
[n,Wn] = buttord(Wp,Ws,passripp,stopatten); 
[b,a] = butter(n,Wn); 
y_butter = filter(b,a,timeseries(:,2)); 

시간과 y_butter 플로팅하는 날 어디서나 제로 제공 : http://www.mathworks.com/help/signal/ref/buttord.html 내가 계산 [N, WN] 사양에 대한가 (문서의 예 하나를 따라) 'buttord'에 대한 설명서에 따라

!

난 (512 개 샘플을 사용) 필터의 주파수 응답을 검사 'freqz'을 사용하려고 시도

그 플롯 전이 대역 1 및 4 Hz의 사이 인 것을 나타낸다
freqz(b,a,512,sfreq) 

!

필터 뒤에 내 이해는 다음의

  • 신호 Hz에서 0.3에서
  • 잡음 >>
  • 는 0 내지 0.33 Hz로 모두 합격 0.3 Hz에서
  • 감쇠
  • 이후 0.36 Hz에서 이르기

귀하의 도움을 많이 주시면 감사하겠습니다.

데이터를 다운로드받을 수 'TS', 2 열의 데이터 I 선형 착용감 트랜드

변수 (matlab에 'detrend')가 청 구의 일부를 제거하는 시간 변수이다의 http://dl.dropbox.com/u/1918592/detrendedTS.mat 칼럼 1 멀리 빨간 잡음 행동.

답변

3

게시 한 코드는 원하는 작업을 수행하기 위해 57 번째 (!!!!) 주문 필터를 생성합니다. freqz 명령은 실제로이 필터가 유효 함을 보여 주지만 tf2sos을 사용하여 2 차 섹션으로 먼저 변환하지 않고 고차 필터를 직접 구현하려고 시도하면 의심 할 여지없이 심각한 수치 오류가 발생합니다. 이것은 아마 당신이 단지 0을 보는 이유 일 것입니다. 필터 계수를 2 차 섹션으로 변환 한 다음 필터를 캐스케이드하면 실제로는 freqz 명령을 사용하여 관찰 된 필터 출력을 얻어야합니다.

첫 번째로 높은 필터 순서를 사용하는 이유는 시작 및 정지 밴드를 매우 가까이 배치했기 때문입니다. buttord 기능을 사용하면 간단한 저역 통과 버터 워스 필터를 사용할 필요가 없습니다. 그냥 당신이 원하는 롤오프를 제공하기 위해 단지 n를 선택 ...

[b,a] = butter(n,cut/(sfreq/2)); 

를 사용 (6,12,18 dB 등..). double precision 데이터 표현을 사용할 때 n이 약 10이되면 문제가 발생하지만 상대적으로 작은 필터 순서 만 있으면 원하는 작업을 수행 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 간단한 로우 패스만으로도 충분하지만 미래의 작업을 위해 여전히 버트 코드 fn을 사용하고 싶습니다.'[sos, g] = tf2sos (b, a)'로 2 차 섹션을 구성한 다음 계단식 필터 'Hd = dfilt.df2sos (sos, g)'를 입력 한 다음 ybutter = filter (Hd, timeseries) 나를 제로로 만든다. 주파수 응답 'freqz (Hd)'는 정규화 된 단위로되어있어 해석 방법을 모릅니다. – janon128

+0

알았어, 진정해. 귀하의 시계열 코드를 수정하면 (오류가 발생했습니다) 더 도움이 될 것입니다. – learnvst

+0

내가 작업하고있는 (detrended) 시계열은 여기에서 확인할 수 있습니다 : http://dl.dropbox.com/u/ 1918592/detrendedTS.mat 첫 번째 열은 시간 데이터이고 두 번째 열은 생성 된 데이터입니다. – janon128