采样信号和傅里叶变换_测试台架信号中的电源干扰
蓝色线是电磁阀导通过程的气压原始信号,黄色线是去除高频后的滤波信号,我们用一个电源去开启电磁阀导通,靠气压去测试阀的导通

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;
}
最后我们对曲线求导去求开启点,右边滤波后导数正常了很多


浙公网安备 33010602011771号