频谱相干性有助于识别频域中信号之间的相似性。大数值表示信号共有的频率分量。
????????将两个声音信号加载到工作区中。以 1 kHz 的频率对其进行采样。使用 periodogram 计算其功率频谱,并以彼此相邻的方式对其绘图。
load relatedsig
Fs = FsSig;
[P1,f1] = periodogram(sig1,[],[],Fs,'power');
[P2,f2] = periodogram(sig2,[],[],Fs,'power');
subplot(2,1,1)
plot(f1,P1,'k')
grid
ylabel('P_1')
title('Power Spectrum')
subplot(2,1,2)
plot(f2,P2,'r')
grid
ylabel('P_2')
xlabel('Frequency (Hz)')
如图所示:
????????每个信号有三个具有显著能量的频率分量。其中有两个分量似乎是共享分量。使用 findpeaks 求出对应的频率。
[pk1,lc1] = findpeaks(P1,'SortStr','descend','NPeaks',3);
P1peakFreqs = f1(lc1)
P1peakFreqs = 3×1
165.0391
35.1562
94.7266
[pk2,lc2] = findpeaks(P2,'SortStr','descend','NPeaks',3);
P2peakFreqs = f2(lc2)
P2peakFreqs = 3×1
165.0391
35.1562
134.7656
????????公共分量位于大约 165 和 35 Hz 处。可以使用 mscohere 直接求出匹配的频率。对相干性估计绘图。找到阈值 0.75 以上的波峰。
[Cxy,f] = mscohere(sig1,sig2,[],[],[],Fs);
thresh = 0.75;
[pks,locs] = findpeaks(Cxy,'MinPeakHeight',thresh);
MatchingFreqs = f(locs)
MatchingFreqs = 2×1
35.1562
164.0625
figure
plot(f,Cxy)
ax = gca;
grid
xlabel('Frequency (Hz)')
title('Coherence Estimate')
ax.XTick = MatchingFreqs;
ax.YTick = thresh;
axis([0 200 0 1])
如图所示:
????????得到的值和以前一样。可以找到两个信号共有的频率成分,而无需分别研究这两个信号。