精华内容
下载资源
问答
  • 改进的过零检测法的matlab程序

    热门讨论 2009-07-29 14:26:55
    改进的过零检测法的matlab程序,可以克服传统过零检测法的缺点,提高精度。
  • 基于matlab语音端点检测(包括过零率,短时能量和终点检测~) 基于matlab语音端点检测(包括过零率,短时能量和终点检测~)
  • MATLAB Simulink 中的过零检测与代数环

    千次阅读 2020-12-02 21:02:57
    2 MATLAB中的过零检测 当SIMULINK仿真一个动态系统的时候,其在每一个时间步使用过零检测技术来检测系统状态变量的间断点。如果检测到不连续的点(前后两个采样点的值变化大),则找到发生不连续的精确时间点,并且...

    本次教程基于 MATLAB R2020a

    1 一般定义

    过零检测指的是在交流系统中,当波形从正半周向负半周转换时,经过零位时,系统作出的检测。可作开关电路或者频率检测。

    2 MATLAB中的过零检测

    当SIMULINK仿真一个动态系统的时候,其在每一个时间步使用过零检测技术来检测系统状态变量的间断点。如果检测到不连续的点(前后两个采样点的值变化大),则找到发生不连续的精确时间点,并且在该时间点前后增加附加的时间步(缩小采样步长)

    即:可变步长求解器可动态调整时间步大小,使其在某个变量缓慢变化时增加,在该变量迅速变化时减小。此行为使求解器在不连续点的附近执行许多小的时间步,因为该变量在此区域中迅速变化。这可以提高精确性,但可能会导致过多的仿真时间。

    作用: Simulink使用过零检测技术来精确定位不连续点,以免仿真时步长过小导致仿真时间太长,一般情况下能够提高仿真速度,但有可能使得仿真到达规定时间长度之前就停止。当采用变步长解算方法仿真时,如果遇到步长自动变得很小导致仿真时间很长或基本没有进度,可以考虑勾选开启过零检测功能。

    一句话概括: Simulink® 使用一种称为过零检测的技术来准确定位不连续性,无需借助于过小的时间步。通常这种方法可以缩短仿真运行时间,但它可能会导致某些仿真在预期完成时间之前停止。

    ——Mathworks 中国

    详细可参考:https://ww2.mathworks.cn/help/simulink/ug/zero-crossing-detection.html

    2.1 Simulink中过零检测的工作原理

    一个模块能够通过Simulink注册一些列的过零变量,每一份变量就是一个状态变量(含有不连续点)的函数。当相应的不连续发生之后,过零函数从正值或负值传递零值。每一个仿真步结束时,Simulink通过调用每一个注册了过零变量的模块来更新变量。然后Simulink检测是否有变量的符号发生改变(相对于上一仿真时间点的结果),如果有改变就说明当前时间步有不连续发生。如果检测到零点, Simulink 就会在每一个发生符号改变的变量的前一时刻值和当前值之间插入新值以评估过零点的个数,然后逐步增加内插点数目并使其值依次越过每一个过零点

    2.2 代数环

    详细请参考:https://ww2.mathworks.cn/help/simulink/ug/algebraic-loops.html

    在数字计算中,输入信号决定输出信号,同时输出信号也决定输入信号,由于数字计算的时序性,导致没有输出信号无法计算输入信号,没有输入信号又反过来无法计算输出信号,形成一个死锁(deadlock)或死循环,这就是代数环。

    在 Simulink® 模型中,当存在信号环并且信号环中只存在直接馈通模块时,将出现代数环直接馈通表示 Simulink 需要模块输入信号的值来计算当前时间步的输出。这种信号循环会在同一时间步中产生模块输出和输入的循环依存关系。这会导致一个需要在每个时间步求解的代数方程,从而增加仿真的计算成本。

    —— Mathworks 中国

    简单地说,代数环其实就是一个输入信号包含输出信号,同时输出信号也包含输入信号的特殊反馈回路。在Simulink 中,这是由于直通模块(无延时的模块)的原因造成的,Simulink 中大部分的模块都是直通模块,因此很容易形成代数环。在整个回路中,只包含直通模块就会形成代数环,反馈回路有延时模块就会消除代数环。

    示例:

    在这里插入图片描述

    上图是代数环的一个示例。Sum 模块是一个代数变量 xaxa ,该变量必须等于第一个输入 uu 减去 xaxa(例如 xa=uxaxa = u – xa)。

    此简单循环的解为xa=u/2xa = u/2

    2.3 展示过零检测实例1——双积分器单弹球系统

    在 MATLAB 命令行里输入:

    >> example_bounce_two_integrators
    

    出现如下:

    在这里插入图片描述

    点击下划线上的内容,系统打开文件如下,这是一个球在平面上弹跳的仿真:

    在这里插入图片描述

    我们可以看到:它使用两个单个积分器来计算仿真过程中球的垂直速度和位置。

    关于积分器:

    我们双击积分器出现下图

    1. 复位

      在这里可以设置外部复位为none,rising,falling,either或者level。复位就是将积分器清零,选择none,将永远不对积分器清零,rising则表示在上升沿触发时,清零积分器。

      在这里插入图片描述

    2. 积分器初始值

      积分器积分时都从一个初始值开始。可以选择内部设置初始值(internal),也可以选择外部设置。一般来说外部设置方式更为方便。

      在这里插入图片描述

    3. 积分器限幅

      在这里你可以设置你的积分器输出的上下限,使得你的积分器输出不会超过该值。

      在这里插入图片描述

    4. 饱和状态

      这个端口用以提供输出饱和信息,0表示输出没有达到饱和值,1表示输出已经达到饱和值,用该输出口从0~1的跳变可作为积分器的复位信号.

      在这里插入图片描述

    5. 使能过零检测 (Enable zero-crossing detection)

    6. 状态端口

      state port的输出与output port的输出相同,但是在复位时,state port的输出要比output port的输出要早,因此当要采用积分器的输出来进行复位时,就可以采用状态口的输出作为复位信号以避免代数环。

      在这里插入图片描述

    则我们回到原来那幅图:

    在这里插入图片描述

    • 观察系统模块构建:

      1. Velocity 积分模块初始速度为15( x0x_0

      2. 恢复系数(Coefficient of Restitution):

        恢复系数(e)是碰撞前后两物体沿接触处法线方向上的分离速度与接近速度之比,只与碰撞物体的材料有关。弹性碰撞时e=1;完全非弹性碰撞时e=0。

      3. 关于 Initial value,详情查看下面官方描述

        https://ww2.mathworks.cn/help/simulink/slref/ic.html

      4. 则我们可以推出,第一个积分器初始值为15,表示小球以15m/s的速度上抛,后面落到地面每次当距离地面为0的时候以相反的速度方向,即-0.8的恢复系数向上弹起,初始位置为距离地面十米,重力加速度的值为9.81,方向向下

    • 观察仿真结果:

      点击仿真,我们看到如下图表

      在这里插入图片描述

      仔细检查仿真的最后一部分,您将看到速度略高于零。

      将仿真 Stop time 更改为 25 秒,然后对模型进行仿真。由于 Compare To Zero 和 Position 模块连续发生过多的过零事件,仿真将停止并显示错误。

      在这里插入图片描述

      虽然可以通过调整 Model Configuration Parameters > Solver > Number of consecutive zero crossings 参数来增加此限制,但进行此更改后仍不能使仿真持续 25 秒。

      将模型配置参数的 Solver 窗格中的 Solver details > Zero-crossing options > Algorithm 参数更改为 Adaptive,并再次仿真该模型 25 秒。

    在这里插入图片描述

    放大仿真的最后 5 秒,您可以看到结果更完整,更接近弹球动态的预期解析解。您看到的震颤量是系统状态接近零时的效果,这在数值仿真的预期之内。

    在这里插入图片描述

    为何会出现上面错误?仿真器如何错过过零事件?

    小球与地面发生碰撞的时候,它的位置会发生急剧的变化。不连续常常会导致动态系统的显著变化,因此对不连续点进行精确的仿真非常重要,否则会导致仿真得到错误的系统行为。

    到了后面,小球会与地面发生震颤,如果不能合理选择过零点时间,则会检测不到零点导致仿真结果错误。

    • 弹球的仿真显示了有关不连续性的高频率波动(震颤)可能会导致仿真过早停止。

    • 如果求解器误差容限太大,求解器还可能会完全错过过零点。这可能是因为过零检测方法会检查信号值在主时间步之后是否发生变化。符号变化指示出现过零,然后过零算法将搜索精确的过零时间。但是,如果某个时间步内发生过零,但该时间步开始和结尾的值没有指示符号变化,则求解器将越过过零而不检测它。

    • 下图显示过零的信号。在第一个实例中,积分器越过该事件,因为符号在时间步之间没有变化。在第二实例中,求解器检测到符号变化,因此检测过零事件。

      在这里插入图片描述

    如何避免过多过零错误?

    1. 增加允许的过零数量

      增加 Configuration Parameters 对话框中 Solver 窗格上 Number of consecutive zero crossings 选项的值。这可能会给您的模型提供足够多的时间来解决过零情况。

    2. 放宽 Signal threshold

      在 Configuration Parameters 对话框的 Solver 窗格上,从 Algorithm 下拉列表中选择 Adaptive,并增加 Signal threshold 选项的值。求解器需要较少的时间来准确定位过零点。这可以缩短仿真时间,并消除过多的连续过零错误数。不过,放宽 Signal threshold 可能会降低精度。

    3. 使用 Adaptive 算法

      在 Configuration Parameters 对话框的 Solver 窗格上,从 Algorithm 下拉列表中选择 Adaptive。此算法会动态调整过零阈值,这可提高准确性,并减少检测到的连续过零点数。借助该算法,您可以同时指定 Time toleranceSignal threshold

    4. 对特定模块禁用过零检测

      清除模块参数对话框上的 Enable zero-crossing detection 复选框。在 Configuration Parameters 对话框的 Solver 窗格上,从 Zero-crossing control 下拉列表中选择 Use local settings

      在本地禁用过零检测可以防止特定模块由于出现过多连续过零点而停止仿真。所有其他模块将继续受益于过零检测所提供的更高准确性。

    5. 对整个模型禁用过零检测

      在 Configuration Parameters 对话框的 Solver 窗格上,从 Zero-crossing control 下拉列表中选择 Disable all。这可防止在您模型中的任意位置检测到过零点。结果是您的模型将无法再受益于过零检测所提供的更高准确性。

    6. 如果使用 ode15s 求解器,请考虑调整数值微分公式的阶次

      在 Configuration Parameters 对话框的 Solver 窗格上,从 Maximum order 下拉列表中选择一个值。有关详细信息,请参阅 Maximum order

    7. 减小最大步长大小

      在 Configuration Parameters 对话框的 Solver 窗格上,为 Max step size 选项输入一个值。求解器可以采用足够小的步长来解决过零情况。但是,减小步长大小可能会增加仿真时间,在使用自适应算法时很少有必要这么做。

    2.4 展示过零检测实例2——双弹球系统

    同理,详细可参考:https://ww2.mathworks.cn/help/simulink/slref/double-bouncing-ball-use-of-adaptive-zero-crossing-location.html

    展开全文
  • 过零检测 变步长解算方法动态地评估计算下一个采样时刻所使用的步长,当前后两个采 样点的状态值变化大时,则缩小采样步长,当前后两个采样点的值变化小时则增大步 这种做法使得解算器在计算不连续临近区域时...

    ★过零检测


           变步长解算方法动态地评估计算下一个采样时刻所使用的步长,当前后两个采
    样点的状态值变化大时,则缩小采样步长,当前后两个采样点的值变化小时则增大步
    这种做法使得解算器在计算不连续临近区域时使用较小的步长,因为不连续点
    临近区城值的变化幅度大。这种做法能保证计算的精确度,但却有可能因采样过于
    密集,步长过小而导致仿真时间太长。Simulink使用过零检测技术精确定位不连续
    点,防止仿真时间太长,一般情况下能够提高仿真速度,但有可能使得仿真到达规定
    时间长度之前就停止。

     

    展开全文
  • MATLAB进行语音信号分析,双声道合并,短时能量分析,短时过零检测MATLAB进行语音信号分析,双声道合并,短时能量分析,短时过零检测MATLAB进行语音信号分析,双声道合并,短时能量分析,短时过零检测
  • 这个程序将检测信号的第一个交叉,对于任何采样时间。有时我们的采样时间很长,我们无法在我们的数据中有精确的,所以对于那种信号数据,通过使用这个程序,我们可以找到第一个(符号变化)
  • | 检测给定波信号的向上过零| 该代码仅检测到完整振荡。 | 如果第一波或最后一波没有完全振荡(基于向上过零方法),代码将忽略它们。 | 这样做是为了防止第一波或最后一波的错误周期检测。 | 此功能是 ScientiMate...
  • 过零检测代码

    2013-05-15 21:03:56
    自定义过零检测 生产函数 测量信号之间的相位差
  • matlab开发-信号波的首次交叉检测。该程序检测到YR信号波的过零
  • 提出了一种适用于同步整流模式开关电源的过零检测电路。该电路通过将同步整流管的漏端电压信号转化成电流信号,并将该电流与偏置电流进行比较,从而确定同步整流管续流过程中电流是否为零。由于使用与整流管同类型的...
  • 由于 Compare To Zero 和 Position 模块连续发生过多的过零事件,仿真将停止并显示错误。 Simulink will stop the simulation of model 'example_bounce_two_integrators' because the 2 zero crossing signal(s) ...

    以 example_bounce_two_integrators 模型为例。它使用两个单个积分器来计算仿真过程中球的垂直速度和位置。

    通过在命令行运行 open_system('example_bounce_two_integrators') 打开模型。

    出现模块图后,将模型配置参数的 Solver 窗格中的 Solver details > Zero-crossing options > Algorithm 参数设置为 Nonadaptive。将模型的停止时间设置为 20 秒。您可以在 Simulink 工具条或模型配置参数的 Solver 窗格中更改此设置。

    对模型进行仿真。

    0cd7f1ea47e79811a661672fc07e53ac.png

    现在,您可以查看和分析仿真结果。

    1b9557e7f8d709caeec5f72a7ee07d60.png

    仔细检查仿真的最后一部分,您将看到速度略高于零。

    cc8336b0b31bf7957a45724e005924f6.png

    将仿真 Stop time 更改为 25 秒,然后对模型进行仿真。由于 Compare To Zero 和 Position 模块连续发生过多的过零事件,仿真将停止并显示错误。

    Simulink will stop the simulation of model 'example_bounce_two_integrators' because the 2 zero crossing signal(s) identified below caused 1000 consecutive zero crossing events in time interval between 20.357636989536076 and 20.357636990631594.

    --------------------------------------------------------------------------------

    Number of consecutive zero-crossings : 1000

    Zero-crossing signal name : RelopInput

    Block type : RelationalOperator

    Block path : 'example_bounce_two_integrators/Compare To Zero/Compare'

    --------------------------------------------------------------------------------

    --------------------------------------------------------------------------------

    Number of consecutive zero-crossings : 500

    Zero-crossing signal name : IntgLoLimit

    Block type : Integrator

    Block path : 'example_bounce_two_integrators/Position'

    --------------------------------------------------------------------------------

    虽然您可以通过调整 Model Configuration Parameters > Solver > Number of consecutive zero crossings 参数来增加此限制,但进行此更改后仍不能使仿真持续 25 秒。

    将模型配置参数的 Solver 窗格中的 Solver details > Zero-crossing options > Algorithm 参数更改为 Adaptive,并再次仿真该模型 25 秒。

    9f78957341800799a35ffc4dfb316d09.png

    放大仿真的最后 5 秒,您可以看到结果更完整,更接近弹球动态的预期解析解。您看到的震颤量是系统状态接近零时的效果,这在数值仿真的预期之内。

    0e8f129a1d59347ba67deaaf53a86225.png

    example_bounce 模型使用 Second-Order Integrator 模块对弹球的动态建模。从求解器性能方面来说,这是首选的球动态二重积分建模方法。要比较 example_bounce_two_integrators 和 example_bounce 的求解器性能,请尝试在两个模型上运行求解器探查工具。有关两种模型的详细比较,请参阅弹球的仿真。

    cbc8eeacdb5ae4abd917720a003a608e.png

    588249686c10d2016e62948fc20139d5.png

    79fa1aaa923b712891950f7b468def4b.png

    展开全文
  • 基于短时能量与过零率的端点检测matlab分析

    万次阅读 多人点赞 2013-05-15 21:16:38
    首先是基于短时能量和短视过零率的端点检测=〉各变换域=〉人工神经网络=〉基于倒谱距离的检测算法=〉基于谱熵的方法=〉几何门限的方法=〉sigma函数=〉近些年的从分形技术和混沌理论引入的端点检测。 作为最早的短时...

    基于语音端点检测的方法有很多,从历史的发展来看。

    首先是基于短时能量和短视过零率的端点检测=〉各变换域=〉人工神经网络=〉基于倒谱距离的检测算法=〉基于谱熵的方法=〉几何门限的方法=sigma函数=〉近些年的从分形技术和混沌理论引入的端点检测。

    作为最早的短时能量与过零率的检测方法,比较简单,当然也有很大的缺陷:在SNR比较低的情况下,准确度大打折扣,严重的话会失效。以目前而言,先研究这个简单的再说。

    1, 实现原理。

    1.1基于两个公式,即短时能量和短时过零率。


    1.2理论基础:语音信号一般可分为无声段、清音段和浊音段。无声段是背景噪声段,平均能量最低;浊音段为声带振动发出对应的语音信号段,平均能量最高;清音段是空气在口腔中的摩擦、冲击或爆破而发出的语音信号段,平均能量居于前两者之间。清音段和无声段的波形特点有明显的不同,无声段信号变化较为缓慢, 而清音段信号在幅度上变化剧烈,穿越零电平次数也多。经验表明,通常清音段过零率最大。端点检测就是首先判断/有声0还是/无声0,如果有声,则还要判断是/清音0还是/浊音0。为正确地实现端点检测,一般综合利用短时能量和过零率两个特征,采用/双门限检测法0

    1.3基本思路:根据信号设置三个阈值:能量阈值,TLTH;过零率阈值ZCR,当某帧信号大于TL或者大于ZCR时,认为信号的开始、起点,当大于TH时,则认为正式的语音信号,如果保持一段时间,则确认这信号即所需信号。

    2matlab实现

    2.1 matlab语句分析

    function [x1,x2] = vad(x)
    %幅度归一化到[-1,1]
    x = double(x);
    x = x / max(abs(x));
     
    %常数设置
    FrameLen = 240;%帧长为240点
    FrameInc = 80;%帧移为80点
     
    amp1 = 10;%初始短时能量高门限
    amp2 = 2;%初始短时能量低门限
    zcr1 = 10;%初始短时过零率高门限
    zcr2 = 5;%初始短时过零率低门限
     
    maxsilence = 8;  % 8*10ms  = 80ms
    %语音段中允许的最大静音长度,如果语音段中的静音帧数未超过此值,则认为语音还没结束;如果超过了
    %该值,则对语音段长度count进行判断,若count<minlen,则认为前面的语音段为噪音,舍弃,跳到静音
    %状态0;若count>minlen,则认为语音段结束;
    
    minlen  = 15;    % 15*10ms = 150ms
    %语音段的最短长度,若语音段长度小于此值,则认为其为一段噪音
    
    status  = 0;     %初始状态为静音状态
    count   = 0;     %初始语音段长度为0
    silence = 0;     %初始静音段长度为0
     
    %计算过零率
    tmp1  = enframe(x(1:end-1), FrameLen, FrameInc);%分帧,所得矩阵为fix((x(1:end-1)-FrameLen+FrameInc)/FrameInc)*FrameLen
    tmp2  = enframe(x(2:end)  , FrameLen, FrameInc);%分帧,所得矩阵为fix((x(2:end)-FrameLen+FrameInc)/FrameInc)*FrameLen
    signs = (tmp1.*tmp2)<0;%tmp1.*tmp2所得矩阵小于等于零的赋值为1,大于零的赋值为0
    diffs = (tmp1 -tmp2)>0.02;%tmp1-tmp2所得矩阵小于0.02的赋值为0,大于等于0.02的赋值为1
    zcr   = sum(signs.*diffs, 2);
     
    %计算短时能量
    %amp = sum(abs(enframe(filter([1 -0.9375], 1, x), FrameLen, FrameInc)), 2);
    amp = sum(abs(enframe(x, FrameLen, FrameInc)), 2);
     
    %调整能量门限
    amp1 = min(amp1, max(amp)/4);
    amp2 = min(amp2, max(amp)/8);
     
    %开始端点检测
    x1 = 0;
    x2 = 0;
    for n=1:length(zcr) %length(zcr)得到的是整个信号的帧数
       goto = 0;
       switch status
       case {0,1}                   % 0 = 静音, 1 = 可能开始
          if amp(n) > amp1          % 确信进入语音段
             x1 = max(n-count-1,1);
             status  = 2;
             silence = 0;
             count   = count + 1;
          elseif amp(n) > amp2 | ... % 可能处于语音段
                 zcr(n) > zcr2
             status = 1;
             count  = count + 1;
          else                       % 静音状态
             status  = 0;
             count   = 0;
          end
       case 2,                       % 2 = 语音段
          if amp(n) > amp2 | ...     % 保持在语音段
             zcr(n) > zcr2
             count = count + 1;
          else                       % 语音将结束
             silence = silence+1;
             if silence < maxsilence % 静音还不够长,尚未结束
                count  = count + 1;
             elseif count < minlen   % 语音长度太短,认为是噪声
                status  = 0;
                silence = 0;
                count   = 0;
             else                    % 语音结束
                status  = 3;
             end
          end
       case 3,
          break;
       end
    end  
    count = count-silence/2;
    x2 = x1 + count -1;
    subplot(311)    %subplot(3,1,1)表示将图排成3行1列,最后的一个1表示下面要画第1幅图
    plot(x)
    axis([1 length(x) -1 1])    %函数中的四个参数分别表示xmin,xmax,ymin,ymax,即轴的范围
    ylabel('Speech');
    line([x1*FrameInc x1*FrameInc], [-1 1], 'Color', 'red');
    %这里作用为用直线画出语音段的起点和终点,看起来更直观。第一个[]中的两个参数为线起止点的横坐标,
    %第二个[]中的两个参数为线起止点的纵坐标。最后两个参数设置了线的颜色。
    line([x2*FrameInc x2*FrameInc], [-1 1], 'Color', 'red');
    subplot(312)   
    plot(amp);
    axis([1 length(amp) 0 max(amp)])
    ylabel('Energy');
    line([x1 x1], [min(amp),max(amp)], 'Color', 'red');
    line([x2 x2], [min(amp),max(amp)], 'Color', 'red');
    subplot(313)
    plot(zcr);
    axis([1 length(zcr) 0 max(zcr)])
    ylabel('ZCR');
    line([x1 x1], [min(zcr),max(zcr)], 'Color', 'red');
    line([x2 x2], [min(zcr),max(zcr)], 'Color', 'red');

    2.2由语句提出的程序流程

    由上边的程序可以看出程序流程为:


    3mat lab程序中的部分解释说明

    3.1流程图的说明

    amp2,amp1为能量的两个阈值,前者为小的,后者为大的,zcr2为过零率的阈值小值,当>amp2 or >zcr2count开始加1,在此期间如果有不满足该条件的话,count立即为0,回到0状态。如果>amp1时,count1,然后进入2状态。在2状态里边,当>amp2 or >zcr2count1,如果不满足条件,则Silence+1,如果Silence即在2状态期间处于静音状态满足结束时的静音条件,则判断所有计数的信号即count的值是否满足最小的语音信号长度值,如果满足,则找到结束点,否则认为是噪声,重新开始。如果Silence即在2状态期间处于静音状态不足结束时的静音条件,则count继续加1

    3.2起点和终点的判断

    即判断X1,X2。根据程序x1=max(n-count-1,1);n为找到>amp1时,此时的贞的序列值。而count为在这之前的>amp2 or >zcr2,的贞的个数。一般突发信号从无慢慢到有,如果N=6COUNT=2,则起点从第三帧开始。很好理解。

    对于X2,有count = count-silence/2;x2 = x1 + count - 1;count值为>amp2 or >zcr2开始,到判断超过最小静音为止。而当进入silence加的时候,已经为静音阶段了。当silence=6时,便结束了,然后X2的计算方法,基本了解,但silence/2感觉可以不要也行,后边的-1也感觉可以不要。

    3.3 enframe函数的说明

    前边算能量,过零率都是基于帧来计算的,而enframe函数是用来把信号进行分帧的。

    其代码如下:

    function f=enframe(x,win,inc)%定义函数。

    nx=length(x(:)); %x(:)的作用是把x给弄成一个向量,x为一行,则变成一列,如果为矩阵,则按每一列的顺序排成一列。得出的nx为序列的数据个数。

    nwin=length(win);

    if (nwin == 1)

    len = win; %如果win中就一个数,则len=该数,此例中为256个点。即每帧长

    else

    len = nwin; %如果有多个数,则len=个数。

    end

    if (nargin < 3) % nargin返回的是函数输入的个数,如果中间有变量,返回的是负值。

    inc = len; %也就是说,如果函数enframe的输入只有两个的话,系统就自动赋inc

    end

    nf = fix((nx-len+inc)/inc);%这个比较关键,nf为分帧的组数,结合下边的可以分析这里

    各参数的意义,len为帧长,inc为未覆盖的数据,nx为整个数

    据量。假设数据为130len10,未覆盖为5,则nf=55

    组,第一组为12,……10,第二组为67,……15,依次列

    推,便可知其缘由,即(nx-len /inc + 1

    f=zeros(nf,len); %构成以组数为行,帧长为列的矩阵。

    indf= inc*(0:(nf-1)).'; %indf为一列nf个数据,即0nf-1inc倍,即分好了每幀起点。

    inds = (1:len); %构成了长度为len的一行。

    f(:) = x(indf(:,ones(1,len))+inds(ones(nf,1),:));

    %上一条语句为整个算法的核心部分了,indf(:,ones(1,len))indf

    第一列扩展了nf*len的矩阵。同理inds(ones(nf,1),:)inds第一行扩

    展为nf*len的矩阵,相加得到

    [ 1 2 3 …… len

    inc+1 inc+2 inc+3 …… inc+len

    2*inc+1………………2*inc+len

    。…………………………………]然后就按照这个矩阵从x中把数据

    给选出来,达到分帧的目的。

    if (nwin > 1) %nwin大于1的情况就不说了。

    w = win(:)';

    f = f .* w(ones(nf,1),:);

    end

    3.4过零率的计算

    其语句如下:

    tmp1 = enframe(x(1:end-1), FrameLen,inc);

    tmp2 = enframe(x(2:end) , FrameLen,inc);

    signs = (tmp1.*tmp2)<0;%对于tmp1.*tmp2算出来的矩阵,矩阵中<0的数都为1,其他

    0,后边也是一样的。

    diffs = (tmp1 - tmp2)>0.02;

    zcr = sum(signs.*diffs,2);

    假设数据量为12……21,帧长为10inc5,则

    tmp1[1 2 3 4 5 6 7 8 9 10

    6 7 8 9 10 11 12 13 14 15

    11 12 13 14 15 16 17 18 19 20]

    tmp2[2 3 4 5 6 7 8 9 10 11

    7 8 9 10 11 12 13 14 15 16

    12 13 14 15 16 17 18 19 20 21]

    在这里注意一个问题:即数组的乘法与矩阵的乘法是不一样的。数组乘法:A.*A,矩阵乘法:A*A’。前者有‘.’号,算出来的结果是在矩阵A中每一个数据平方,而后者成为另一个数组,行与列相乘然后相加作为一个值。

    在这里tmp1.*tmp2为数组相乘,第一个数乘以第二个数,第二个数乘以第三个数,依次,从而判断两者的符号,<0的为1

    然后进行相减,第一个减第二个数,第二个减第三个数……,>0.02,为什么>0.02了?首先得到的signs是真正的过零率,但得限制能量,因为对于噪音的话,也会在0点附近上下摆动,但噪声能量显然是没有语音大的,根据实际情况,所以选择>0.02,其次感觉diffs = abs((tmp1 - tmp2))>0.02;%¸就是加个绝对值,因为对于负值-正值也会满足条件,结果验证也不影响。

    3.5能量的计算

    语句为:

    amp = sum((abs(enframe( x, FrameLen, inc))).^2, 2);

    通过对enframe函数的分析,就比较容易了,enframex分帧后,绝对值然后平方,最后是sumx22代表是各列相加最后得到的是一列数据,即各帧的平方和。从中可以看出矩阵处理数据的方便性,一个矩阵就把各帧的结果给弄出来了。

    最后运行结果为图:


    注:实验过程中发现能量出计算好像有问题,应为下面两句(filter()函数可不要,所以采用下面的,上面注释掉了),特记,

    %amp = sum((abs(enframe(filter([1 -0.9375], 1, x), FrameLen, inc))).^2, 2);

    amp = sum((abs(enframe( x, FrameLen, inc))).^2, 2);

    转自:http://home.eeworld.com.cn/my/space-uid-436810-blogid-82338.html






    展开全文
  • simulink过零检测的作用

    千次阅读 2018-07-29 08:26:23
    变步长解算方法会动态地评估下一个采样时刻计算所使用的步长,当前后两个采样点的值变化大时,则缩小采样步长;反之,当前后两个采样点的值...Simulink使用过零检测技术来精确定位不连续点,以免仿真时步长小导致...
  • MATLAB计算信号的过零

    千次阅读 2020-10-28 10:13:09
    本博文分享计算过零率的公式及其MATLAB代码,代码在参考博文的基础上进行了改进。 过零(ZC)是在时域中定义信号的频率信息的一种度量。
  • 过零法测频率matlab程序

    热门讨论 2011-04-05 19:27:51
    一个利用过零法测回波频率的matlab程序,目前多普勒计程仪多用此种算法,
  • 基于MATLAB的柱塞泵斜盘安装位的检测方法研究.pdf
  • matlab实现端点检测

    万次阅读 2016-10-27 17:35:48
    端点检测 function [afterEndDet] =EndDetection(x) %================================i========================= % 端点检测 % Input:音频数据x,采样率fs % Output:经过端点检测提取的语音信号 %==========...
  • 针对检测算法国内外学者提出了许多不同的算法,传统的检测算法都是以比力模值、比力方差和角速度模值为检测量进行检测 [5] [6] [7] ,该方法对于正常行走精度较大,但是对于不同的步态,如跳跃、踏步、...
  • 过零检测

    千次阅读 2017-05-15 10:02:49
    http://blog.chinaunix.net/uid-25749806-id-2656069.html
  • 基于matlab的目标检测的基本思路

    千次阅读 2020-08-22 10:24:06
    图像处理之目标检测目标检测的基本思路遇到的问题鹿人鹰花狗总结附录 目标检测的基本思路 对于轮廓清晰的图片,可以先检测出他的轮廓,此时会有背景的轮廓也被添加进来,可以通过先填洞,再腐蚀和膨胀来消除多余的...
  • 本发明涉及车载导航与定位领域,尤其是涉及一种基于车辆检测的惯性导航误差修正方法。背景技术:惯性导航系统(inertialnavigationsystem,ins)能根据惯性传感器(陀螺仪、加速度计)提供的载体相对于惯性空间的线...
  • matlab 代码:基于能量和过零率的双门限端点检测
  • 基于matlab的人脸检测程序代码OpenCV Open CV 代表“开源计算机视觉”。 它是一个预定义的算法库,主要用于计算机视觉应用,如物体检测、人脸检测、人员/车辆计数、生物识别等。 Open CV 使新的 AI 识别系统更容易...
  • 静音检测matlab程序

    2011-05-27 10:43:52
    包含静音检测matlab程序,通过短时能量与过零率判断
  • 二摘代码MATLAB Matlab图像处理 此版本库包含针对各种图像处理技术的matlab代码,这些技术已作为校园模式识别(BITS F446)课程的一部分进行了研究。 它还包含课程中进行的两次作业的解决方案。 从头开始实现的图像...
  • MATLAB的性能检测代码Ocular_data_analysis 基于单眼视频的眼动仪的眼部事件检测。 在这里,您可以找到 MATLAB 代码来检测眼跳、注视、眨眼和瞳Kong直径时间序列的处理。 这些代码基于文献中众所周知的算法,这些...
  • matlab 边缘检测汇总1

    千次阅读 2015-10-06 16:58:27
    边缘检测matlab算法汇总 1. 基于一阶微分算子检测边缘图像 一阶微分边缘算子又称梯度边缘算子,它是利用图像在边缘处的阶跃性,及图像梯度在边缘去得极大值得特征性进行边缘检测。 Sobel算子:image =edge(in_...
  • 本发明涉及轨道列车监测领域,特别是涉及一种轨道列车速状态的监测方法。背景技术:目前,轨道列车的车速值主要是微机控制单元通过采集测速传感器的脉冲信号对应换算而成,速信号主要根据车速值和机车状态(牵引...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,636
精华内容 2,254
关键字:

matlab过零检测

matlab 订阅