<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mscneuro.neuro.uni-bremen.de/index.php?action=history&amp;feed=atom&amp;title=Instantanious_Spectral_Coherence</id>
	<title>Instantanious Spectral Coherence - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mscneuro.neuro.uni-bremen.de/index.php?action=history&amp;feed=atom&amp;title=Instantanious_Spectral_Coherence"/>
	<link rel="alternate" type="text/html" href="https://mscneuro.neuro.uni-bremen.de/index.php?title=Instantanious_Spectral_Coherence&amp;action=history"/>
	<updated>2026-09-14T05:32:04Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://mscneuro.neuro.uni-bremen.de/index.php?title=Instantanious_Spectral_Coherence&amp;diff=451&amp;oldid=prev</id>
		<title>Davrot: Created page with &quot;Questions to [mailto:davrot@uni-bremen.de David Rotermund]  == Test data == &lt;syntaxhighlight lang=&quot;python&quot;&gt;import numpy as np import matplotlib.pyplot as plt  dt: float = 1.0 / 1000.0  # I want more trials f_base: float = 50 f_delta: float = 1  rng = np.random.default_rng(1) n_t: int = 1000 n_trials: int = 1 t: np.ndarray = np.arange(0, n_t) * dt amplitude: float = 0.75  x = dt * 2.0 * np.pi * (f_base + f_delta * 2 * (rng.random((n_t, n_trials)) - 0.5)) x = np.cumsum(x,...&quot;</title>
		<link rel="alternate" type="text/html" href="https://mscneuro.neuro.uni-bremen.de/index.php?title=Instantanious_Spectral_Coherence&amp;diff=451&amp;oldid=prev"/>
		<updated>2025-10-21T09:14:21Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;Questions to [mailto:davrot@uni-bremen.de David Rotermund]  == Test data == &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;import numpy as np import matplotlib.pyplot as plt  dt: float = 1.0 / 1000.0  # I want more trials f_base: float = 50 f_delta: float = 1  rng = np.random.default_rng(1) n_t: int = 1000 n_trials: int = 1 t: np.ndarray = np.arange(0, n_t) * dt amplitude: float = 0.75  x = dt * 2.0 * np.pi * (f_base + f_delta * 2 * (rng.random((n_t, n_trials)) - 0.5)) x = np.cumsum(x,...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Questions to [mailto:davrot@uni-bremen.de David Rotermund]&lt;br /&gt;
&lt;br /&gt;
== Test data ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
dt: float = 1.0 / 1000.0&lt;br /&gt;
&lt;br /&gt;
# I want more trials&lt;br /&gt;
f_base: float = 50&lt;br /&gt;
f_delta: float = 1&lt;br /&gt;
&lt;br /&gt;
rng = np.random.default_rng(1)&lt;br /&gt;
n_t: int = 1000&lt;br /&gt;
n_trials: int = 1&lt;br /&gt;
t: np.ndarray = np.arange(0, n_t) * dt&lt;br /&gt;
amplitude: float = 0.75&lt;br /&gt;
&lt;br /&gt;
x = dt * 2.0 * np.pi * (f_base + f_delta * 2 * (rng.random((n_t, n_trials)) - 0.5))&lt;br /&gt;
x = np.cumsum(x, axis=0)&lt;br /&gt;
&lt;br /&gt;
y_a: np.ndarray = np.sin(x)&lt;br /&gt;
y_a[:400, :] = 0.0&lt;br /&gt;
y_a[-400:, :] = 0.0&lt;br /&gt;
y_a = y_a + amplitude * rng.random((n_t, n_trials))&lt;br /&gt;
&lt;br /&gt;
y_a -= y_a.mean(axis=0, keepdims=True)&lt;br /&gt;
y_a /= y_a.std(axis=0, keepdims=True)&lt;br /&gt;
&lt;br /&gt;
y = y_a[:, 0]&lt;br /&gt;
&lt;br /&gt;
np.savez(&amp;quot;testdata.npz&amp;quot;, y=y, t=t)&lt;br /&gt;
&lt;br /&gt;
plt.plot(t, y)&lt;br /&gt;
plt.xlabel(&amp;quot;Time [s]&amp;quot;)&lt;br /&gt;
plt.show()&amp;lt;/syntaxhighlight&amp;gt;[[File:17 0.png]]&amp;lt;div class=&amp;quot;figure&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;Let us look at wavelet power of the time series:&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import pywt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Calculate the wavelet scales we requested&lt;br /&gt;
def calculate_wavelet_scale(&lt;br /&gt;
    number_of_frequences: int,&lt;br /&gt;
    frequency_range_min: float,&lt;br /&gt;
    frequency_range_max: float,&lt;br /&gt;
    dt: float,&lt;br /&gt;
) -&amp;gt; np.ndarray:&lt;br /&gt;
    s_spacing: np.ndarray = (1.0 / (number_of_frequences - 1)) * np.log2(&lt;br /&gt;
        frequency_range_max / frequency_range_min&lt;br /&gt;
    )&lt;br /&gt;
    scale: np.ndarray = np.power(2, np.arange(0, number_of_frequences) * s_spacing)&lt;br /&gt;
    frequency_axis_request: np.ndarray = frequency_range_min * np.flip(scale)&lt;br /&gt;
    return 1.0 / (frequency_axis_request * dt)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def get_y_ticks(&lt;br /&gt;
    reduction_to_ticks: int, frequency_axis: np.ndarray, round: int&lt;br /&gt;
) -&amp;gt; tuple[np.ndarray, np.ndarray]:&lt;br /&gt;
    output_ticks = np.arange(&lt;br /&gt;
        0,&lt;br /&gt;
        frequency_axis.shape[0],&lt;br /&gt;
        int(np.floor(frequency_axis.shape[0] / reduction_to_ticks)),&lt;br /&gt;
    )&lt;br /&gt;
    if round &amp;lt; 0:&lt;br /&gt;
        output_freq = frequency_axis[output_ticks]&lt;br /&gt;
    else:&lt;br /&gt;
        output_freq = np.round(frequency_axis[output_ticks], round)&lt;br /&gt;
    return output_ticks, output_freq&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def get_x_ticks(&lt;br /&gt;
    reduction_to_ticks: int, dt: float, number_of_timesteps: int, round: int&lt;br /&gt;
) -&amp;gt; tuple[np.ndarray, np.ndarray]:&lt;br /&gt;
    time_axis = dt * np.arange(0, number_of_timesteps)&lt;br /&gt;
    output_ticks = np.arange(&lt;br /&gt;
        0, time_axis.shape[0], int(np.floor(time_axis.shape[0] / reduction_to_ticks))&lt;br /&gt;
    )&lt;br /&gt;
    if round &amp;lt; 0:&lt;br /&gt;
        output_time_axis = time_axis[output_ticks]&lt;br /&gt;
    else:&lt;br /&gt;
        output_time_axis = np.round(time_axis[output_ticks], round)&lt;br /&gt;
    return output_ticks, output_time_axis&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculate_cone_of_influence(dt: float, frequency_axis: np.ndarray):&lt;br /&gt;
    wave_scales = 1.0 / (frequency_axis * dt)&lt;br /&gt;
    cone_of_influence: np.ndarray = np.ceil(np.sqrt(2) * wave_scales).astype(np.int64)&lt;br /&gt;
    return cone_of_influence&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def mask_cone_of_influence(&lt;br /&gt;
    complex_spectrum: np.ndarray,&lt;br /&gt;
    cone_of_influence: np.ndarray,&lt;br /&gt;
    fill_value: float = np.NaN,&lt;br /&gt;
) -&amp;gt; np.ndarray:&lt;br /&gt;
    assert complex_spectrum.shape[0] == cone_of_influence.shape[0]&lt;br /&gt;
&lt;br /&gt;
    for frequency_id in range(0, cone_of_influence.shape[0]):&lt;br /&gt;
        # Front side&lt;br /&gt;
        start_id: int = 0&lt;br /&gt;
        end_id: int = int(&lt;br /&gt;
            np.min((cone_of_influence[frequency_id], complex_spectrum.shape[1]))&lt;br /&gt;
        )&lt;br /&gt;
        complex_spectrum[frequency_id, start_id:end_id] = fill_value&lt;br /&gt;
&lt;br /&gt;
        start_id = np.max(&lt;br /&gt;
            (&lt;br /&gt;
                complex_spectrum.shape[1] - cone_of_influence[frequency_id] - 1,&lt;br /&gt;
                0,&lt;br /&gt;
            )&lt;br /&gt;
        )&lt;br /&gt;
        end_id = complex_spectrum.shape[1]&lt;br /&gt;
        complex_spectrum[frequency_id, start_id:end_id] = fill_value&lt;br /&gt;
&lt;br /&gt;
    return complex_spectrum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
t = np.load(&amp;quot;testdata.npz&amp;quot;)[&amp;quot;t&amp;quot;]&lt;br /&gt;
y = np.load(&amp;quot;testdata.npz&amp;quot;)[&amp;quot;y&amp;quot;]&lt;br /&gt;
dt = t[1] - t[0]&lt;br /&gt;
&lt;br /&gt;
# The wavelet we want to use&lt;br /&gt;
mother = pywt.ContinuousWavelet(&amp;quot;cmor1.5-1.0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Parameters for the wavelet transform&lt;br /&gt;
number_of_frequences: int = 25  # frequency bands&lt;br /&gt;
frequency_range_min: float = 5  # Hz&lt;br /&gt;
frequency_range_max: float = 200  # Hz&lt;br /&gt;
&lt;br /&gt;
wave_scales = calculate_wavelet_scale(&lt;br /&gt;
    number_of_frequences=number_of_frequences,&lt;br /&gt;
    frequency_range_min=frequency_range_min,&lt;br /&gt;
    frequency_range_max=frequency_range_max,&lt;br /&gt;
    dt=dt,&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
complex_spectrum, frequency_axis = pywt.cwt(&lt;br /&gt;
    data=y, scales=wave_scales, wavelet=mother, sampling_period=dt&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
cone_of_influence = calculate_cone_of_influence(dt, frequency_axis)&lt;br /&gt;
&lt;br /&gt;
complex_spectrum = mask_cone_of_influence(&lt;br /&gt;
    complex_spectrum=complex_spectrum,&lt;br /&gt;
    cone_of_influence=cone_of_influence,&lt;br /&gt;
    fill_value=np.NaN,&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
plt.imshow(abs(complex_spectrum) ** 2, cmap=&amp;quot;hot&amp;quot;, aspect=&amp;quot;auto&amp;quot;)&lt;br /&gt;
plt.colorbar()&lt;br /&gt;
&lt;br /&gt;
y_ticks, y_labels = get_y_ticks(&lt;br /&gt;
    reduction_to_ticks=10, frequency_axis=frequency_axis, round=1&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
x_ticks, x_labels = get_x_ticks(&lt;br /&gt;
    reduction_to_ticks=10, dt=dt, number_of_timesteps=complex_spectrum.shape[1], round=2&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
plt.yticks(y_ticks, y_labels)&lt;br /&gt;
plt.xticks(x_ticks, x_labels)&lt;br /&gt;
&lt;br /&gt;
plt.xlabel(&amp;quot;Time [sec]&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;Frequency [Hz]&amp;quot;)&lt;br /&gt;
plt.show()&amp;lt;/syntaxhighlight&amp;gt;[[File:17 1.png]]&amp;lt;div class=&amp;quot;figure&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instantanious Spectral Coherence ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import pywt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Calculate the wavelet scales we requested&lt;br /&gt;
def calculate_wavelet_scale(&lt;br /&gt;
    number_of_frequences: int,&lt;br /&gt;
    frequency_range_min: float,&lt;br /&gt;
    frequency_range_max: float,&lt;br /&gt;
    dt: float,&lt;br /&gt;
) -&amp;gt; np.ndarray:&lt;br /&gt;
    s_spacing: np.ndarray = (1.0 / (number_of_frequences - 1)) * np.log2(&lt;br /&gt;
        frequency_range_max / frequency_range_min&lt;br /&gt;
    )&lt;br /&gt;
    scale: np.ndarray = np.power(2, np.arange(0, number_of_frequences) * s_spacing)&lt;br /&gt;
    frequency_axis_request: np.ndarray = frequency_range_min * np.flip(scale)&lt;br /&gt;
    return 1.0 / (frequency_axis_request * dt)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def get_y_ticks(&lt;br /&gt;
    reduction_to_ticks: int, frequency_axis: np.ndarray, round: int&lt;br /&gt;
) -&amp;gt; tuple[np.ndarray, np.ndarray]:&lt;br /&gt;
    output_ticks = np.arange(&lt;br /&gt;
        0,&lt;br /&gt;
        frequency_axis.shape[0],&lt;br /&gt;
        int(np.floor(frequency_axis.shape[0] / reduction_to_ticks)),&lt;br /&gt;
    )&lt;br /&gt;
    if round &amp;lt; 0:&lt;br /&gt;
        output_freq = frequency_axis[output_ticks]&lt;br /&gt;
    else:&lt;br /&gt;
        output_freq = np.round(frequency_axis[output_ticks], round)&lt;br /&gt;
    return output_ticks, output_freq&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def get_x_ticks(&lt;br /&gt;
    reduction_to_ticks: int, dt: float, number_of_timesteps: int, round: int&lt;br /&gt;
) -&amp;gt; tuple[np.ndarray, np.ndarray]:&lt;br /&gt;
    time_axis = dt * np.arange(0, number_of_timesteps)&lt;br /&gt;
    output_ticks = np.arange(&lt;br /&gt;
        0, time_axis.shape[0], int(np.floor(time_axis.shape[0] / reduction_to_ticks))&lt;br /&gt;
    )&lt;br /&gt;
    if round &amp;lt; 0:&lt;br /&gt;
        output_time_axis = time_axis[output_ticks]&lt;br /&gt;
    else:&lt;br /&gt;
        output_time_axis = np.round(time_axis[output_ticks], round)&lt;br /&gt;
    return output_ticks, output_time_axis&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculate_cone_of_influence(dt: float, frequency_axis: np.ndarray):&lt;br /&gt;
    wave_scales = 1.0 / (frequency_axis * dt)&lt;br /&gt;
    cone_of_influence: np.ndarray = np.ceil(np.sqrt(2) * wave_scales).astype(np.int64)&lt;br /&gt;
    return cone_of_influence&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def mask_cone_of_influence(&lt;br /&gt;
    complex_spectrum: np.ndarray,&lt;br /&gt;
    cone_of_influence: np.ndarray,&lt;br /&gt;
    fill_value: float = np.NaN,&lt;br /&gt;
) -&amp;gt; np.ndarray:&lt;br /&gt;
    assert complex_spectrum.shape[0] == cone_of_influence.shape[0]&lt;br /&gt;
&lt;br /&gt;
    for frequency_id in range(0, cone_of_influence.shape[0]):&lt;br /&gt;
        # Front side&lt;br /&gt;
        start_id: int = 0&lt;br /&gt;
        end_id: int = int(&lt;br /&gt;
            np.min((cone_of_influence[frequency_id], complex_spectrum.shape[1]))&lt;br /&gt;
        )&lt;br /&gt;
        complex_spectrum[frequency_id, start_id:end_id] = fill_value&lt;br /&gt;
&lt;br /&gt;
        start_id = np.max(&lt;br /&gt;
            (&lt;br /&gt;
                complex_spectrum.shape[1] - cone_of_influence[frequency_id] - 1,&lt;br /&gt;
                0,&lt;br /&gt;
            )&lt;br /&gt;
        )&lt;br /&gt;
        end_id = complex_spectrum.shape[1]&lt;br /&gt;
        complex_spectrum[frequency_id, start_id:end_id] = fill_value&lt;br /&gt;
&lt;br /&gt;
    return complex_spectrum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculate_wavelet_tf_complex_coeffs(&lt;br /&gt;
    data: np.ndarray,&lt;br /&gt;
    number_of_frequences: int = 25,&lt;br /&gt;
    frequency_range_min: float = 15,&lt;br /&gt;
    frequency_range_max: float = 200,&lt;br /&gt;
    dt: float = 1.0 / 1000,&lt;br /&gt;
) -&amp;gt; tuple[np.ndarray, np.ndarray, np.ndarray]:&lt;br /&gt;
&lt;br /&gt;
    assert data.ndim == 1&lt;br /&gt;
    t: np.ndarray = np.arange(0, data.shape[0]) * dt&lt;br /&gt;
&lt;br /&gt;
    # The wavelet we want to use&lt;br /&gt;
    mother = pywt.ContinuousWavelet(&amp;quot;cmor1.5-1.0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    wave_scales = calculate_wavelet_scale(&lt;br /&gt;
        number_of_frequences=number_of_frequences,&lt;br /&gt;
        frequency_range_min=frequency_range_min,&lt;br /&gt;
        frequency_range_max=frequency_range_max,&lt;br /&gt;
        dt=dt,&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    complex_spectrum, frequency_axis = pywt.cwt(&lt;br /&gt;
        data=data, scales=wave_scales, wavelet=mother, sampling_period=dt&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    return (complex_spectrum, frequency_axis, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculate_spectral_coherence(&lt;br /&gt;
    n_trials: int,&lt;br /&gt;
    y_a: np.ndarray,&lt;br /&gt;
    y_b: np.ndarray,&lt;br /&gt;
    number_of_frequences: int,&lt;br /&gt;
    frequency_range_min: float,&lt;br /&gt;
    frequency_range_max: float,&lt;br /&gt;
    dt: float,&lt;br /&gt;
) -&amp;gt; tuple[np.ndarray, np.ndarray, np.ndarray]:&lt;br /&gt;
&lt;br /&gt;
    for trial_id in range(0, n_trials):&lt;br /&gt;
        wave_data_a, frequency_axis, t = calculate_wavelet_tf_complex_coeffs(&lt;br /&gt;
            data=y_a[..., trial_id],&lt;br /&gt;
            number_of_frequences=number_of_frequences,&lt;br /&gt;
            frequency_range_min=frequency_range_min,&lt;br /&gt;
            frequency_range_max=frequency_range_max,&lt;br /&gt;
            dt=dt,&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        wave_data_b, frequency_axis, t = calculate_wavelet_tf_complex_coeffs(&lt;br /&gt;
            data=y_b[..., trial_id],&lt;br /&gt;
            number_of_frequences=number_of_frequences,&lt;br /&gt;
            frequency_range_min=frequency_range_min,&lt;br /&gt;
            frequency_range_max=frequency_range_max,&lt;br /&gt;
            dt=dt,&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        cone_of_influence = calculate_cone_of_influence(dt, frequency_axis)&lt;br /&gt;
&lt;br /&gt;
        wave_data_a = mask_cone_of_influence(&lt;br /&gt;
            complex_spectrum=wave_data_a,&lt;br /&gt;
            cone_of_influence=cone_of_influence,&lt;br /&gt;
            fill_value=np.NaN,&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        wave_data_b = mask_cone_of_influence(&lt;br /&gt;
            complex_spectrum=wave_data_b,&lt;br /&gt;
            cone_of_influence=cone_of_influence,&lt;br /&gt;
            fill_value=np.NaN,&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        if trial_id == 0:&lt;br /&gt;
            calculation = wave_data_a * np.conj(wave_data_b)&lt;br /&gt;
            norm_data_a = np.abs(wave_data_a) ** 2&lt;br /&gt;
            norm_data_b = np.abs(wave_data_b) ** 2&lt;br /&gt;
&lt;br /&gt;
        else:&lt;br /&gt;
            calculation += wave_data_a * np.conj(wave_data_b)&lt;br /&gt;
            norm_data_a += np.abs(wave_data_a) ** 2&lt;br /&gt;
            norm_data_b += np.abs(wave_data_b) ** 2&lt;br /&gt;
&lt;br /&gt;
    calculation /= float(n_trials)&lt;br /&gt;
    norm_data_a /= float(n_trials)&lt;br /&gt;
    norm_data_b /= float(n_trials)&lt;br /&gt;
&lt;br /&gt;
    coherence = np.abs(calculation) ** 2 / ((norm_data_a * norm_data_b) + 1e-20)&lt;br /&gt;
&lt;br /&gt;
    return np.nanmean(coherence, axis=-1), frequency_axis, t&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Parameters for the wavelet transform&lt;br /&gt;
number_of_frequences: int = 25  # frequency bands&lt;br /&gt;
frequency_range_min: float = 5  # Hz&lt;br /&gt;
frequency_range_max: float = 200  # Hz&lt;br /&gt;
dt: float = 1.0 / 1000.0&lt;br /&gt;
&lt;br /&gt;
# I want more trials&lt;br /&gt;
f_base: float = 50&lt;br /&gt;
f_delta: float = 1&lt;br /&gt;
&lt;br /&gt;
delay_enable: bool = False&lt;br /&gt;
&lt;br /&gt;
# Test data -&amp;gt;&lt;br /&gt;
rng = np.random.default_rng(1)&lt;br /&gt;
n_t: int = 1000&lt;br /&gt;
n_trials: int = 100&lt;br /&gt;
t: np.ndarray = np.arange(0, n_t) * dt&lt;br /&gt;
&lt;br /&gt;
amplitude: float = 0.75&lt;br /&gt;
&lt;br /&gt;
x = dt * 2.0 * np.pi * (f_base + f_delta * 2 * (rng.random((n_t, n_trials)) - 0.5))&lt;br /&gt;
x = np.cumsum(x, axis=0)&lt;br /&gt;
&lt;br /&gt;
y_a: np.ndarray = np.sin(x)&lt;br /&gt;
y_a[:400, :] = 0.0&lt;br /&gt;
y_a[-400:, :] = 0.0&lt;br /&gt;
y_a = y_a + amplitude * rng.random((n_t, n_trials))&lt;br /&gt;
&lt;br /&gt;
y_a -= y_a.mean(axis=0, keepdims=True)&lt;br /&gt;
y_a /= y_a.std(axis=0, keepdims=True)&lt;br /&gt;
# &amp;lt;- Test data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if delay_enable:&lt;br /&gt;
    y_b: np.ndarray = np.roll(y_a, shift=250, axis=0)&lt;br /&gt;
else:&lt;br /&gt;
    y_b = y_a.copy()&lt;br /&gt;
&lt;br /&gt;
coherence, frequency_axis, t = calculate_spectral_coherence(&lt;br /&gt;
    n_trials=n_trials,&lt;br /&gt;
    y_a=y_a,&lt;br /&gt;
    y_b=y_b,&lt;br /&gt;
    number_of_frequences=number_of_frequences,&lt;br /&gt;
    frequency_range_min=frequency_range_min,&lt;br /&gt;
    frequency_range_max=frequency_range_max,&lt;br /&gt;
    dt=dt,&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(frequency_axis, coherence)&lt;br /&gt;
plt.ylabel(&amp;quot;Spectral Coherence&amp;quot;)&lt;br /&gt;
plt.xlabel(&amp;quot;Frequency [Hz]&amp;quot;)&lt;br /&gt;
plt.show()&amp;lt;/syntaxhighlight&amp;gt;With delay_enable = False:&lt;br /&gt;
&lt;br /&gt;
[[File:17 2.png]]&amp;lt;div class=&amp;quot;figure&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;With delay_enable = True:&lt;br /&gt;
&lt;br /&gt;
[[File:17 3.png]]&amp;lt;div class=&amp;quot;figure&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davrot</name></author>
	</entry>
</feed>