Advertisement
Danila_lipatov

model_fft_arma_ex

Dec 13th, 2024
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.32 KB | None | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3.  
  4. # Генерация двухсинусоидального сигнала
  5. N_signal = 1024
  6. k = np.arange(N_signal)
  7. signal = np.sin(2 * np.pi / 10 * (k - 1)) + np.sin(2 * np.pi / 100 * (k - 1))
  8.  
  9. # Добавление шума
  10. eps = 0.2 * np.random.randn(N_signal)
  11.  
  12. # Гистограмма шума
  13. plt.hist(eps, bins=20)
  14. plt.show()
  15.  
  16. # Сигнал с шумом
  17. plt.plot(k, signal + eps)
  18. plt.plot(k, signal)
  19. plt.legend()
  20. plt.title("Signal with noise")
  21. plt.show()
  22.  
  23. # Генерация ARMA процесса
  24. ar = np.zeros(N_signal)
  25. ar[0] = eps[0]
  26. ar[1] = -0.7 * ar[0] + eps[1]
  27.  
  28. for i in range(2, N_signal):
  29.     ar[i] = -0.7 * ar[i-1] + 0.2 * ar[i-2] + eps[i]
  30.  
  31. # Построение ARMA сигнала
  32. plt.plot(k, ar)
  33. plt.title("ARMA Process")
  34. plt.show()
  35.  
  36. # Построение сигнала с добавленным ARMA процессом
  37. plt.plot(k, signal + ar)
  38. plt.title("Signal with ARMA Process")
  39. plt.show()
  40.  
  41. # Быстрое преобразование Фурье (FFT)
  42. spectr = np.fft.fft(signal + ar)
  43. plt.plot(np.abs(spectr))
  44. plt.title("FFT of signal with ARMA process")
  45. plt.show()
  46.  
  47. final_signal = signal + ar
  48. # Вычисление автокорреляционной функции (ACF)
  49. signal_centered = final_signal - np.mean(final_signal)
  50. acf_biased = np.zeros(N_signal)
  51. acf_unbiased = np.zeros(N_signal)
  52.  
  53. for tau in range(1, N_signal + 1):
  54.     acf_biased[tau - 1] = np.mean(signal_centered[:N_signal - tau + 1] * signal_centered[tau - 1:N_signal])
  55.     acf_unbiased[tau - 1] = np.sum(signal_centered[:N_signal - tau + 1] * signal_centered[tau - 1:N_signal]) / (N_signal - tau + 1)
  56.  
  57. # Построение АКФ
  58. plt.figure()
  59. plt.plot(acf_biased, label="Biased ACF")
  60. plt.plot(acf_unbiased, label="Unbiased ACF", linestyle="--")
  61. plt.title("Autocorrelation Function (ACF)")
  62. plt.xlabel("Lag")
  63. plt.ylabel("Autocorrelation")
  64. plt.legend()
  65. plt.grid()
  66. plt.show()
  67.  
  68. acf = np.zeros(N_signal)
  69. acf_un = np.zeros(N_signal)
  70. # Вычисление смещенной оценки АКФ
  71. for tau in range(1, N_signal + 1):
  72.     for j in range(N_signal - tau):
  73.         acf[tau - 1] += signal_centered[j] * signal_centered[j + tau - 1]
  74.     acf[tau - 1] /= N_signal  # Скалирование на размер сигнала
  75.  
  76. for tau in range(1, N_signal + 1):
  77.     for j in range(N_signal - tau):
  78.         acf_un[tau - 1] += signal_centered[j] * signal_centered[j + tau - 1]
  79.     acf_un[tau - 1] /= (N_signal - tau + 1)  # Нормализация на оставшееся число пар
  80.  
  81. # Построение графика АКФ
  82. plt.plot(acf, label="Biased ACF", color='blue')
  83. plt.plot(acf_un, label="Unbiased ACF", linestyle="--", color='orange')
  84. plt.title("Autocorrelation Function (ACF)")
  85. plt.xlabel("Lag")
  86. plt.ylabel("Autocorrelation")
  87. plt.grid()
  88. plt.legend()
  89. plt.show()
  90.  
  91. # Спектральная плотность (FFT от ACF)
  92. n = len(acf_un)
  93. n_bias = len(acf)
  94. freqs_bias = np.fft.fftshift(np.fft.fftfreq(n_bias))  #
  95. freqs = np.fft.fftshift(np.fft.fftfreq(n))  #
  96. spectr_dens = np.fft.fft(acf)
  97. plt.plot(freqs_bias, np.abs(np.fft.fftshift(spectr_dens)))
  98. spectr_dens_un = np.fft.fft(acf_un)
  99. plt.plot(freqs, np.abs(np.fft.fftshift(spectr_dens_un)), linestyle="--", color='orange')
  100. plt.title("Spectral Density of ACF")
  101. plt.show()
  102.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement