Pythonの初心者向けのローパスフィルターと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/...
デヴィッド・プールに

回答:


23

結果が複雑であるという事実は予想されることです。私はいくつかのことを指摘したい:

N

バツ[k]=バツ[Nk]k=12N21Neven

バツ[k]=バツ[Nk]k=12N2Nodd
  • Nバツ[0]バツ[N2]Nバツ[0]

上記のコードでこのようなことを試みたようですが、それはまったく正しくありません。逆FFTに渡す信号に上記の条件を強制する場合、実際の信号を出力する必要があります。

sncバツsnc

snc

sinc関数のプロット

sncsnc

時間領域と周波数領域の両方で、ローパスフィルターを適用するより実用的な手段があります。有限インパルス応答および無限インパルス応答フィルターは、差分方程式表現を使用して直接適用できます。または、フィルターのインパルス応答が十分に長い場合、FFTに基づく高速畳み込み手法(時間領域での畳み込みの代わりに周波数領域で乗算することでフィルターを適用)を使用すると、オーバーラップのように、多くの場合、パフォーマンス上の利点を得ることができます。保存および重複追加メソッド。


ただし、sinc関数は理想的なフィルタリングです。それは他のすべてのフィルターが目指しているものですが、達成するものではありません。画像は最初にアンチエイリアス処理されないため、画像処理には良くありません。そのため、ひどく見えるリンギングが生成されますが、サンプリング前にアンチエイリアス処理されたオーディオやその他の信号については、取得できる最良のフィルタではありませんか?
エンドリス

1
はい、私の結果は共役対称ではありませんでした。コードを修正しましたが、すべてが正常に動作するようになりました。ありがとうございました!
Bまで

3
@endolith - Sincフィルタは、補間のcertains種類の理想的な補間であるが、通過帯域応答、ストップバンド拒絶、等の平坦度などの一般的なフィルタの要件、ほとんどの種類のフィルタとして理想にはほど遠いことができる
hotpaw2

「POのように人々がフィルターを実装しない理由」についての良い説明のために+1
Sibbs Gambling

ウィンドウ化されたsincを使用する必要があります。時間に制約がない場合、これはチェビチェフよりもはるかに優れた最適なフィルターです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.