Main Content

比较两个信号的频率成分

频谱相干性有助于识别频域中信号之间的相似性。大数值表示信号共有的频率分量。

将两个声音信号加载到工作区中。以 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])

您得到的值和以前一样。您可以找到两个信号共有的频率成分,而无需分别研究这两个信号。

另请参阅

| |

相关主题