2010年9月17日金曜日

信号処理の勉強その2

引き続き信号処理の勉強。

デジタルフィルタについて調べていた。
以下ざっくりとしたまとめ。

(1)デジタルフィルタとは
・フィルタとは信号から特定の周波数成分を抜き出す、あるいは除去するためのモノ
・離散値を処理するフィルタをデジタルフィルタという
・デジタルフィルタには線形フィルタと非線形フィルタがある(現時点ではこういうくくりがある、というぐらいで留めておく)
・デジタルフィルタは3つの基本的な構成要素から成る
 ー遅延素子:1クロック分、信号成分を遅延させて出力する素子
 ー加算器:入力された信号成分を足し合わせて出力する素子
 ー乗算器:入力された信号成分を定数倍して出力する素子

(2)FIR(Finite Inpulse Responce)フィルタ
フィードバックループが無いデジタルフィルタ。
インパルス応答が有限個のパルスで表されるからFIRフィルタ(らしい)。

(3)IIR(Infinite Inpulse Responce)フィルタ
フィードバックループを持つデジタルフィルタ。
インパルス応答が無限に続くインパルス列になるのでIIRフィルタ(らしい)。

全部ココを参考にして2、3行にまとめてみた(ザックリしすぎな感は否めない)。


ということで毎度お馴染みPythonでFIRフィルタを実装してみる。

ざっくり下のような感じで設計。
四角が遅延素子、三角が乗算器(内側の数字が係数)、丸が加算器。




んで、コーディングした結果がこちら。



#coding:utf-8

from scipy import *
from matplotlib.pylab import *

#FIRフィルタ
def FIR(array):
output = []

for i in range(2,len(array)):
output.append(array[i] * 0.7 + array[i-1] * 0.2 + array[i-2] * 0.1)

return output

Fs = 100.
t = arange(0,1,1/Fs)
f = 5

inp = []

#入力信号生成(正弦波+ノイズ)
for i in range(len(t)):
inp.append(sin(2 * pi * f * t[i]) + rand())

outp = FIR(inp)

plot(t,inp,"b")
plot(t[2:len(t)],outp,"r")
xlabel("time(s)")
show()



出力結果がコレ。




青が入力信号で赤が入力をフィルタリングした信号。

少し分かりづらいけれど、よく見るとフィルタリングを行う前と後で波形のギザギザが少なくなっていることが分かる。これは高周波のノイズがフィルタによって除去されたことを意味する。
ごくごく簡単なローパスフィルタ(低周波数の信号のみ通すフィルタ)が完成した。

ということで遅延素子を用いるとローパスフィルタを作ることが出来る、ということがこれで分かった。

0 件のコメント:

コメントを投稿