z
-1a
e
i+ e
o離散系信号処理(その2)
} ) 1 {(
) (
)
(
i oo
nT e nT ae n T
e
) ( )
( )
(
i 1 oo
z E z az E z
E
1
1) 1
(
z az H
無限インパルス応答 (IIR) フィルタの一例
)
Infinite Impulse Response (IIR) フィルタ
1
1
1 )
(
Nn
n n
z b z
H
z
-1e
i+ + + + e
o-b
1-b
2-b
3-b
4z
-1z
-1z
-1短い演算で急峻な周波数特性可能
ただし、線形位相実現せず
Nn
n n
N
n
n n
z b
z a z
H
1 0
1 )
(
z
-1e
o-b
1-b
2-b
3-b
4z
-1z
-1z
-1a
0z
-1e
i+ + + +
a
1a
2a
3a
4デジタルフィルタの一般形
z
-1z
-1z
-1
10 i
o
1 {( ) }
) (
N
n
T n m
N e mT
e
平均値フィルタ
10
(
11 )
1 ) 1
(
Nn
N n
z N z z
z N H
) 2 / sin(
) 2 / } sin(
2 / )
1 (
exp{
)
( N T
T T N
N j
H
線形位相:遅延が周波数に依存せず
有限インパルス応答
(FIR) フィルタの一例
-40 -35 -30 -25 -20 -15 -10 -5 0
-0.5 -0.4 -0.3 -0.2 -0.1 0 0.1 0.2 0.3 0.4 0.5 sinNx/Nx
sinNx/Nsinx
Relative frequency
Relative amplitude in dB
スペクトラムの
折り返しの影響
z=exp(jT) であるから
) 2 / (
) 2 / } sin(
2 / )
1 (
exp{
) 2 / sin(
) 2 / } sin(
2 / )
1 (
exp{
1 )
exp(
1 )
) exp(
(
T N
T T N
N j N
T N
T T N
N j N
T j
T E jN
1
) 1
(
1
z t z
e
N
Z は?
パルス中心の ずれ: (N-1)T/2
単一パルスの 離散化版
連続関数と離散化関数で何故違う?
-120 -100 -80 -60 -40 -20 0
0 2 4 6 8 10
rectangular Hamming Blackmann Blackmann-Harris
Relative frequency
Amplitude in dB
0 0.2 0.4 0.6 0.8 1
-1-0.8-0.6-0.4-0.2 0 0.20.40.60.8 1
W eight
Relative position
Hamming Blackmann Blackmann-Harris
ハミング関数
w(t)=0.54+0.46cos(2t/T)
ブラックマン関数
:w(t)=0.42+0.5cos(2t/T) +0.08cos(4t/T)
ブラックマン・ハリス関数:w(t)=0.35875+0.48829cos(2t/T)
+0.14128cos(4t/T)+0.01168cos(6t/T)
窓関数
h
d(t)
を有限時間で打ち切るための関数:w(t)
帯域外抑圧と帯域幅はトレードオフ
-70 -60 -50 -40 -30 -20 -10 0
0 0.5 1 1.5 2
-0.04 -0.03 -0.02 -0.01 0.01 0.02 0.03 0.04 0.05 0
Relative frequency
T ransfer function in dB T ransfer function in dB
-0.05
レメッツ交換法による設計結果
手法提案の論文に設 計プログラムが添付
⇒
世界中に普及 許容リップルと最も狭 い遷移帯域幅で必用 なタップ数を推定可能(Infinite-Impulse-Response; IIR) フィルタ
+ + + + e
outa
0
e
inb
1b
2b
3b
4
Nn
out n in
out
t a e t b e t n
e
1
0
( ) ( )
)
(
: 1clk
遅延
Nn
n n
z b z a
H
1 0
1 )
(
・少ないタップで良好な遮断特性可能(ただし最少位相推移系)
・係数によっては発振
(
安定条件:
全ての極が|Z|<1)
・
FIR
と組み合わせて、少ないタップで、位相特性、周波数特性 共に良好なフィルタ実現int average(int clock, int in) {
int position, count, temp, result;
long int sum = 0;
temp=clock/TAP;
position=clock-temp*TAP+TAP;
data[position]=in;
data[position-TAP]=in;
for (count = 0 ; count < TAP ; ++count) {
sum += data[position-count];
}
result = sum/TAP;
return result;
}
平均値フィルタの構成 タップの場合
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
この 範 囲
を加算
新データ 新データ
次々と下 に移動
下まで行ったら 一番上
32bit
整数 切捨て演算余りの算出
総和 タップ数での 割り算
#include <stdio.h>
#define TAP 8
#define TMAX 20 int average(int, int);
int data[2*TAP];
int main(int argc, char **argv[]) {
int count, period, out;
int in=0, clock=0;
for (period =1 ; period <=4 ; ++period) {
for (count = 1 ; count <= TMAX ; ++count) { ++clock;
in += 5;
out=average(clock,in);
printf("%d, %d, %d¥n", clock, in, out);
}
以下省略
定数の定義
共用の変数を定義
clock
を1
ずつ増加in
を5
ずつ増加関数
average
の実行傾斜型 波形の 形成
4
回繰り返しTMAX
回繰り返しTAP=4
の結果TAP=8
の結果TAP=16
の結果TAP=32
の結果計算結果を
gnuplot
で表示Program counter
Data bus Address bus Register A
Register B Register C Register D
Stack pointer
ALU
Instruction register
Interrupt unit B Instruction
decoder control lines
CPU
Interrupt status
register
Read Write
Interrupt
unit A Reset
Clock
CPU: Central Processing Unit ALU: Arithmetric Logical Unit Register
Address
マイクロプロセッサの構成例
1. LD A, 30H (16
進数で30
をレジスタA
に代入) 2. DEC A (A
の内容を1
つ減少)
3. JNZ 09H (
演算結果が"0"
で無い場合アドレス09H
にジャンプ) 4. LD 50H, B (
レジスタB
の内容をアドレス50H
に代入)
5. JMP 30H (
アドレス30H
へジャンプ)
多少高級な言語 ( アセンブラ ) での記述
00 20 30
02 51
03 25 09 05 32 50 07 20 30
アドレス データ機械語での表現
機械語への変換
プログラム実行の流れ
00H(20H) 01H(30H) 02H(51H) 03H(25H) 04H(09H) 05H(32H) 06H(50H) 07H(20H) 08H(30H) 09H(00H) 0AH(18H) 0BH(2CH) 0CH(33H) 0DH(FCH)
0EH(35H)
30H 31H 32H 33H 34H
50H 51H 52H 53H 54H 35H
結果が36H
0
の時reset
された時 の開始場所データ の収納
Jump
基本的には逐次実行
データも同 じ空間上 に展開
サブルーチン(例:三角関数の計算)
00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH 0DH 0EH
30H 31H 32H 33H 34H
50H 51H 52H 53H 54H 35H
36H
call 50H
call 50H call 30H
call 30H
return return
②
③
④
04H 34H
①
①
②
スタック構造
③
④
ポインタ の位置
•call:
ポインタ1増+ポインタ位置に戻りアドレス収納+指定アドレスへジャンプ