• 信号包络提取的方法


            此示例说明如何提取信号的包络。创建双边带幅值调制信号。载波频率为 1 kHz。调制频率为 50 Hz。调制深度为 100%。采样率为 10 kHz。

    1. t = 0:1e-4:0.1;
    2. x = (1+cos(2*pi*50*t)).*cos(2*pi*1000*t);
    3. plot(t,x)
    4. xlim([0 0.04])

            如图所示:

            使用 hilbert 函数提取包络。包络是由 hilbert 计算的解析信号的幅值。绘制包络和原始信号。将 plot 函数的名称-值对组参数存储在元胞数组中,供以后使用。分析信号的幅值捕获信号的缓慢变化特性,而相位包含高频信息。

    1. y = hilbert(x);
    2. env = abs(y);
    3. plot_param = {'Color', [0.6 0.1 0.2],'Linewidth',2};
    4. plot(t,x)
    5. hold on
    6. plot(t,[-1;1]*env,plot_param{:})
    7. hold off
    8. xlim([0 0.04])
    9. title('Hilbert Envelope')

            如图所示:

            还可以使用 envelope 函数直接生成信号包络并修改其计算方式。例如,可以调整用于求得分析包络的 Hilbert 滤波器的长度。使用太小的滤波器长度会导致包络失真。 

    1. fl1 = 12;
    2. [up1,lo1] = envelope(x,fl1,'analytic');
    3. fl2 = 30;
    4. [up2,lo2] = envelope(x,fl2,'analytic');
    5. param_small = {'Color',[0.9 0.4 0.1],'Linewidth',2};
    6. param_large = {'Color',[0 0.4 0],'Linewidth',2};
    7. plot(t,x)
    8. hold on
    9. p1 = plot(t,up1,param_small{:});
    10. plot(t,lo1,param_small{:});
    11. p2 = plot(t,up2,param_large{:});
    12. plot(t,lo2,param_large{:});
    13. hold off
    14. legend([p1 p2],'fl = 12','fl = 30')
    15. xlim([0 0.04])
    16. title('Analytic Envelope')

            如图所示:

            可以使用滑动窗生成移动 RMS 包络。使用太小的窗长度会导致包络失真。使用太大的窗长度则会平滑掉包络。

    1. wl1 = 3;
    2. [up1,lo1] = envelope(x,wl1,'rms');
    3. wl2 = 5;
    4. [up2,lo2] = envelope(x,wl2,'rms');
    5. wl3 = 300;
    6. [up3,lo3] = envelope(x,wl3,'rms');
    7. plot(t,x)
    8. hold on
    9. p1 = plot(t,up1,param_small{:});
    10. plot(t,lo1,param_small{:});
    11. p2 = plot(t,up2,plot_param{:});
    12. plot(t,lo2,plot_param{:});
    13. p3 = plot(t,up3,param_large{:});
    14. plot(t,lo3,param_large{:})
    15. hold off
    16. legend([p1 p2 p3],'wl = 3','wl = 5','wl = 300')
    17. xlim([0 0.04])
    18. title('RMS Envelope')

            如图所示:

            可以通过对相隔可变数量采样点的局部最大值进行样条插值来生成峰值包络。样本太分散会平滑包络。 

    1. np1 = 5;
    2. [up1,lo1] = envelope(x,np1,'peak');
    3. np2 = 50;
    4. [up2,lo2] = envelope(x,np2,'peak');
    5. plot(t,x)
    6. hold on
    7. p1 = plot(t,up1,param_small{:});
    8. plot(t,lo1,param_small{:})
    9. p2 = plot(t,up2,param_large{:});
    10. plot(t,lo2,param_large{:})
    11. hold off
    12. legend([p1 p2],'np = 5','np = 50')
    13. xlim([0 0.04])
    14. title('Peak Envelope')

            如图所示:

            增大峰值分隔参数可以降低噪声引起的伪峰效应。向信号引入随机噪声。先使用包含 5 个样本的区间了解噪声对峰值包络的影响,然后用包含 25 个样本的区间重新生成峰值包络。 

    1. rng default
    2. q = x + randn(size(x))/10;
    3. np1 = 5;
    4. [up1,lo1] = envelope(q,np1,'peak');
    5. np2 = 25;
    6. [up2,lo2] = envelope(q,np2,'peak');
    7. plot(t,q)
    8. hold on
    9. p1 = plot(t,up1,param_small{:});
    10. plot(t,lo1,param_small{:})
    11. p2 = plot(t,up2,param_large{:});
    12. plot(t,lo2,param_large{:})
    13. hold off
    14. legend([p1 p2],'np = 5','np = 25')
    15. xlim([0 0.04])
    16. title('Peak Envelope')

            如图所示:

  • 相关阅读:
    Leetcode 984. 不含 AAA 或 BBB 的字符串(网友思路)
    枚举类中有2个值,如何根据值1取值2,根据值2取值1
    Linux----文件与目录管理
    ROS 节点初始化步骤、topic/service创建及使用
    vs code 好用的插件
    函数调用、值传递、引用传递、实参与形参
    读书笔记:Effective C++ 2.0 版 1997年Scott Meyers,条款1、2、3、4
    springboot下使用rabbitMQ之开发配置方式(一)
    【ChatGPT】科技革命促生互联网时代 ChatGPT浪潮打乱时代布局 人工智能新时代下的发展前景
    智算引领·创新未来 | 2023紫光展锐泛物联网终端生态论坛成功举办
  • 原文地址:https://blog.csdn.net/jk_101/article/details/124794342