短时平均幅度差函数AMDF (Average Magnitude Difference Function)

  • 与自相关函数的对比

自相关函数的计算方法是求乘积,由于乘法运算所需要的时间较长,将会造成函数运算量很大的结果,而利用快速傅里叶变换(FFT)等简化的计算方法也无法避免乘法运算。为了规避乘法运算,我们可以采用差值的方法。所以采用了与自相关函数具有类似作用的参量,就是短时平均幅度差函数(AMDF)。

  • 计算方法

平均幅度差函数的事实基础:如果信号是完全的周期信号(设周期为Np),那么相距为周期的整数倍的样点上的幅值是相等的,即差值为0。用公式表示如下:

对于实际的语音信号,d(n)可能不为0(实际的语音信号不会有精准的周期性),但它的值很小。这些极小值将出现在整数倍周期的位置上,即每一个对应的峰值的位置上。故定义短时平均幅度差函数:

对于周期性的语音信号x(n),它的短时平均幅度差函数Fn(k)也呈周期性。

  • 与自相关函数的关系

自相关函数的计算方法:

K为最大的延迟点数。

故比较两个公式,可以看出Rn(k)与Fn(k)之间存在的数学关系为:

可以证明平均幅度差函数和自相关函数有密切的关系。但与自相关函数Rn(k)相反的是,在Rn(k)的谷点时,对应Fn(k)是峰值。

  • 示例

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,我可以给出一些解释和示例代码。 首先,MATLAB中的音频帧长是指对音频信号进行分帧处理时,每个帧的采样点数。通常情况下,帧长的选择与所需分析的频率范围有关,较短的帧长适合分析高频部分,而较长的帧长适合分析低频部分。一般而言,帧长的选择应该是一个经验性的过程,需要根据具体应用场景进行选择。 下面给出一个示例代码,用于计算并显示指定语音文件的语音帧的AMDF(自相关函数): ```matlab % 读取语音文件 [x,Fs] = audioread('speech.wav'); % 设置帧长和帧移 frameLen = 256; frameShift = 128; % 计算帧数 nFrames = floor((length(x)-frameLen)/frameShift)+1; % 初始化AMDF矩阵 amdf = zeros(nFrames,frameLen); % 计算AMDF for i = 1:nFrames % 取出当前帧 frame = x((i-1)*frameShift+1:(i-1)*frameShift+frameLen); % 计算当前帧的AMDF for j = 1:frameLen amdf(i,j) = sum(abs(frame(j+1:frameLen)-frame(1:frameLen-j))); end end % 显示AMDF图像 imagesc(amdf'); xlabel('Frame'); ylabel('Lag'); ``` 上述代码中,`audioread`函数用于读取指定的语音文件,`frameLen`和`frameShift`参数分别设置帧长和帧移,`nFrames`变量计算语音信号的帧数,`amdf`矩阵用于存储计算的AMDF值。然后,使用两层循环计算每个帧的AMDF值,并将结果存储在`amdf`矩阵中。最后,使用`imagesc`函数AMDF图像显示出来,横轴表示帧序号,纵轴表示自相关函数的滞后值。 希望这个示例代码可以帮助您理解MATLAB中音频处理的相关操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值