语音信号自相关分析:窗长对自相关函数的影响
这段代码展示了对一个语音信号进行自相关分析的过程,并分析了不同窗长对自相关函数的影响。
首先,代码通过 audioread 函数读取了一个名为 'abc.wav' 的音频文件,并从该文件中提取了一段音频信号 s1。
随后,代码利用窗函数将 s1 分割成三个不同长度的子段 b1、b2 和 b3,分别为 640、320 和 140 个采样点。
接着,代码使用循环计算每个子段的自相关函数。具体而言,代码使用 for 循环遍历不同的时间延迟 k,并利用另一个 for 循环计算每个延迟下的自相关值。自相关值的计算公式为:
R(k) = sum(b(m) * b(m + k - 1))
其中,b 表示子段信号,m 表示采样点序号。
为了便于比较,代码将每个子段的自相关函数进行了归一化,分别得到 A1、B1 和 C1。
最后,代码使用 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 著作权归作者所有。请勿转载和采集!