デジタルフィルタのインパルス応答
by K.I
2017/01/22〜2017/01/23
Index
- プログラムでデジタルフィルタでは、Unixのフィルタとして作ったデジタルフィルタの特性を
- 擬似ホワイトノイズを使って調べたけれど、同じフィルタプログラムをインパルス応答で改めて確認してみました
- インパルスといっても、高さ1のデータなので、擬似インパルスと言った方が良いかもしれない。
- 実際には、インパルス応答からfftwで周波数特性を求めて比較している
- FIRフィルタのプログラムを作ってみたので、ちゃんと動いているか確認しようと思った。
- 最初が1で、後は0が続くデータを入れれば、係数がそのまま見れるはずだ
% pulse 400 | firf coeff.txt | gp_wav > firf_test.png
- ん。。。あれ、そういえばインパルスって、全部の周波数含むんじゃなかったか。。。
$ pulse 1000 | fftw | gp_fft > pulse_fft.png
- プログラムでデジタルフィルタで、擬似ホワイトノイズを使ってフィルタ特性を調べていたけど、
- 単純にインパルス応答をみれば良いだけじゃないか。。
- ということで、 擬似ホワイトノイズを使って調べた特性が、
- インパルス応答では、どうなるんだろうという興味が出てきたので、この記事に纏めてみました。
- といっても、最初が1で、後は0が続くデータを出力するだけのプログラムなんだけど。(pulse.c)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//1秒分のデータを生成
#define SAMPLE (1000)
main( int argc, char *argv[] )
{
int s, i, m, n, g;
s = SAMPLE;
m = 0;
n = 1;
g = 1;
if (argc>1)
s = atoi(argv[1]); //サンプリング周波数(デフォルト:1000Hz)
if (argc>2)
n = atoi(argv[2]); //パルスの終了(デフォルト:1)
if (argc>3)
m = atoi(argv[3]); //パルスの開始(デフォルト:0)
for (i=0; i<s ;i++) {
if (i<m)
printf("%d\n",0);
else if (i<n)
printf("%d\n",g);
else
printf("%d\n",0);
}
}
- 一応、パルス幅を変更できるようにしているけど、今回はその機能は使っていない
% pulse 1000 | head -40 | gp_pulse > pulse_w.png
- 本来は、高さ無限大なので、やっぱり擬似インパルスなのかな
- まぁでも、積分すれば1のはずなので、代用1にはなりそう
1っていうか、無限大じゃ計算できないし。
[top]
- プログラムでデジタルフィルタで作成したフィルタプログラムのインパルス応答を見てみよう
- 擬似ホワイトノイズを入れた場合の特性と、インパルス応答の周波数特性をfftwで比較してみた
% white 1000 | rcf 0.5 | fftw | gp_fft > rcf_fft.png
% pulse 1000 | rcf 0.5 | fftw | gp_fft > rcf_fft.png
- 縦軸のレンジを指定していないので違いがあるが、基本的に同じ特性を見られることがわかる
% pulse 1000 | rcf 0.5 | head -40 | gp_pulse > rcf_w.png
% white 1000 | mavgf 3 | fftw | gp_fft > mavgf3_fft.png
% pulse 1000 | mavgf 3 | fftw | gp_fft > mavgf3_fft.png
% pulse 1000 | mavgf 3 | head -40 | gp_pulse > mavgf3_w.png
% white 1000 | mavgf 8 | fftw | gp_fft > mavgf8_fft.png
% pulse 1000 | mavgf 8 | fftw | gp_fft > mavgf8_fft.png
% pulse 1000 | mavgf 8 | head -40 | gp_pulse > mavgf8_w.png


% white 1000 | bibun 16 | fftw | gp_fft > bibun_fft.png
% pulse 1000 | bibun 16 | fftw | gp_fft > bibun_fft.png
% pulse 1000 | bibun 16 | head -40 | gp_pulse > bibun_w.png
- 16個目で、逆方向にインパルスがあるだけなんだけど、こんな周波数特性になるのが不思議


% white 1000 | sekibun | fftw | gp_fft > sekibun_fft.png
% pulse 1000 | sekibun | fftw | gp_fft > sekibun_fft.png
- あれ、積分回路はインパルス応答がうまくとれない。。
% pulse 1000 | sekibun | head -40 | gp_pulse > sekibun_w.png
- インパルスは最初が1で後は全部0なので、積分回路では最初が0で後は全部1になるだけだから、
- 積分回路の特性がみれないのは、まぁ何となく分かるんだけど。。
- うーん、何故、積分はできないのか、自分にはあまり明確な説明はできないなぁ


% white 1000 | sekibun 16 | fftw | gp_fft > sekibun16_fft.png
% pulse 1000 | sekibun 16 | fftw | gp_fft > sekibun16_fft.png
- 多段の場合、キレイにインパルス応答がとれてると思ったが、なんかへんなヒゲがある
- そもそもDCは無限大にならなきゃおかしいんじゃないかな。そんな感じじゃない3。。
- 積分回路は、なんかうまく行かないなぁ。
% pulse 1000 | sekibun 16 | head -40 | gp_pulse > sekibun16_w.png
- SINCフィルタ、微分→積分の場合のインパルス応答を見てみる



% white 1000 | bibun 16 | sekibun | fftw | gp_fft > sinc_fft2.png
% pulse 1000 | bibun 16 | sekibun | fftw | gp_fft > sinc_fft2.png
- SINCフィルタ、積分→微分の場合のインパルス応答を見てみる



% white 1000 | sekibun | bibun 16 | fftw | gp_fft > sinc_fft.png
% pulse 1000 | sekibun | bibun 16 | fftw | gp_fft > sinc_fft.png
- 積分が先だとダメかと思ったが、両方ともちゃんとインパルス応答を見ることが出来る
- 単体の積分回路だとインパルス応答みれないのに、組み合わせると見れるのは何故なんだろう
% pulse 1000 | bibun 16 | sekibun | head -40 | gp_pulse > sinc_w2.png
% pulse 1000 | sekibun | bibun 16 | head -40 | gp_pulse > sinc_w.png
- 微分→積分、積分→微分、いずれも16個取り出しているだけの波形


→ R=10 とする
- 擬似ホワイトノイズの場合は、10〜40Hzのみ出力出来るが、
- 擬似ホワイトノイズの場合は、帯域制限できるので、ダウンサンプラの動作が分かるが、
- インパルスの場合は、変化が無いので動作がサッパリわからない
- というか、エイリアシングによる乱れとかも全くないので、ある意味凄いけど
% pulse 1000 | downs 10 | head -40 | gp_pulse > downs_w.png
- インパルス応答波形をみると、入力と変わらないので当然か。


→ R=10 とする
- 擬似ホワイトノイズの場合は、10〜100Hzのみ出力が可能、
- 擬似ホワイトノイズの場合は、帯域制限しているので、アップサンプラの動作が分かるが、
- インパルスの場合は、変化が無いのでどんな動作なのか、全然わからない
% pulse 1000 | ups 10 | head -40 | gp_pulse > ups2_w.png








- インパルス応答は非常にキレイに見えるが、実際はエイリアシングで干渉しているはずなので、
- 擬似ホワイトノイズの方が、干渉しているのが分かり易いような気がする
% pulse 3840 | imul 100 | intg | intg | intg | idws | comb 1 | comb 1 | comb 1 | head -40 | gp_pulse > wiiidccc_w.png
- インパルス応答波形は、最初に2本のパルスがあるだけ。
2正確には、アナログのRCフィルタと同じ特性のデジタルフィルタ。
3インパルスの大きさが無限大じゃないからかな?
[top]
- フィルタプログラムは、以前作ったものを使ったので、
- インパルス応答を調べるだけで、そんなに手間は掛からなかった
- それにしても、擬似ホワイトノイズを入力した場合と、インパルスを入力した場合の応答波形は全く異なるのに、
- FFTによる周波数特性としては、ほぼ同じものになるのは、とても面白くて不思議だ。
- 基本的には、単純なインパルス応答でもフィルタ特性をみられることが確認できた。
- 擬似ホワイトノイズよりも、波形が非常にキレイにとれるみたいだし、
- 何より生成に時間が掛からないのがメリットだ
- でも、積分回路のようにインパルス応答では、うまく特性がとれない場合があるようだ。
- もしかすると、インパルスの大きさが1で、無限大じゃないからかもしれない
- いずれにしても、Gain的には正確じゃないのかも
- あと、アップサンプリング、ダウンサンプリングのように、帯域制限しないと動作がみれないものは
- 擬似ホワイトノイズじゃないと、特性が全然わからない。
- 基本的にはインパルス応答で特性をみれば良さそうだ。
- でも、擬似ホワイトノイズは帯域制限できる利点もあるので、用途に合わせて使い分けすれば良いと思う。
[top]
[プログラムの部屋に戻る]
⇒ Disqusの広告がうるさすぎるので基本は非表示にしました