ディジタルフィルタの基礎

参考文献及びWEB

参考文献

(1)「ディジタル信号処理技術」玉井徳みち、長島厚、藤田泰弘、若井修造著 日経BP社
(2)「ディジタル信号処理の基礎」三上直樹著 CQ出版
(3)「C言語によるディジタル信号処理入門」三上直樹著 CQ出版
(4)「アナログ&ディジタルフィルタ入門」小野浩司著 日刊工業
(5)「フーリエの冒険」ヒッポファミリークラブ

あわせて読む

ディジタルフィルタとアナログフィルタ

アナログフィルタ

上記のような1次ローパスフィルタ(CR回路)は

 V_{in} = ( R + \frac{1}{j\omega C} ) I (1)
 V_{out} = ( \frac{1}{j\omega C} ) I (2)

 V_{out} = \frac{1}{1+ j\omega CR} V_{in} (3)

ここで、
 H = \frac{1}{1+ j\omega CR} (4)
とすると

 V_{out} = H V_{in} (5)

この H を伝達関数と呼ぶ。

入力 V_{in}  H に印加したら出力 V_{out} を得るという意味となる。

いま周波数を強調するために(5)式は、

 V_{out}(\omega) = H(\omega)V_{in}(\omega) (6)

とおかれる。

「周波数領域の掛け算」は、「時間領域の畳み込み」なので、

 v_{out}(t) = \int_{0}^{t}h(\eta)v_{in}(t-\eta)d\eta (7)

ここで、

 v_{in}(t) は入力
 v_{out}(t) は出力
 h(t) はフィルタ係数(インパルス応答)である。

基本的にアナログ領域では、時間領域の処理は構成した回路
(この場合は、R,C素子で構成された回路)が行うので
周波数特性を知っていれば良い。

ディジタルフィルタ

ディジタルフィルタは時間領域の畳み込みによって表現できる。

 x[n] は入力
 y[n] は出力
 h[n] はインパルス応答(フィルタ係数)

y[n]= \sum_{k=0}^{N-1} (h[k] x[n-k]) (8)
= h[0]x[n-0] + h[1]x[n-1] + h[2]x[n-3] + ... + h[N-1]x[n-(N-1)]

 N=3 とすると、
y[n]= \sum_{k=0}^{2} (h[k] x[n-k])
= h[0]x[n-0] + h[1]x[n-1] + h[2]x[n-3]

畳込みについてでも説明したが

畳み込みとは、「現在の状態を過去の積み重ね」で表現するということ。

x[n]  は現在~
x[n-1]は現在からひとつ前の過去~
x[n-2]は現在からふたつ前の過去~
h[0]は現在の予想~
h[1]はひとつ先の予想~
h[2]はふたつ先の予想~

なので

h[0]x[n-0] + h[1]x[n-1] + h[2]x[n-3]
は、

(現在@x[n]) x (現在の予想@h[0])                                       = "現在"
+
(ひとつ前の過去@x[n-1]) x (ひとつ過去からのひとつ未来の未来予想@h[1]) = ひとつ過去から予想される"現在"
+
(ふたつ前の過去@x[n-2]) x (ふたつ過去からのふたつ未来の未来予想@h[2]) = ふたつ過去から予想される"現在"

いま、

h(0)=0.8
h(1)=0.15
h(2)=0.05

とすると

y[n]=0.8*x[n] + 0.15*x[n-1] + 0.05*x[n-2]

インパルス応答とフィルタ係数が同じであることを証明する


サンプリング周期   1 [ms]
サンプリング周波数 1 [kHz]
データ総数         5001
基本周波数         0.2[Hz]

インパルス信号とは、

 \LARGE \delta(t)=\{1, t=0\\0, t \neq 0 (9)

のような信号である。ディジタル信号では、

 \LARGE \delta(n)=\{1, n=0\\0, n \neq 0 (10)

となる。

また

 \LARGE \delta(n-k)=\{1, n=0\\k, n \neq k

とかくとk遅れたインパルス信号を作ることができる。


上図はさまざまなインパルス信号

インパルス応答とは?

インパルス応答とは、
インパルス \delta(n) をフィルタへ入力したとき得られる出力信号

y_{\delta}[n]= \sum_{k=0}^{N-1} (h[k] \delta[n-k]) (11)

この y_{\delta}[n] がインパルス応答である。

ここで

インパルス信号が
 \delta(t)=\{1, t=0\\0, t \neq 0

n=1


のときの(1)を求める。

y_{\delta}[1] = \sum_{k=0}^{N-1} (h[k] \delta[1-k])
 =h[0]\delta[1-0] + h[1]\delta[1-1] + h[2]\delta[1-3] + ... + h[N-1]\delta[1-(N-1)]
 =h[0]\delta[1] + h[1]\delta[0] + h[2]\delta[-2] + ... + h[N-1]\delta[2-N]
 =0 + h[1] + 0 + ... + 0
 =h[1]

ゆえに

y_{\delta}[n] = h[n] (12)

つまり、「インパルス応答とフィルタ係数は同じ」である。

Matlab ソース impulsu_outou.m

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% インパルス応答
%                   programming by embedded.samurai
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
echo off
clear all
close all

%サンプリング周期 1[ms]
dx=1e-3;
dfs=1/dx
% xの範囲は 0から0.001単位で5まで
x=[-5:1:5]; 
%データ総数
[gyo N]=size(x)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
subplot(3,1,1);

% インパルス信号を作る
y1=[zeros(5,1);1;zeros(N-6,1)]
stem(x,y1,'r-','linewidth',5);

% 文字の大きさ、線の太さの設定
set(gca,'LineWidth',2,...,
'FontSize',15);

xlabel('Time[s]','Fontsize',20,'FontName','Century');
ylabel('Amplitude','Fontsize',20,'FontName','Century');
title('\delta(n)','Fontsize',20,'FontName','Century');

% x-y範囲
axis([-5 5 -Inf Inf]);
grid on
hold on;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
subplot(3,1,2);

% インパルス信号を作る
y1=[zeros(8,1);1;zeros(N-9,1)]
stem(x,y1,'r-','linewidth',5);

% 文字の大きさ、線の太さの設定
set(gca,'LineWidth',2,...,
'FontSize',15);

xlabel('Time[s]','Fontsize',20,'FontName','Century');
ylabel('Amplitude','Fontsize',20,'FontName','Century');
title('\delta(n-3)','Fontsize',20,'FontName','Century');

% x-y範囲
axis([-5 5 -Inf Inf]);
grid on
hold on;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
subplot(3,1,3);

% インパルス信号を作る
y1=[1;zeros(N-1,1)]
stem(x,y1,'r-','linewidth',5);

% 文字の大きさ、線の太さの設定
set(gca,'LineWidth',2,...,
'FontSize',15);

xlabel('Time[s]','Fontsize',20,'FontName','Century');
ylabel('Amplitude','Fontsize',20,'FontName','Century');
title('\delta(n+5)','Fontsize',20,'FontName','Century');

% x-y範囲
axis([-5 5 -Inf Inf]);
grid on
hold on;

print -djpeg impulsu_outou_kakei.jpg