1

我有一些数据有 DC 偏移并且可能有轻微的斜率。信号是两个主峰(类似于高斯),随后是衰减振荡。

我尝试了以下代码,但这不会删除 DC 偏移 - 它会删除弯曲的偏移(窦?)。

function [ filteredData ] = fourierFilter( inputData )

factor = 8;
N = 1024*factor;
dataRaw = zeros([1 N]);
dataStart = N/2 - round(size(inputData,2)/2);
indices = dataStart:(dataStart+size(inputData,2))-1;
dataRaw(indices) = inputData;

% transform to fourierspace
fourierSpectrum = (fftshift(fft(dataRaw)));

% add filter
delta = 1*factor/4;
indicesfftfilter = N/2-delta:N/2+delta;
fourierSpectrum(indicesfftfilter) = 0;

% back transform
filteredData = real(ifft(ifftshift(fourierSpectrum)));
filteredData = (filteredData(indices));

这是数据(蓝色)和过滤曲线(红色)的示例delta = 3*factor/4

在此处输入图像描述

4

3 回答 3

6

要删除 DC,您只需键入:

inputData_DCRemoved = inputData - mean(inputData);
于 2013-08-15T08:56:32.473 回答
1

低频阻塞滤波器不是解决这个问题的最佳方法。由于傅里叶空间中的粗糙边缘,您可能会得到一些振铃,将一些幅度设置为零,而将相邻的幅度保持原样。

更好:将一条线或低阶多项式拟合到数据中,然后减去它。

编辑:啊,现在我看到了您的数据示例...首先,您想将该峰值标记为“坏数据”,然后对其余部分进行低阶多项式拟合。我没有看到任何斜率或非常轻微的斜率,因此恒定(零阶)拟合可能会很好。从原始数据中减去这个常数或多项式(忘记任何“坏”数据),这就是你的结果。在傅立叶空间中,这一切都不是一件容易的事。

加权多边形拟合例程存在于所有广泛使用的交互式数学程序中,包括 Matlab。

于 2013-08-15T07:49:39.950 回答
0

高通滤波器只是去除信号中变化缓慢的部分。信号中最慢的部分是它的平均值,所以我会尝试从信号中减去它......

否则,您可以获取信号并对其进行平滑处理,然后将其减去:

lowpasssignal = smooth(signal,100);
signal_highpass = signal - lowpasssignal;

这是务实的做法。

于 2013-08-15T08:34:12.330 回答