【发布时间】:2023-03-23 22:15:02
【问题描述】:
Math.NET 库中是否有特定的函数或类来获取零相位(非因果)IIR 滤波器?
如果没有,如何使用当前函数来实现?我相信这可以通过对信号进行滤波然后反向滤波得到,但我不确定结果是否正确。
【问题讨论】:
标签: c# math.net mathnet-filtering
Math.NET 库中是否有特定的函数或类来获取零相位(非因果)IIR 滤波器?
如果没有,如何使用当前函数来实现?我相信这可以通过对信号进行滤波然后反向滤波得到,但我不确定结果是否正确。
【问题讨论】:
标签: c# math.net mathnet-filtering
以下示例显示了如何使用反向滤波技术获得零相位滤波器,并将结果与传统低通滤波器的结果进行比较。被过滤的信号是 5Hz 正弦波 + 白高斯噪声。
//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
【讨论】: