• MATLAB中findsignal函数使用


    目录

    语法

    说明

    示例

    在数据中定位信号


            findsignal函数的功能是使用相似性搜索查找信号位置。

    语法

    1. [istart,istop,dist] = findsignal(data,signal)
    2. [istart,istop,dist] = findsignal(data,signal,Name,Value)
    3. findsignal(___)

    说明

            [istart,istop,dist] = findsignal(data,signal)返回与搜索数组信号最匹配的数据数组数据段的开始和停止索引。最佳匹配的片段是这样的,dist,片段和搜索阵列之间的平方欧几里得距离,是最小的。如果数据和信号是矩阵,那么findsignal会查找与信号最匹配的数据区域的开始列和结束列。在这种情况下,数据和信号必须具有相同的行数。

            [istart,istop,dist] = findsignal(data,signal,Name,Value)使用名称-值对参数指定附加选项。选项包括要应用的归一化、要报告的线段数以及要使用的距离度量。

            不带输出参数的findsignal(___)绘制数据并突出显示任何已识别的信号实例。

    如果数组是实向量,该函数将数据显示为样本数的函数。

    如果数组是复数向量,该函数将在Argand图上显示数据。

    如果数组是实矩阵,该函数使用imagesc在一个子绘图上显示信号,在另一个子绘图上显示带有突出显示区域的数据。

    如果数组是复矩阵,该函数在每个图像的上半部分和下半部分绘制它们的实部和虚部。

    示例

    在数据中定位信号

            产生由50%带宽的5 Hz高斯脉冲组成的数据集,以1 kHz的速率采样半秒。

    1. fs = 1e3;
    2. t = 0:1/fs:0.5;
    3. data = gauspuls(t,5,0.5);

            创建一个由一个半周期的10赫兹正弦波组成的信号。绘制数据集和信号。

    1. ts = 0:1/fs:0.15;
    2. signal = cos(2*pi*10*ts);
    3. subplot(2,1,1)
    4. plot(t,data)
    5. title('Data')
    6. subplot(2,1,2)
    7. plot(ts,signal)
    8. title('Signal')

            如图所示:

            找出与信号的平方欧几里德距离最小的数据段。绘制数据并突出显示该部分。 

    1. figure
    2. findsignal(data,signal)

            如图所示:

            向数据集添加两个明显无关的部分。找出在绝对距离最小的意义上最接近信号的段。 

    1. dt = data;
    2. dt(t>0.31&t<0.32) = 2.1;
    3. dt(t>0.32&t<0.33) = -2.1;
    4. findsignal(dt,signal,'Metric','absolute')

            如果拉伸导致最近的数据段和信号之间的绝对距离变小,则让x轴拉伸。 

    findsignal(dt,signal,'TimeAlignment','dtw','Metric','absolute')

            如图所示:

            向数据集添加另外两个外围部分。 

    1. dt(t>0.1&t<0.11) = 2.1;
    2. dt(t>0.11&t<0.12) = -2.1;
    3. findsignal(dt,signal,'TimeAlignment','dtw','Metric','absolute')

            如图所示:

            找出最接近信号的两个数据段。 

    1. findsignal(dt,signal,'TimeAlignment','dtw','Metric','absolute', ...
    2. 'MaxNumSegments',2)

            如图所示:

            回去找一段。选择“edr”作为x轴拉伸标准。选择编辑距离公差3。不匹配样品之间的编辑距离与实际分离无关,使“edr”对异常值具有鲁棒性。

    1. findsignal(dt,signal,'TimeAlignment','edr','EDRTolerance',3, ...
    2. 'Metric','absolute')

            如图所示:

     重复计算,但现在将数据和信号归一化。

            定义一个移动窗口,在每个数据和信号点的两侧各有10个样本。

            减去窗口中数据的平均值,然后除以本地标准偏差。

    找到与归一化信号具有最小绝对距离的归一化数据段。显示数据和信号的非标准化和标准化版本。

    1. findsignal(dt,signal,'TimeAlignment','edr','EDRTolerance',3, ...
    2. 'Normalization','zscore','NormalizationLength',21, ...
    3. 'Metric','absolute','Annotate','all')

            如图所示:

    在有突变的数据中寻找信号 

            生成随机数据数组,其中:

            平均值在七个区域中的每一个都是恒定的,并且从一个区域到另一个区域突然变化。

            标准偏差在五个区域中的每一个都是恒定的,并且在不同的区域中会突然变化。

    1. lr = 20;
    2. mns = [0 1 4 -5 2 0 1];
    3. nm = length(mns);
    4. vrs = [1 4 6 1 3]/2;
    5. nv = length(vrs);
    6. v = randn(1,lr*nm*nv);
    7. f = reshape(repmat(mns,lr*nv,1),1,lr*nm*nv);
    8. y = reshape(repmat(vrs,lr*nm,1),1,lr*nm*nv);
    9. t = v.*y+f;

            绘制数据,突出其构建步骤。显示每个区域的平均值和标准偏差。

    1. subplot(2,2,1)
    2. plot(v)
    3. title('Original')
    4. xlim([0 700])
    5. subplot(2,2,2)
    6. plot([f;v+f]')
    7. title('Means')
    8. xlim([0 700])
    9. text(lr*nv*nm*((0:1/nm:1-1/nm)+1/(2*nm)),-7*ones(1,nm),num2str(mns'), ...
    10. 'HorizontalAlignment',"center")
    11. subplot(2,2,3)
    12. plot([y;v.*y]')
    13. title('STD')
    14. xlim([0 700])
    15. text(lr*nv*nm*((0:1/nv:1-1/nv)+1/(2*nv)),-7*ones(1,nv),num2str(vrs'), ...
    16. 'HorizontalAlignment',"center")
    17. subplot(2,2,4)
    18. plot(t)
    19. title('Final')
    20. xlim([0 700])

            如图所示:

            创建一个均值为零、标准差为1/2的随机信号。找到并显示与信号最匹配的数据组段。 

    1. sg = randn(1,2*lr)/2;
    2. findsignal(t,sg)

            如图所示:

            创建一个均值为零、标准差为2的随机信号。找到并显示与信号最匹配的数据组段。 

    1. sg = randn(1,2*lr)*2;
    2. findsignal(t,sg)

            如图所示:

            创建一个平均值为2、标准差为2的随机信号。找到并显示与信号最匹配的数据组段。 

    1. sg = randn(1,2*lr)*2+2;
    2. findsignal(t,sg)

            如图所示:

            创建一个均值为-4、标准差为3的随机信号。找到并显示与信号最匹配的数据组段。 

    1. sg = randn(1,2*lr)*3-4;
    2. findsignal(t,sg)

            如图所示:

            重复计算,但这次从信号和数据中减去平均值。 

    findsignal(t,sg,'Normalization','zscore','Annotate','all')

            如图所示:

    在书写样本中查找信件 

            设计一种类似早期计算机输出的字体。用它来写单词MATLAB。

    1. rng default
    2. chr = @(x)dec2bin(x')-48;
    3. M = chr([34 34 54 42 34 34 34]);
    4. A = chr([08 20 34 34 62 34 34]);
    5. T = chr([62 08 08 08 08 08 08]);
    6. L = chr([32 32 32 32 32 32 62]);
    7. B = chr([60 34 34 60 34 34 60]);
    8. MATLAB = [M A T L A B];

            通过重复随机的字母列和改变间距来破坏单词。显示原始单词和三个损坏的版本。

    1. c = @(x)x(:,sort([1:6 randi(6,1,2)]));
    2. subplot(4,1,1,'XLim',[0 60])
    3. spy(MATLAB)
    4. xlabel('')
    5. ylabel('Original')
    6. for kj = 2:4
    7. subplot(4,1,kj,'XLim',[0 60])
    8. spy([c(M) c(A) c(T) c(L) c(A) c(B)])
    9. xlabel('')
    10. ylabel('Corrupted')
    11. end

            如图所示:

            生成该单词的另一个损坏版本。搜索字母“a”的噪声版本。显示搜索数组和与其最近的数据段之间的距离。因为水平轴是刚性的,所以线段溢出到“T”中。 

    1. corr = [c(M) c(A) c(T) c(L) c(A) c(B)];
    2. sgn = c(A);
    3. [ist,ind,dst] = findsignal(corr,sgn);
    4. clf
    5. subplot(2,1,1)
    6. spy(sgn)
    7. subplot(2,1,2)
    8. spy(corr)
    9. chk = zeros(size(corr));
    10. chk(:,ist:ind) = corr(:,ist:ind);
    11. hold on
    12. spy(chk,'*k')
    13. hold off

            如图所示:

    1. dst
    2. dst = 11

            允许水平轴拉伸。最近的线段是搜索数组和第一个“a”实例的交集。线段和数组之间的距离为零。 

    1. [ist,ind,dst] = findsignal(corr,sgn,'TimeAlignment','dtw');
    2. subplot(2,1,1)
    3. spy(sgn)
    4. subplot(2,1,2)
    5. spy(corr)
    6. chk = zeros(size(corr));
    7. chk(:,ist:ind) = corr(:,ist:ind);
    8. hold on
    9. spy(chk,'*k')
    10. hold off

            如图所示:

    1. dst
    2. dst = 0

            使用findsignal的内置功能重复计算。除以局部平均值以标准化数据和信号。使用对称的Kullback-Leibler度量。

    1. findsignal(corr,sgn,'TimeAlignment','dtw', ...
    2. 'Normalization','power','Metric','symmkl','Annotate','all')

            如图所示:

  • 相关阅读:
    android源码学习-android异常处理机制
    九块九进群项目源码/付费变现进群源码+搭建教程(附微擎工具)
    健康云HIS系统源码,满足基层医疗机构业务需求,提供挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生站和护士站等功能
    Webpack常见的插件和模式
    Linux友人帐之网络编程基础Samba服务器
    有关BSP驱动该如何学习的个人看法
    PHP利用phpmailer实现邮件发送功能
    GPT-4o:重塑人机交互的未来
    小米路由器AX1800降级后的SSH登录和关墙等命令
    Docker常用命令总结
  • 原文地址:https://blog.csdn.net/jk_101/article/details/126243474