比较两个信号的频率成分
频谱相干性有助于识别频域中信号之间的相似性。大数值表示信号共有的频率分量。
将两个声音信号加载到工作区中。以 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])
您得到的值和以前一样。您可以找到两个信号共有的频率成分,而无需分别研究这两个信号。
另请参阅
findpeaks
| mscohere
| periodogram