デジタル信号処理の勉強の経過

 IIRフィルターも6次のバンドパスまで出来た段階で、直接型よりも縦続型にすべきなのかと言う辺りで停滞中。今日買った参考書にはIIRフィルターの縦続型や安定性について載っていたので買った。まだ本屋で読んだ段階なので間違いかもしれないが、直接型の伝達関数因数分解する際に、サンプリング周波数や遮断周波数を変数化しているので、因数分解出来ないのでは?と思う。そうなるとプログラム的にサンプリング周波数や遮断周波数を色々変えたい場合は、直接型でないと無理で、だからmatlabの関数も直接型なのでは?。

 デジタル信号処理の勉強は、最初はC#フーリエ変換とFIRフィルターを作ったが、Scilabを知ってからScilabの関数を利用するようになる。Scilabフーリエ変換やフィルターの関数だけでなく、ダウンサンプリング等の関数も持つので、Scilabで十分だと思っていた。その後、会社でlabviewが入ってきたので、リアルタイム処理はScilabでは出来ないので、Labviewも勉強する。
 信号処理にも色々有るけど、今のところ仕事で行うのは、フーリエ変換伝達関数、減衰率、騒音振動レベル波形処理、1/3オクターブバンド分析など。振動の分析はサンプリングが少ないからデータ量も少ないが、騒音は多い。フーリエ変換伝達関数はデータ長毎に分析するから問題ないが、フィルター処理だとScilablabviewは元データを丸々配列で与えるので、データ量が多いとメモリ不足で処理出来ない。会社のLabviewは古いので32bit版だからなお更データ量には制限がある。会社では振動の仕事の方が断然多いので、古いlabviewでも問題には成らない。Scilabは64bit版もあるので大抵は問題ないが、チャンネル数が多かったり1/3オクターブバンド分析だと実メモリの容量でひっかかる。
 結局、メモリ量に左右されない手段は、1データづつ必要なフィルター処理をしてファイルに書き込めばいいのだが、そうなるとフィルター処理をちゃんと理解しなくてはならない。前に作ったFIRフィルターは置いといてIIRフィルターを使うべく、それで双一次変換を理解して使いたいフィルターを作ったのだった。そして1データづつ処理していくのならC#でも良い。

 ScailabやLabviewの関数は配列としてメモリに放り込んだ挙句にSSE等の命令を使うので、C#でファイルから1データづつ読んで処理するのでは速さは圧倒的に不利だが、C#ならマルチスレッド処理にしてCPUの数だけ並列処理を行える利点もある。簡単なマルチスレッド処理を作って実証まではしてある。

 今のところ、騒音振動レベル波形処理、1/3オクターブバンド分析はC#で、それ以外はScilabLabview

 今日買ったデジタルフィルターの参考書。

 デジタル信号処理の参考書も増えてきた。