为加速度计数据选择正确的滤波器


28

我对DSP相当陌生,并且已经对用于平滑python中的加速度计数据的可能过滤器进行了一些研究。下图显示了一个疾病类型的示例:

加速度计数据

本质上,我正在寻求有关平滑数据以最终将其转换为速度和位移的建议。我了解到手机的加速度计非常嘈杂。

我认为目前无法使用卡尔曼滤波器,因为我无法握住该设备来引用数据产生的噪声(我读到将设备放平并从这些读数中找到噪声的数量很重要吗?)

FFT产生了一些有趣的结果。我的尝试之一是对加速度信号进行FFT,然后渲染低频使其FFT绝对值为0。然后,我使用了ω算术和逆FFT来获得速度图。结果如下:

滤波信号

这是处理事情的好方法吗?我正在尝试消除信号的整体噪声性质,但是需要识别明显的峰值,例如在80秒左右。

我还对原始的加速度计数据使用低通滤波器感到疲倦,这在平滑数据方面做得很好,但是我不确定从何而来。关于从这里出发的任何指导都将非常有帮助!

编辑:一点点代码:

for i in range(len(fz)): 
    testing = (abs(Sz[i]))/Nz

    if fz[i] < 0.05:
        Sz[i]=0

Velfreq = []
Velfreqa = array(Velfreq)
Velfreqa = Sz/(2*pi*fz*1j)
Veltimed = ifft(Velfreqa)
real = Veltimed.real

因此,本质上,我对加速度计数据执行了FFT,使用简单的砖墙滤波器将Sz滤波后的高频输出出去(我知道这并不理想)。然后对数据的FFT使用欧米茄算法。也非常感谢datageist将我的图片添加到我的帖子中:)


欢迎使用DSP!第二张图片中的红色曲线是原始(绿色)数据的“平滑”版本吗?
声子

红色曲线是(希望如此)由fft生成的速度曲线,然后进行滤波,然后是ω算术(除以2 * pi f j),之后是inv。fft
Michael M

1
也许,如果您为执行的操作添加了更精确的数学表达式或伪代码,则可能会有所帮助。
声子

增加了一些现在,这就是代码的一般感觉..
迈克尔中号

1
我的问题是:您希望在数据中看到什么?除非您对滤波后希望看到的基础信号有所了解,否则您将不知道自己是否有一个好的方法。此外,您显示的代码令人困惑。尽管您没有显示fz数组的初始化,但您似乎正在应用高通滤波器。
杰森R

Answers:


13

正如@JohnRobertson在“ 在保持急剧过渡的同时对信号进行降噪的技巧包”中指出的那样,如果您的信号是分段恒定的,则总可变噪声(TV)降噪是另一个很好的选择。如果您的信号在不同平台之间保持变化,则加速度计数据可能就是这种情况。

μρ

ÿXμX-ÿ2+dX1个d

function denoise()

f = [-1*ones(1000,1);3*ones(100,1);1*ones(500,1);-2*ones(800,1);0*ones(900,1)];
plot(f);
axis([1 length(f) -4 4]);
title('Original');
g = f + .25*randn(length(f),1);
figure;
plot(g,'r');
title('Noisy');
axis([1 length(f) -4 4]);
fc = denoisetv(g,.5);
figure;
plot(fc,'g');
title('De-noised');
axis([1 length(f) -4 4]);

function f = denoisetv(g,mu)
I = length(g);
u = zeros(I,1);
y = zeros(I,1);
rho = 10;

eigD = abs(fftn([-1;1],[I 1])).^2;
for k=1:100
    f = real(ifft(fft(mu*g+rho*Dt(u)-Dt(y))./(mu+rho*eigD)));
    v = D(f)+(1/rho)*y;
    u = max(abs(v)-1/rho,0).*sign(v);
    y = y - rho*(u-D(f));
end

function y = D(x)
y = [diff(x);x(1)-x(end)];

function y = Dt(x)
y = [x(end)-x(1);-diff(x)];

结果:

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明


真的很喜欢这个答案,然后继续尝试。抱歉,我花了这么长时间回复!
Michael M

极好的答案。感谢您的详细信息。我正在寻找此代码的C版本。这里有人将此matlab代码移植到他们想共享的C吗?谢谢。
Rene Limberger '16

分段常数是什么意思?
tilaprimera

6

问题在于您的噪声频谱平坦。如果假设白色高斯噪声(事实证明是一个很好的假设),则其功率谱密度是恒定的。粗略地说,这意味着您的噪声包含所有频率。这就是为什么任何频率方法(例如DFT或低通滤波器)都不是一个好方法的原因。由于您的噪声遍布整个频谱,您的截止频率是多少?

这个问题的一个答案是维纳滤波器,它要求您了解噪声和所需信号的统计信息。基本上,噪声信号(信号+噪声)会在预期比您的信号更平滑的频率上衰减,并在预期比您的信号更平滑的频率上放大。

但是,我建议使用非线性处理的更现代方法,例如小波去噪。这些方法提供了极好的结果。基本上,噪声信号首先分解为小波,然后将小系数归零。由于小波具有多分辨率特性,因此该方法有效(但DFT无效)。即,在由小波变换定义的频带中分别处理信号。

在MATLAB中,键入“ wavemenu”,然后键入“ SWT降噪一维”。然后是“文件”,“示例分析”,“噪声信号”,“ Haar处于第5级噪声块”。本示例使用Haar小波,该小波应该可以很好地解决您的问题。

我不太擅长Python,但我相信您可以找到一些执行Haar小波去噪的NumPy软件包。


1
我不同意你的第一句话。您假设感兴趣的信号覆盖了输入序列的整个带宽,这不太可能。在这种情况下,仍然可以使用线性滤波来获得改进的信噪比,从而消除带外噪声。如果信号高度过采样,那么使用这种简单的方法可能会获得很大的改善。
杰森·R

的确如此,当您知道信号和噪声的统计信息时,这可以通过维纳滤波器实现。
Daniel R. Pipa

尽管小波去噪背后的理论很复杂,但实现方式却与您描述的方法一样简单。它仅涉及滤波器组和阈值。
Daniel R. Pipa

1
我正在对此进行研究,感谢您和Phonon迄今为止的所有帮助,我将在上面发布我的进展!
Michael M

@DanielPipa我无权访问有问题的matlab软件包。您能否提供描述与您的Matlab代码相对应的方法的论文或其他参考资料。
约翰·罗伯逊

0

根据丹尼尔·皮帕(Daniel Pipa)的建议,我看了小波去噪后发现了弗朗西斯科·布兰科·席尔瓦(Francisco Blanco-Silva)的这篇出色文章

在这里,我修改了他的Python图像处理代码,以使用2D(加速度计)而不是3D(图像)数据。

注意,在Francisco的示例中,阈值由“软阈值”组成。考虑这一点并为您的应用程序进行修改。

def wavelet_denoise(data, wavelet, noise_sigma):
    '''Filter accelerometer data using wavelet denoising

    Modification of F. Blanco-Silva's code at: https://goo.gl/gOQwy5
    '''
    import numpy
    import scipy
    import pywt

    wavelet = pywt.Wavelet(wavelet)
    levels  = min(15, (numpy.floor(numpy.log2(data.shape[0]))).astype(int))

    # Francisco's code used wavedec2 for image data
    wavelet_coeffs = pywt.wavedec(data, wavelet, level=levels)
    threshold = noise_sigma*numpy.sqrt(2*numpy.log2(data.size))

    new_wavelet_coeffs = map(lambda x: pywt.threshold(x, threshold, mode='soft'),
                             wavelet_coeffs)

    return pywt.waverec(list(new_wavelet_coeffs), wavelet)

哪里:

  • wavelet-要使用的小波形式的字符串名称(请参见pywt.wavelist(),例如'haar'
  • noise_sigma -噪声与数据的标准偏差
  • data -要过滤的值的数组(例如x,y或z轴数据)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.