采样信号滤波处理-C#调用Neuronic

C#生成一段0-100Hz的信号并使用Neuronic.Filters计算

public void CreateSignal()
{
	int sampleRate = 1000 * 10;
	int sampleCount = 1000*100;
	var time = new double[sampleCount];
	var xs = new double[sampleCount];
	_rawSignal = new float[sampleCount];
	_filterdSignal_2=new float[sampleCount];
	_filterdSignal_4 = new float[sampleCount];
	for (int i = 0; i < sampleCount; i++)
	{
		time[i] = i;
		var x = ((double)i) / ((double)sampleCount) * sampleCount / sampleRate;
		xs[i] = x;

		//手动叠加
		//_rawSignal[i] =
		//	(float)(0.5 * Math.Sin(2 * Math.PI * 10 * x) //叠加10Hz信号
		//	+ 0.2 * Math.Sin(2 * Math.PI * 80 * x + Math.PI / 4) //叠加80Hz信号
		//	+ 0.05 * Math.Sin(2 * Math.PI * 200 * x + Math.PI / 6)//叠加200Hz信号
		//	+ 0.07 * Math.Sin(2 * Math.PI * 400 * x + Math.PI / 8)//叠加400Hz信号
		//	+ 0.005 * Math.Sin(2 * Math.PI * 4000 * x + Math.PI / 18)//叠加4000Hz信号
		//	/*+ 10*/);////叠加直流分量


		//自动叠加多个
		for (int j = 0; j < 100; j++)
		{
			_rawSignal[i] += (float)Math.Sin(2 * Math.PI * j * x);
		}
	}

	Neuronic.Filters.IIR.LowPassButterworthCoefficients lowPassButterworthCoefficients = new Neuronic.Filters.IIR.LowPassButterworthCoefficients(2, sampleRate, 40);
	var chain=lowPassButterworthCoefficients.Calculate();
	chain.Filter(_rawSignal,0,_filterdSignal_2,0,_rawSignal.Length,1);

	lowPassButterworthCoefficients = new Neuronic.Filters.IIR.LowPassButterworthCoefficients(4, sampleRate, 40);
	chain = lowPassButterworthCoefficients.Calculate();
	chain.Filter(_rawSignal, 0, _filterdSignal_4, 0, _rawSignal.Length, 1);

	_rawWpfPlot.Plot.Clear();
	//_rawWpfPlot.Plot.AddScatterLines(xs, _rawSignal.Select(x=>(double)x).ToArray(), System.Drawing.Color.Red);
	_rawWpfPlot.Plot.AddScatterLines(xs, _filterdSignal_2.Select(x => (double)x).ToArray(), System.Drawing.Color.Blue);
	_rawWpfPlot.Plot.AddScatterLines(xs, _filterdSignal_4.Select(x => (double)x).ToArray(), System.Drawing.Color.Orange);
	//_rawWpfPlot.Plot.AddScatterLines(xs, filteredSignalBessel.Select(x => (double)x).ToArray(), System.Drawing.Color.Green);
	_rawWpfPlot.Refresh();


	var fftData=FFT_Methods.FFT(_rawSignal.Select(x => (double)x).ToArray());
	var fftDataAfterFilter = FFT_Methods.FFT(_filterdSignal_2.Select(x => (double)x).ToArray());
	var fftDataAfterFilter1 = FFT_Methods.FFT(_filterdSignal_4.Select(x => (double)x).ToArray());
	var freqResolution = sampleRate/ (double)fftData.Length;
	for (int i = 0; i < time.Length; i++)
	{
		time[i] = i * freqResolution;
	}
	_fftWpfPlot.Plot.Clear();
	_fftWpfPlot.Plot.AddScatterLines(time, fftData,System.Drawing.Color.Gray);
	//_fftWpfPlot.Plot.AddScatterLines(time, fftDataAfterFilter, System.Drawing.Color.Blue);
	_fftWpfPlot.Plot.AddScatterLines(time, fftDataAfterFilter1, System.Drawing.Color.Orange);
	_fftWpfPlot.Refresh();
}

二阶巴特沃斯滤波效果图

四阶阶巴特沃斯滤波效果图

手动插入不同频次信号

_rawSignal[i] =
				(float)(0.5 * Math.Sin(2 * Math.PI * 10 * x) //叠加10Hz信号
				+ 0.2 * Math.Sin(2 * Math.PI * 80 * x + Math.PI / 4) //叠加80Hz信号
				+ 0.05 * Math.Sin(2 * Math.PI * 200 * x + Math.PI / 6)//叠加200Hz信号
				+ 0.07 * Math.Sin(2 * Math.PI * 400 * x + Math.PI / 8)//叠加400Hz信号
				+ 0.005 * Math.Sin(2 * Math.PI * 4000 * x + Math.PI / 18)//叠加4000Hz信号
				/*+ 10*/);////叠加直流分量

高阶的通带平稳截至陡峭,较早的抑制高频,滤出的波形更好


				//自动叠加多个
				for (int j = 0; j < 100; j++)
				{
					_rawSignal[i] += (float)Math.Sin(2 * Math.PI * j * x);
				}
			}

			Neuronic.Filters.IIR.LowPassChebyshevICoefficients coefficients = new Neuronic.Filters.IIR.LowPassChebyshevICoefficients(2, sampleRate, 40,1);
			var chain=coefficients.Calculate();
			chain.Filter(_rawSignal,0,_filterdSignal_2,0,_rawSignal.Length,1);

二阶切比雪夫I滤波效果图

四阶切比雪夫I滤波效果图

八阶切比雪夫I滤波效果图

切换输入到上面sin波叠加 红线原始,蓝线2阶,橙线4阶,绿线8阶次

Neuronic.Filters.IIR.LowPassChebyshevIICoefficients coefficients = new Neuronic.Filters.IIR.LowPassChebyshevIICoefficients(2, sampleRate, 40, 1);
var chain = coefficients.Calculate();
chain.Filter(_rawSignal, 0, _filterdSignal_2, 0, _rawSignal.Length, 1);

二阶切比雪夫II滤波效果图

Neuronic.Filters.IIR.BandPassButterworthCoefficients coefficients = new Neuronic.Filters.IIR.BandPassButterworthCoefficients(2, sampleRate, 40,80);
var chain = coefficients.Calculate();
chain.Filter(_rawSignal, 0, _filterdSignal_2, 0, _rawSignal.Length, 1);

二阶巴特沃斯带通滤波效果图

Neuronic.Filters.IIR.BandStopButterworthCoefficients coefficients = new Neuronic.Filters.IIR.BandStopButterworthCoefficients(2, sampleRate, 40, 80);
var chain = coefficients.Calculate();
chain.Filter(_rawSignal, 0, _filterdSignal_2, 0, _rawSignal.Length, 1);

二阶巴特沃斯带阻滤波效果图

其他效果可以自己尝试

posted @ 2025-05-02 19:52  YYAN1987  阅读(123)  评论(0)    收藏  举报