从振动记录中去除噪音

信息处理 matlab 过滤器 去噪 高通滤波器
2022-02-07 02:39:57

问题
我正在分析由数字电路问题引起的“尖峰”污染的加速度计记录。尖峰是有问题的,因为我希望使用自动化程序从大量(数百,也许数千)这些记录中确定这些信号的峰值幅度。因此,手动确定幅度是可能的,但不是优选的。

背景
加速度记录本质上是振荡的,并达到~200 Hz的频率。我计划Matlab中使用低通滤波器来去除信号中的污染尖峰。采样率约为 730 Hz。基于FFT 的滤波器可能会因为信号频率随时间逐渐增加和减少的事实而变得复杂。

这是一个示例记录的图片,其中包括前 100 毫秒中令人讨厌的尖峰(噪音):

记录

问题
我正在使用 Matlab 进行信号处理,我正在寻找关于将哪个数字滤波器用作高通滤波​​器的建议?例如,如果我没记错的话, ButterworthChebyshev过滤器很常用,但为什么呢?小波对我有什么好处吗?

2个回答

如果要检测时域信号的峰值,重要的是不要改变每个频率信号的相位。否则,峰值会受其影响而略有变化。

我认为您已经录制了信号,您可以在录制对其进行处理。如果是这样,最好使用零相位滤波器,比如matlab 中的这个函数

http://uk.mathworks.com/help/signal/ref/filtfilt.html

在这种情况下,所需的功能是减少包含如此多频率的尖峰。在我之前展示的帮助页面中,有一个从相对低频信号中过滤这种尖峰的示例。我认为这是你需要的。

编辑

我推荐巴特沃斯低通滤波器,因为它具有平坦的增益特性。Chebtshev 的增益波纹会产生严重影响。将通过向后使用滤波器来校正相位变化,而 filtfit 就是这样做的。正如你想象的那样,在这种情况下,相变的影响会很小,但不能保证。仅供参考,当您进行在线过滤时,Bessel 将成为候选人。

如果您仍然怀疑滤波器的相移(而不是时移)的影响,您可以想象下面的图像和代码中的时间拉伸脉冲和脉冲信号。这些信号几乎相同,只是相位不同。除了影响的量之外,相移确实会影响信号的幅度。

如果您想精确测量实际幅度,我建议您使用零相位滤波器。

相位的影响。 来源它是一种特殊情况......

clear all;
close all;

% generate signal with the same phase
N = 2^15; % number of samples for this signal
for k = 1:N/2;
    S(k+1) = exp(0);
end
S(N/2+2: N) = conj(S(N/2: -1 :2));

signal1 = real(ifft(S));

% generate signal with different phase from above
% this signal is called time-streched pulse.
N = 2^15;
for k = 1:N/2;
    S(k+1) = exp(-1j*2*pi*N/2*(k/N)^2);
end
S(N/2+2: N) = conj(S(N/2: -1 :2));

signal2 = real(ifft(S));

% and let's see them.
subplot(211)
plot(signal1)
xlim([-1e4, length(signal1)])
xlabel('time')
ylabel('all the same phase')
subplot(212)
plot(signal2)
xlim([-1e4, length(signal1)])
xlabel('time')
ylabel('only the phases are different form above')

正如我在评论中所说,高通滤波器不是你想要的。

下面是一些scilab生成绘图的代码。该图显示了四个信号:

  • 原始信号。
  • 信号经过高通滤波。
  • 信号中值滤波器。
  • 信号低通滤波。

中值滤波器是一种非线性滤波器,有时用于图像处理以去除尖峰。但是,由于它是非线性的,因此可能会对您的信号产生不良影响。

低通滤波器仍然会受到尖峰的影响,但它可能比中值滤波器更可取。

在此处输入图像描述


代码:

    x = rand(1,1000,"norm");
    omega = 2*%pi*0.0789234;
    y = filter(1,[1 -2*cos(omega) 1],x);

    mx = max(y);

    z = y;
    z(100) = 3*mx;
    clf
    subplot(411)
    plot(z)
    title("ORIGINAL SIGNAL")

    hp=eqfir(33,[0 .2;.25 .35;.4 .5],[0 1 1],[1 1 1]);

    zhp = filter(hp,1,z);
    subplot(412);
    plot(zhp);
    title("HIGH PASS FILTERED")

    M = 3;
    for k=1:1000,
        lw = max(1,k-M);
        hgh = min(1000,k+M);
        zmdn(k) = median(z(lw:hgh))
    end
    subplot(413);
    plot(zmdn);
    title("MEDIAN FILTERED")

    zlp = filter(0.01,[1 -0.99],z);
    subplot(414);
    plot(zlp);
    title("LOW PASS FILTERED")