这段代码展示了对一个语音信号进行自相关分析的过程,并分析了不同窗长对自相关函数的影响。

首先,代码通过 audioread 函数读取了一个名为 'abc.wav' 的音频文件,并从该文件中提取了一段音频信号 s1

随后,代码利用窗函数将 s1 分割成三个不同长度的子段 b1b2b3,分别为 640、320 和 140 个采样点。

接着,代码使用循环计算每个子段的自相关函数。具体而言,代码使用 for 循环遍历不同的时间延迟 k,并利用另一个 for 循环计算每个延迟下的自相关值。自相关值的计算公式为:

R(k) = sum(b(m) * b(m + k - 1))

其中,b 表示子段信号,m 表示采样点序号。

为了便于比较,代码将每个子段的自相关函数进行了归一化,分别得到 A1B1C1

最后,代码使用 subplot 函数将三个自相关函数绘制在同一个图像中,方便进行对比分析。

代码分析:

  • 窗长 640,自相关运算取 320 个点:s1 的前 640 个点进行自相关运算,提取前 320 个点的自相关函数,并进行归一化,得到 A1。观察图像,随着时间延迟 k 的增加,自相关函数 R(k) 逐渐减小,最终趋于 0。同时,在 k = 0 附近,自相关函数 R(k) 的值最大,且为 1,表示信号与自身的相关性最强。

  • 窗长 320,自相关运算取 160 个点:s1 的前 320 个点进行自相关运算,提取前 160 个点的自相关函数,并进行归一化,得到 B1。与 A1 相比,可以发现随着窗长的减小,自相关函数的峰值变得更加尖锐,且峰值附近的波动更加明显。

  • 窗长 140,自相关运算取 70 个点:s1 的前 140 个点进行自相关运算,提取前 70 个点的自相关函数,并进行归一化,得到 C1。与 B1 相比,可以发现随着窗长的进一步减小,自相关函数的峰值变得更加尖锐,且峰值附近的波动更加明显。同时,可以发现当窗长过短时,自相关函数的性质会变得不稳定,难以准确地反映信号的特征。

结论:

通过对比不同窗长下的自相关函数,可以发现窗长对自相关函数的影响很大。较长的窗长可以获取更稳定的自相关函数,但可能无法反映信号的细节特征;较短的窗长可以反映信号的细节特征,但自相关函数的稳定性较差。因此,选择合适的窗长需要根据具体应用的需求来进行权衡。

代码:

[x,fs]=audioread('E:\语音信号分析\abc.wav');
s1=x(2500:3140);
b=s1;

% 窗长 640,自相关运算取 320 个点
b1=b(1:640);
N=320;
A=[];
for k=1:320
    sum=0;
    for m=1:N
        sum=sum+b1(m)*b1(m+k-1);
    end
    A(k)=sum;
end
for k=1:320
    A1(k)=A(k)/A(1);
end

% 画图
figure(1)
subplot(3,1,1)
plot(A1);
xlabel('延时k')
ylabel('R(k)')
legend('N=320')
axis([0,320,-0.5,1])

% 窗长 320,自相关运算取 160 个点
b2=b(1:320);
N=160;
A=[];
for k=1:160
    sum=0;
    for m=1:N
        sum=sum+b2(m)*b2(m+k-1);
    end
    B(k)=sum;
end
for k=1:160
    B1(k)=B(k)/B(1);
end

% 画图
figure(1)
subplot(3,1,2)
plot(B1);
xlabel('延时k')
ylabel('R(k)')
legend('N=160')
axis([0,320,-0.5,1])

% 窗长 140,自相关运算取 70 个点
b3=b(1:140);
N=70;
A=[];
for k=1:70
    sum=0;
    for m=1:N
        sum=sum+b3(m)*b3(m+k-1);
    end
    C(k)=sum;
end
for k=1:70
    C1(k)=C(k)/C(1);
end

% 画图
figure(1)
subplot(3,1,3)
plot(C1);
xlabel('延时k')
ylabel('R(k)')
legend('N=70')
axis([0,320,-0.5,1])

原文地址: https://www.cveoy.top/t/topic/oy8K 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录