# Spectral Coherence in Julia

**URL:** https://discourse.julialang.org/t/spectral-coherence-in-julia/106144
**Category:** Signal and Image Processing
**Tags:** dsp, signal-processing
**Created:** [November 13, 2023, 9:49am UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144 "2023-11-13T09:49:13Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)
#### Post date: [November 13, 2023, 9:49am UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/1 "2023-11-13T09:49:14Z")

</div>

Hi everyone, I am trying to do the spectral coherence between two signals in julia. Much like mscohere in Matlab.

[https://www.mathworks.com/help/signal/ug/measuring-signal-similarities.html](https://Coherence)

I guess DSP.jl must have it, but no example is provided.  
Any help? 🙂

---

<div class="post-metadata">

### Author: ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)
#### Post date: [November 13, 2023, 9:54am UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/2 "2023-11-13T09:54:07Z")

</div>

[https://www.generic-mapping-tools.org/GMTjl\_doc/gallery/ex03/](https://www.generic-mapping-tools.org/GMTjl_doc/gallery/ex03/)

---

<div class="post-metadata">

### Author: ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)
#### Post date: [November 13, 2023, 10:15am UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/3 "2023-11-13T10:15:35Z")

</div>

Hi @joa-quim, wow I did not think about GMT. I have used the coherence for gravity admittance. Do you think it will work for seismic data?

---

<div class="post-metadata">

### Author: ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)
#### Post date: [November 13, 2023, 10:21am UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/4 "2023-11-13T10:21:21Z")

</div>

Well, the code just swallows numbers so why not?

---

<div class="post-metadata">

### Author: ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)
#### Post date: [November 13, 2023, 10:23am UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/5 "2023-11-13T10:23:18Z")

</div>

In `DSP.jl`, there are [cross power spectrum](https://docs.juliadsp.org/latest/periodograms/#DSP.Periodograms.mt_cross_power_spectra) analyses.

---

<div class="post-metadata">

### Author: ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)
#### Post date: [November 13, 2023, 10:28am UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/6 "2023-11-13T10:28:28Z")

</div>

> [@rafael.guerra](#):
>
> cross power spectrum

Hi @rafael.guerra! Thanks, I tried it a bit, but I cannot get it to run, any example around?

---

<div class="post-metadata">

### Author: ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)
#### Post date: [November 13, 2023, 10:29am UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/7 "2023-11-13T10:29:04Z")

</div>

🤣  
That is a great philosophy. Let me try and report back hahaha

---

<div class="post-metadata">

### Author: ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)
#### Post date: [November 13, 2023, 10:30am UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/8 "2023-11-13T10:30:47Z")

</div>

> [@marianoarnaiz](#):
>
> Thanks, I tried it a bit, but I cannot get it to run

What have you tried? Please provide a MWE.

---

<div class="post-metadata">

### Author: ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)
#### Post date: [November 13, 2023, 10:39am UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/9 "2023-11-13T10:39:16Z")

</div>

> [@rafael.guerra](#):
>
> MWE

I tried the basic

```julia
 mt_cross_power_spectra([data[1,:] data[2,:])

```

A data matrix in:

[data](https://github.com/marianoarnaiz/JULIA/blob/main/data.txt)

---

<div class="post-metadata">

### Author: ![ericphanson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ericphanson/32/215186_2.png) [@ericphanson](https://discourse.julialang.org/u/ericphanson)
#### Post date: [November 13, 2023, 10:43am UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/10 "2023-11-13T10:43:13Z")

</div>

Check out the docs that were linked; the input should be a matrix of size `n_channels` x `n_samples`.

---

<div class="post-metadata">

### Author: ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)
#### Post date: [November 13, 2023, 10:52am UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/11 "2023-11-13T10:52:33Z")

</div>

You should write:  
`mt_cross_power_spectra(data[1:2,:])`

---

<div class="post-metadata">

### Author: ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)
#### Post date: [November 13, 2023, 11:11am UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/12 "2023-11-13T11:11:23Z")

</div>

That works great 🙂

Also,

```julia
A=[data[1,:] data[2,:]]'
B=mt_cross_power_spectra(A)

```

But how do I get the spectra from this? I found the power and the frequencies, but not the “spectrum” :s

---

<div class="post-metadata">

### Author: ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)
#### Post date: [November 13, 2023, 12:16pm UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/13 "2023-11-13T12:16:33Z")

</div>

Assuming `r` is the result above, the frequency is `r.freq` and for two input signals `x`, ` y`, the x-y off-diagonal entry of the CSD matrix is: `r.power[1,2,:]`

---

<div class="post-metadata">

### Author: ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)
#### Post date: [November 13, 2023, 12:44pm UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/14 "2023-11-13T12:44:27Z")

</div>

The r.freq is in sample units I guess. Can I pass a time vector, or sample rate so the freq are in hz?

---

<div class="post-metadata">

### Author: ![ericphanson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ericphanson/32/215186_2.png) [@ericphanson](https://discourse.julialang.org/u/ericphanson)
#### Post date: [November 13, 2023, 1:00pm UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/15 "2023-11-13T13:00:16Z")

</div>

it assumes the data is regularly sampled, but you can pass the keyword argument `fs` to set the sampling rate

---

<div class="post-metadata">

### Author: ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)
#### Post date: [November 13, 2023, 1:02pm UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/16 "2023-11-13T13:02:46Z")

</div>

HAHAH sorry for that dumb question. I found it in the doc after you said so!  
Thanks a lot! @ericphanson , @rafael.guerra and @joa-quim.

Maybe an extra question. I am testing several ways to compare these signals. I have used the cross-correlation function, the pearson coeficient and now this spectral (if I understand it measures the frequencies where 2 signals are similar). Any other ideas to do this? I have several signals and I want to classify them, if I can group them in families.

---

<div class="post-metadata">

### Author: ![ericphanson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ericphanson/32/215186_2.png) [@ericphanson](https://discourse.julialang.org/u/ericphanson)
#### Post date: [November 13, 2023, 1:09pm UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/17 "2023-11-13T13:09:52Z")

</div>

You could try dynamic time warping as a time-domain approach. The README of [GitHub - baggepinnen/DynamicAxisWarping.jl: Dynamic Time Warping (DTW) and related algorithms in Julia, at Julia speeds](https://github.com/baggepinnen/DynamicAxisWarping.jl) shows how to use that package for clustering for example.

---

<div class="post-metadata">

### Author: ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)
#### Post date: [November 13, 2023, 1:18pm UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/18 "2023-11-13T13:18:45Z")

</div>

WOW. I did not know about DAW… I see maybe example 1 is close to what I like but I need to read about this. Any paper on the matter you can recommend?

I also thought about Matrix profile, see if I can cat all the signals and find motives. Thoughs?

---

<div class="post-metadata">

### Author: ![baggepinnen](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/baggepinnen/32/693_2.png) [@baggepinnen](https://discourse.julialang.org/u/baggepinnen)
#### Post date: [November 13, 2023, 2:18pm UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/19 "2023-11-13T14:18:09Z")

</div>

Hey there 👋

I’ve contributed to both DynamicAxisWarping.jl and [MatrixProfile.jl](https://github.com/baggepinnen/MatrixProfile.jl), and similar to you, my motivation for this came from measuring distances and similarities between spectra.

I implemented several higher-level features in the package

> **[GitHub - baggepinnen/SpectralDistances.jl: Measure the distance between two...](https://github.com/baggepinnen/SpectralDistances.jl)**
>
> Measure the distance between two spectra/signals using optimal transport and related metrics - GitHub - baggepinnen/SpectralDistances.jl: Measure the distance between two spectra/signals using opti...

maybe you could find something that would fit you there. The docs and the associated paper should have quite a few examples

---

<div class="post-metadata">

### Author: ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)
#### Post date: [November 13, 2023, 7:11pm UTC](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144/20 "2023-11-13T19:11:22Z")

</div>

> [@baggepinnen](#):
>
> [GitHub - baggepinnen/SpectralDistances.jl: Measure the distance between two spectra/signals using optimal transport and related metrics](https://github.com/baggepinnen/SpectralDistances.jl)

Hi! Thanks for the input.

Just to clarify a bit, my particular problem. I have some signals like this ones (19 so far but more on the way):

 ![Screenshot 2023-11-13 at 8.05.25 PM](https://global.discourse-cdn.com/julialang/original/3X/5/f/5fbf9ca2a7396d3934e8a412b46406a845f4f3ab.jpeg)

Usually people use template matching to say “well signal 1 4 and 7 look alike and 3, 8 and 14 look allike too, so this is group and and this is group B”. I want something different to do this clasification. I was looking into MatrixProfile. What would you recommend? Maybe an example that leads me in the right direction :). Thanks in advance

[Next page](https://discourse.julialang.org/t/spectral-coherence-in-julia/106144.md?page=2)
