采样信号和傅里叶变换_测试台架信号中的电源干扰

蓝色线是电磁阀导通过程的气压原始信号,黄色线是去除高频后的滤波信号,我们用一个电源去开启电磁阀导通,靠气压去测试阀的导通

public  double[] SmoothDataFFT(double[] data, double dataFrequence, double cutFrequence)
{
	int n = data.Length;          // 信号长度(2的幂方便FFT)  
	double fs = dataFrequence;    // 采样率 Hz  
	double cutoffFreq = cutFrequence; // 截止频率 Hz  
	double[] signal = new double[n]; ;
	Array.Copy(data, signal, data.Length);

	// 变换前,把实数signal转复数数组  
	Complex[] spectrum = new Complex[n];
	for (int i = 0; i < n; i++)
		spectrum[i] = new Complex(signal[i], 0);

	// 执行FFT(in-place)  
	Fourier.Forward(spectrum, FourierOptions.Matlab);

	// 频率对应的分辨率 = fs / n  
	double freqResolution = fs / n;
	int cutoffIndex = (int)(cutoffFreq / freqResolution);

	// 去除N以上频率(把高于cutoffIndex的频率设为0)  
	for (int i = cutoffIndex; i < n - cutoffIndex; i++)
	{
		spectrum[i] = Complex.Zero;
	}

	// IFFT还原时域信号  
	Fourier.Inverse(spectrum, FourierOptions.Matlab);

	// 取实部作为滤波后信号  
	double[] filteredSignal = new double[n];
	for (int i = 0; i < n; i++)
		filteredSignal[i] = spectrum[i].Real;

	return filteredSignal;
}

ys_real = SmoothDataFFT(ys_raw, 20000, 500);

20K/S的采样率,大概采集了8S左右,看右图有个1KHz的倍频干扰,剔除掉500HZ以上的频率,得到的黄色曲线还是蛮平滑,最后发现我们那个电源在1秒从0-25V的升压是每1ms升一点导致影响到产品的其他特性曲线了
右边这个图是计算里面那个复数的模数组画出来的,就是下面这个函数得返回值,加窗处理减少频率泄露

public  double[] FFT(double[] data)
{
	int n = data.Length;          // 信号长度(2的幂方便FFT)  
	double[] signal = new double[n]; ;
	Array.Copy(data, signal, data.Length);


	//加窗
	var fftwindow = MathNet.Numerics.Window.Hamming(signal.Length);


	// 变换前,把实数signal转复数数组  
	Complex[] spectrum = new Complex[n];
	for (int i = 0; i < n; i++)
		spectrum[i] = new Complex(signal[i] * fftwindow[i], 0);

	// 执行FFT(in-place)  
	Fourier.Forward(spectrum, FourierOptions.Matlab);


	// 取实部作为滤波后信号  
	double[] filteredSignal = new double[n];
	for (int i = 0; i < n; i++)
		filteredSignal[i] = spectrum[i].Magnitude;//spectrum[i].Real;

	return filteredSignal;
}

最后我们对曲线求导去求开启点,右边滤波后导数正常了很多

posted @ 2025-05-01 23:05  YYAN1987  阅读(42)  评论(0)    收藏  举报