使用高通fft滤波器去除DC偏移

时间:2013-08-15 07:29:01

标签: matlab filter fft

我有一些具有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

的过滤曲线(红色)的示例

enter image description here

3 个答案:

答案 0 :(得分:4)

要删除DC,您只需输入:

即可
inputData_DCRemoved = inputData - mean(inputData);

答案 1 :(得分:1)

低频阻塞滤波器不是解决此问题的最佳方法。由于傅立叶空间中的粗糙边缘,您可能会得到一些振铃,将一些振幅设置为零,同时保留相邻的振幅。

更好:为数据拟合线或低阶多项式,然后减去它。

编辑:啊,现在我看到了你的数据的一个例子......首先,你想把那个峰标记为“坏数据”,并做一个适合其余的低阶多项式。我没有看到任何斜率或非常小的斜率,因此恒定(零阶)拟合可能会很好。从原始数据中减去这个常数或多项式(忘记任何“坏”数据),这就是你的结果。在傅立叶空间中,这一切都不容易。

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

答案 2 :(得分:0)

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

否则,您可以接收信号并将其平滑然后减去它:

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

这是务实的做法。