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)