Example nonstationarity

  1import sys, os
  2
  3my_path = os.path.dirname(os.path.abspath(__file__))
  4sys.path.insert(0, my_path + '/../')
  5
  6import numpy as np
  7from scipy import stats
  8from scipy import signal
  9import matplotlib.pyplot as plt
 10import pyExSi as es
 11
 12
 13N = 2 ** 16  # number of data points of time signal
 14fs = 1024  # sampling frequency [Hz]
 15t = np.arange(0, N) / fs  # time vector
 16
 17# define frequency vector and one-sided flat-shaped PSD
 18M = N // 2 + 1  # number of data points of frequency vector
 19freq = np.arange(0, M, 1) * fs / N  # frequency vector
 20freq_lower = 50  # PSD lower frequency limit  [Hz]
 21freq_upper = 100  # PSD upper frequency limit [Hz]
 22PSD = es.get_psd(freq, freq_lower, freq_upper)  # one-sided flat-shaped PSD
 23plt.plot(freq, PSD)
 24plt.xlabel('Frequency [Hz]')
 25plt.ylabel('PSD [Unit**2/Hz]')
 26plt.xlim(0, 200)
 27plt.show()
 28
 29
 30# Random Generator seed
 31seed = 1234
 32rg = np.random.default_rng(seed)
 33
 34# get gaussian stationary signal
 35gaussian_signal = es.random_gaussian(N, PSD, fs, rg=rg)
 36# calculate kurtosis
 37k_u_stationary = es.get_kurtosis(gaussian_signal)
 38
 39# get non-gaussian stationary signal, with kurtosis k_u=10
 40k_u_target = 10
 41rg = np.random.default_rng(seed)
 42nongaussian_signal = es.stationary_nongaussian_signal(N, PSD, fs, k_u=k_u_target, rg=rg)
 43# calculate kurtosis
 44k_u_stationary_nongaussian = es.get_kurtosis(nongaussian_signal)
 45
 46# get non-gaussian non-stationary signal, with kurtosis k_u=10
 47# a) amplitude modulation, modulating signal defined by PSD
 48PSD_modulating = es.get_psd(freq, freq_lower=1, freq_upper=10)
 49plt.plot(freq, PSD, label='PSD, carrier signal')
 50plt.plot(freq, PSD_modulating, label='PSD, modulating signal')
 51plt.xlabel('Frequency [Hz]')
 52plt.ylabel('PSD [Unit**2/Hz]')
 53plt.xlim(0, 200)
 54plt.legend()
 55plt.show()
 56# define array of parameters delta_m and p
 57delta_m_list = np.arange(0.1, 2.1, 0.5)
 58p_list = np.arange(0.1, 2.1, 0.5)
 59# get signal
 60nongaussian_nonstationary_signal_psd = es.nonstationary_signal(
 61    N,
 62    PSD,
 63    fs,
 64    k_u=k_u_target,
 65    modulating_signal=('PSD', PSD_modulating),
 66    param1_list=delta_m_list,
 67    param2_list=p_list,
 68    seed=seed,
 69)
 70# calculate kurtosis
 71k_u_nonstationary_nongaussian_psd = es.get_kurtosis(
 72    nongaussian_nonstationary_signal_psd
 73)
 74
 75# b) amplitude modulation, modulating signal defined by cubis spline intepolation. Points are based on beta distribution
 76# Points are separated by delta_n = 2**8 samples (at fs=2**10)
 77delta_n = 2 ** 10
 78# define array of parameters alpha and beta
 79alpha_list = np.arange(1, 10, 1)
 80beta_list = np.arange(1, 10, 1)
 81# get signal
 82nongaussian_nonstationary_signal_beta = es.nonstationary_signal(
 83    N,
 84    PSD,
 85    fs,
 86    k_u=k_u_target,
 87    modulating_signal=('CSI', delta_n),
 88    param1_list=alpha_list,
 89    param2_list=beta_list,
 90    seed=seed,
 91)
 92# calculate kurtosis
 93k_u_nonstationary_nongaussian_beta = es.get_kurtosis(
 94    nongaussian_nonstationary_signal_beta
 95)
 96
 97# Plot
 98plt.plot(gaussian_signal[:200], label='Gaussian')
 99plt.plot(nongaussian_signal[:200], label='non-Gaussian stationary')
100plt.plot(
101    nongaussian_nonstationary_signal_psd[:200],
102    label='non-Gaussian non-stationary (PSD)',
103)
104plt.plot(
105    nongaussian_nonstationary_signal_beta[:200],
106    label='non-Gaussian non-stationary (CSI)',
107)
108plt.xlabel('Sample [n]')
109plt.ylabel('Signal [Unit]')
110plt.legend()
111plt.show()
112
113print(f'kurtosis of stationary Gaussian signal:{k_u_stationary:.3f}')
114print(f'Desired kurtosis of non-Gaussian signals:{k_u_target:.3f}')
115print(f'kurtosis of stationary non-Gaussian signal:{k_u_stationary_nongaussian:.3f}')
116print(
117    f'kurtosis of non-stationary non-Gaussian signal (psd):{k_u_nonstationary_nongaussian_psd:.3f}'
118)
119print(
120    f'kurtosis of non-stationary non-Gaussian signal (beta):{k_u_nonstationary_nongaussian_beta:.3f}'
121)