• 信号包络提取的方法


            此示例说明如何提取信号的包络。创建双边带幅值调制信号。载波频率为 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')

            如图所示:

  • 相关阅读:
    【Node.js】包与npm包
    【SLAM】 前端-视觉里程计之特征点
    在前端开发中需要考虑的常见web安全问题和攻击原理以及防范措施
    Java多线程-线程创建的3种方式
    深入浅出Scala之函数式编程、静态类型语言(P4-P9)
    Vue的props配置项
    随手笔记(四十二)——关于Stack部分原理分析
    网络初识(概念入门)
    笔记44:Batch_Normlization 过程详解
    力扣每日一题-第31天-13.罗马数组转整数
  • 原文地址:https://blog.csdn.net/jk_101/article/details/124794342