Спектральная когерентность помогает идентифицировать подобие между сигналами в частотный диапазон. Большие значения указывают на частотные составляющие, общие для сигналов.
Загрузите два звуковых сигнала в рабочую область. Они отбираются с частотой дискретизации 1 кГц. Вычислите их спектры степени с помощью 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 Гц. Можно использовать mscohere
чтобы найти совпадающие частоты непосредственно. Постройте график оценки когерентности. Найдите peaks выше порога 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