我有一些具有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
答案 0 :(得分:4)
要删除DC,您只需输入:
即可inputData_DCRemoved = inputData - mean(inputData);
答案 1 :(得分:1)
低频阻塞滤波器不是解决此问题的最佳方法。由于傅立叶空间中的粗糙边缘,您可能会得到一些振铃,将一些振幅设置为零,同时保留相邻的振幅。
更好:为数据拟合线或低阶多项式,然后减去它。
编辑:啊,现在我看到了你的数据的一个例子......首先,你想把那个峰标记为“坏数据”,并做一个适合其余的低阶多项式。我没有看到任何斜率或非常小的斜率,因此恒定(零阶)拟合可能会很好。从原始数据中减去这个常数或多项式(忘记任何“坏”数据),这就是你的结果。在傅立叶空间中,这一切都不容易。加权多重拟合程序存在于所有广泛使用的交互式数学程序中,包括Matlab。
答案 2 :(得分:0)
高通滤波器只是去除信号的缓慢变化部分。信号中最慢的部分是它的平均值,所以我只想尝试从信号中减去它......
否则,您可以接收信号并将其平滑然后减去它:
lowpasssignal = smooth(signal,100);
signal_highpass = signal - lowpasssignal;
这是务实的做法。