2017-11-09 9 views
1

ゼロ位相(非因果関係)IIRフィルタを取得するために、Math.NETライブラリに特定の関数またはクラスがありますか?MathDotNetライブラリを使用してゼロ位相フィルタを適用するにはどうすればよいですか?

もしそうでない場合は、現在の機能を使ってどうすれば実現できますか?私は、これを信号をフィルタリングして逆フィルタリングすることで得られると信じていますが、結果が正しいかどうかはわかりません。

答えて

2

次のサンプルは、逆フィルタリング技術を使用してゼロ位相フィルタを取得する方法を示しており、その結果も従来のローパスフィルタの結果と比較しています。フィルタリングされる信号は、5Hzの正弦波+白色ガウス雑音である。

enter image description here

//signal + noise 
double fs = 1000; //sampling rate 
double fw = 5; //signal frequency 
double n = 5; //number of periods to show 
double A = 10; //signal amplitude 
double N = 2; //noise amplitude 
int size = (int)(n * fs/fw); //sample size 

var t = Enumerable.Range(1, size).Select(p => p * 1/fs).ToArray(); 
var noise = new WhiteGaussianNoiseSource(); 
var y = t.Select(p => (A * Math.Sin(2 * pi * fw * p)) + (N * noise.ReadNextSample())).ToArray(); 

//filter 
double fc = 10; //cutoff frequency 
var filter = OnlineFirFilter.CreateLowpass(ImpulseResponse.Finite, fs, fc); 

double[] yf1 = filter.ProcessSamples(y); //Lowpass 
double[] yf2 = filter.ProcessSamples(yf1.Reverse().ToArray()); //Lowpass reversed 
double[] yf2r = yf2.Reverse().ToArray(); //Zero-Phase 
関連する問題