파이썬 초보자를위한 저역 통과 필터 및 FFT


23

나는 신호 처리, 특히 FFT에 익숙하지 않으므로 여기서 올바른 일을하고 있는지 확실하지 않으며 결과와 약간 혼동됩니다.

불연속 실제 기능 (측정 데이터)이 있고 저역 통과 필터를 설정하려고합니다. 선택 도구는 numpy 패키지가 포함 된 Python입니다. 이 절차를 따릅니다.

  • 내 함수의 fft를 계산
  • 고주파를 차단하다
  • 역 fft를 수행

사용중인 코드는 다음과 같습니다.

import numpy as np
sampling_length = 15.0*60.0 # measured every 15 minutes
Fs = 1.0/sampling_length
ls = range(len(data)) # data contains the function
freq = np.fft.fftfreq(len(data), d = sampling_length)
fft = np.fft.fft(data)
x = freq[:len(data)/2] 
for i in range(len(x)):
if x[i] > 0.005: # cut off all frequencies higher than 0.005
    fft[i] = 0.0
    fft[len(data)/2 + i] = 0.0
inverse = np.fft.ifft(fft)

이것이 올바른 절차입니까? 결과 inverse에는 복잡한 값이 포함되어있어 혼란 스럽습니다.


1
FFT를 배우 면서이 블로그 게시물이 매우 유용하다는 것을 알았습니다. glowingpython.blogspot.com/2011/08/…
David Poole

답변:


23

결과가 복잡하다는 사실이 예상됩니다. 몇 가지 사항을 지적하고 싶습니다.

데이터에 브릭 월 주파수 도메인 필터를 적용하여 0.005Hz보다 큰 주파수에 해당하는 모든 FFT 출력을 제로하려고 시도한 다음 역변환하여 시간 도메인 신호를 다시 얻습니다. 결과가 실제가 되려면 역 FFT에 대한 입력 값이 켤레 대칭 이어야합니다 . 이것은 길이 FFT의 경우

엑스[케이]=엑스[케이],케이=1,2,,21(이자형V이자형)

엑스[케이]=엑스[케이],케이=1,2,,2(영형)
  • 참고 용 심지어 및 일반적으로 동일하지만, 모두 진짜 아니다. 홀수 경우 은 실수 여야합니다.엑스[0]엑스[2]엑스[0]

위의 코드에서 이와 같은 작업을 시도했지만 정확하지 않습니다. 역 FFT에 전달하는 신호에 대해 위의 조건을 적용하면 실제 신호를 얻을 수 있습니다.

두 번째 요점은 더 철학적 인 것입니다. 원하지 않는 주파수 영역 내용을 억제한다는 점에서 당신이하고있는 일은 효과가 있습니다. 그러나 이것이 일반적으로 저역 통과 필터가 실제로 구현되는 방식은 아닙니다. 앞에서 언급했듯이, 당신이하고있는 일은 본질적으로 벽돌 벽 (즉, 완벽하게 직사각형) 크기 응답을 가진 필터를 적용하는 것입니다. 이러한 필터의 임펄스 응답은 모양입니다. 주파수 영역에서의 곱셈은 시간 영역에서의 (DFT, 원형) 컨볼 루션과 동일하기 때문에,이 동작은 시간 영역 신호를 함수 와 관련시키는 것과 동일하다 .에스나는기음(엑스)에스나는기음

이것이 왜 문제입니까? 시간 영역에서 함수의 모습을 생각해보십시오 (위키 백과에서 뻔뻔스럽게 빌린 이미지 아래).에스나는기음

sinc 함수의 플롯

기능은 시간 영역에서 매우 폭 넓은 지원을하고있다; 메인 로브에서 시간이 지남에 따라 매우 느리게 붕괴됩니다. 많은 응용 분야에서 이것은 바람직한 속성이 아닙니다. 로 신호를 컨볼 루션 할 때 느리게 감소하는 사이드 로브의 효과는 필터링 된 출력 신호의 시간 영역 형태로 종종 나타납니다. 효과 이런 종류의 종종라고 울리는 . 수행중인 작업을 알고있는 경우 이러한 유형의 필터링이 적절한 경우가 있지만 일반적으로 원하는 것은 아닙니다.에스나는기음에스나는기음

시간 영역과 주파수 영역 모두에서 저역 통과 필터를 적용하는보다 실용적인 방법이 있습니다. 유한 임펄스 응답무한 임펄스 응답 필터는 차이 방정식 표현을 사용하여 직접 적용 할 수 있습니다 . 또는 필터가 충분히 긴 임펄스 응답 을 갖는 경우 오버랩 과 같이 FFT (시간 영역에서 회선 대신 주파수 도메인을 곱하여 필터 적용)를 기반으로 빠른 회선 기술을 사용하여 성능 이점을 얻을 수 있습니다. 저장겹침 추가 방법.


sinc 함수는 이상적인 필터링입니다. 그것은 다른 모든 필터가 목표로하고 있지만 달성하지 못하는 것입니다. 이미지가 먼저 앤티 앨리어싱되지 않기 때문에 이미지 처리에 좋지 않습니다. 따라서 끔찍한 벨소리가 생성되지만 샘플링 전에 앤티 앨리어싱이 필터링 된 오디오 또는 기타 신호의 경우 가장 좋은 필터가 아닙니까?
endolith

1
예, 내 결과는 켤레 대칭이 아닙니다. 코드를 수정 했으므로 이제 모든 것이 잘 작동합니다. 고맙습니다!
B까지

3
@endolith-Sinc는 특정 종류의 보간에 이상적인 보간 기이지만 통과 대역 응답의 평탄도, 정지 대역 제거 등과 같은 대부분의 일반적인 필터 요구 사항에 대한 필터로는 이상적이지 않습니다.
hotpaw2

"PO
가하는

창문이있는 sinc를 사용해야합니다. 시간 제약이 없다면 Chebichev보다 훨씬 좋은 최적의 필터입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.