【问题标题】:Remove unknown DC Offset from a non-periodic discrete time signal从非周期性离散时间信号中去除未知的直流偏移
【发布时间】:2011-10-23 01:38:30
【问题描述】:

是否有一些过程可以从非周期性离散时间信号中确定/去除未知的直流偏移?

相关信号的采样率为 25Hz,感兴趣的谐波在 0.25 到 3Hz 之间。

我尝试使用高通滤波器混合结果,首先我使用 Fc = 0Hz 的 10 阶高斯,这很好地消除了偏移,但它也严重衰减了 AC,尽管它确实保持信号形状完好无损,接下来我使用了 168 阶等波纹,阻带为 0Hz,通带为 0.25Hz,相移太严重,信号形状太失真,如果通带降低到 0.1Hz,失真可能会减少,但这会只是进一步增加我需要保持在最低限度的相移。

应用 x - LPF(x) 之前和之后,如 Paul R 所建议的

【问题讨论】:

    标签: matlab signal-processing


    【解决方案1】:

    与其直接实现高通滤波器(这对于非常低的频率可能相当棘手 - 您最终会遇到大量系数以及稳定性和通带纹波等各种问题),您可能想要考虑实现一个低通滤波器,它将为您提供 DC 偏移值的估计值,然后从您的信号中减去此滤波后的偏移,即:

    y = HPF(x)
    

    这样做:

    y = x - LPF(x)
    

    低通滤波器可能只是一个非常简单的滤波器,其项数相对较少。这种实现的最大优势在于,您的高频分量不应该有任何由于相位、纹波等原因造成的不需要的伪影,因为您所做的只是从样本中减去一个几乎稳定的 DC 值。

    唯一潜在的缺点是,如果直流偏移很大,您可能需要很长的初始稳定时间才能准确估计直流偏移(尽管对于任何其他实现也是如此,例如直接高通滤波器当然)。如果您先验知道偏移值可能是什么(例如,如果它在每次运行中变化不大,并且您知道上一次运行的值),那么您可以通过将 LPF 状态变量初始化为合适的值而不是 0 来优化建立时间。

    【讨论】:

    • 我尝试按照您的建议使用 LPF,但它没有达到预期的效果,我测试了十几种不同的 LPF,最好的是 50 项高斯,Fc = 0.0001Hz 和 Alpha = 1.1。问题是感兴趣的低频谐波被扭曲了。 Iv 在我的问题中添加了前后图表
    • 除了输入和输出信号之外,您还能绘制 LPF 的输出吗?看看它何时以及变化多少会很有趣。我仍然认为基本的想法是合理的,但要使过滤器正确可能很棘手 - 我倾向于尝试手动设计它。
    • 我添加了情节。如您所见,LPF 捕获了我不想滤除的大部分低频信号。
    • 好的 - LPF 显然没有正确的响应 - 如果你有一个或多或少恒定的直流分量,那么 LPF 输出应该慢慢收敛到这个值,然后几乎保持在那里。跨度>
    【解决方案2】:

    直流偏移意味着向信号添加了一些恒定值(该名称源于将直流电压添加到模拟交流信号)。如果直流分量确实是恒定的(并且变化不是很慢),那么您不必设计一些高阶(并且可能不稳定)的高通滤波器 - 您可以从信号中减去信号的平均值 -当然,它也是一个高通滤波器(平均是一种低通滤波器,“1 减去平均值”是高通滤波器)——但是一个非常简单的滤波器。

    另一方面,如果您有理由相信直流分量并不是真正的直流,而是频率非常低的交流,那么您最好对信号的分段而不是信号进行平均,因为一个整体,这与使用具有比信号长度更短的脉冲响应的低通滤波器相同。在这种情况下,您必须对“DC”组件做出一些假设。

    【讨论】:

    • 问题是信号由一个恒定的直流偏移和两个感兴趣的信号分量组成,一个低频分量和一个叠加在前者上的高频分量。试图滤除直流会使低频分量失真。
    • 如果你对低频信号的多个周期进行平均,它对平均值的贡献为零,因为正样本和负样本相互抵消,所以不会发生失真。你可以上传一个信号作为例子吗?这将有助于回答您的问题。
    • 根据偏移量,低频信号幅度可能永远不会是负数,而且它绝不是周期性的,因此它的贡献可能不为零。 Iv 在我的问题中添加了一个图表,以便您了解信号的性质。
    • 不,它不依赖于直流偏移。例如,如果您的交流电为[1,-1,1,-1],直流电为[5,5,5,5],则和信号为[6,4,6,4],平均信号为[ 5,5,5,5],如果你减去它,你会得到 AC。它成立,因为平均是线性的,所以 sum 的平均值是平均值的和 --- DC 平均值只是偏移量,AC 平均值是 0。
    • DC 项是完全信号帧的平均值,而不是近似值。如果您采用定义Xk = 1/N * sum over n[Xn * exp(i*n*Wk)],并将k=0 插入频率Wk=0,则得到平均值。
    【解决方案3】:

    正如其他人所说,要消除 DC 偏移,您可以简单地减去平均值。您的信号不需要是周期性的,但它确实需要足够长才能很好地估计直流分量。

    如果您仍希望使用滤波方法,您可以使用filtfilt 消除由于相位滞后导致的严重失真。此功能在正向过滤您的时间序列一次,然后在反向过滤一次,以便消除相位失真。

    【讨论】:

      【解决方案4】:

      我建议在 DC 上使用陷波滤波器并使用filtfilt 使其为零相位。

      a = [1 , -0.98]; b = [1,-1];
      
      y = filtfilt(b,a,x);
      

      a 的第二个值越接近 -1,您的缺口就越窄。

      【讨论】:

      • 我需要做更多的测试,但这似乎给出了非常好的结果!
      • 使用freqz(xcorr(b,b),xcorr(a,a)) 检查滤波器的频率响应。 xcorrs 是 filtfilt 的 Z 变换对应物。尝试a(2) 的不同值,看看你的缺口有多宽/窄。
      • filtfilt 没有给出线性相位,而是零相位,这意味着滤波器引入的任何延迟都会“补偿回来”,因此输出不会延迟(与输入相比)。线性相位是另一回事。
      【解决方案5】:

      您可以设计一个对称 FIR 滤波器作为低通滤波器,用于估算 DC,然后从输入信号中减去输出。此过滤器具有恒定的组延迟。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-03
        • 2015-06-14
        • 1970-01-01
        • 2012-11-14
        • 2010-10-22
        • 1970-01-01
        • 2021-07-07
        • 1970-01-01
        相关资源
        最近更新 更多