Advertisement
Guest User

Untitled

a guest
Apr 6th, 2020
392
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.28 KB | None | 0 0
  1. import math
  2. from threading import Thread
  3.  
  4. import soundfile
  5.  
  6.  
  7. def level_cross(levels, a, b):
  8.     a_level = 0
  9.     b_level = 0
  10.     if a > b:
  11.         a, b = b, a
  12.     for i in range(len(levels)):
  13.         if a < levels[i]:
  14.             a_level = i
  15.             break
  16.     for i in range(len(levels)):
  17.         if b < levels[i]:
  18.             b_level = i
  19.             break
  20.     return range(a_level, b_level)
  21.  
  22. path = 'sig0003.wav'
  23. data, rate = soundfile.read(path)
  24.  
  25. N = 32
  26.  
  27. # нахождение минимального и максимального u, подсчёт дельты
  28. umax = max(data)
  29. umin = min(data)
  30. deltaU = (umax - umin) / N
  31.  
  32. # вычисление напряжения эл. сигнала на уровнях
  33. u_levels = [(i - N / 2) * deltaU for i in range(N)]
  34.  
  35. # просто нулевые значения, чтобы потом посчитать
  36. S = 0
  37. _N = [0 for i in range(N)]
  38.  
  39. # подсчет количества пересечений сигналом для каждого уровня (если пересекает) в j-ый интервал времени
  40. for j in range(1, len(data)):
  41.     increase_list = level_cross(u_levels, data[j - 1],
  42.                                 data[j])  # метод, которые подсчитывает пересечения, реализация выше
  43.     if increase_list:
  44.         for index in increase_list:
  45.             _N[index] += 1
  46.  
  47. # количество пересечений всех уровней - S
  48. for value in _N:
  49.     S += value
  50.  
  51. # вероятности пересечения каждого уровня
  52. p = [_N[i] / S for i in range(N)]
  53.  
  54. # среднее напряжение
  55. u_avg = 0
  56. for i in range(N):
  57.     u_avg += u_levels[i] * p[i]
  58.  
  59. # среднеквадратическое значение напряжения
  60. sigma = 0
  61. for i in range(N):
  62.     sigma += (u_levels[i] - u_avg) * (u_levels[i] - u_avg) * p[i]
  63. sigma = math.sqrt(sigma)
  64.  
  65. # энтропия закона распределения мгновенных значений напряжений
  66. H = 0
  67. for i in range(N):
  68.     if p[i] != 0:
  69.         H -= p[i] * math.log(p[i])
  70.  
  71. # энтропийный коэффициент качества мгновенных значений напряжений
  72. nu_M = math.exp(H) / math.sqrt(2 * math.pi * sigma * sigma)
  73.  
  74. print(f'nu_M = {nu_M}')
  75.  
  76. y = [0 for value in data]
  77.  
  78. file = open(path + '.u', 'w')
  79. file.write(str(len(data)) + '\n')
  80. for value in data:
  81.     file.write(str(value) + '\n')
  82. file.close()
  83.  
  84. print('continue?')
  85. input()
  86.  
  87. file = open(path + '.u.y', 'r')
  88. for i in range(len(data)):
  89.     y[i] = float(file.readline())
  90. file.close()
  91.  
  92. # подсчёт уровня напряжения огибающей электрического сигнала
  93. U = [math.sqrt(data[j] * data[j] + y[j] * y[j]) for j in range(len(data))]
  94.  
  95. Umax = max(U)
  96. Umin = min(U)
  97.  
  98. N0 = int((Umax - Umin) / deltaU)
  99.  
  100. # вычисление напряжения огибающей эл. сигнала на уровнях
  101. U_levels = [(i - N0 / 2) * deltaU for i in range(N0)]
  102. # U_levels = [Umin + i * deltaU for i in range(N0)]
  103.  
  104. S0 = 0
  105. _N0 = [0 for i in range(len(U_levels))]
  106.  
  107. # подсчет количества пересечений огибающей сигнала для каждого уровня (если пересекает) в j-ый интервал времени
  108. for j in range(1, len(U)):
  109.     increase_list = level_cross(U_levels, U[j - 1], U[j])
  110.     if increase_list:
  111.         for index in increase_list:
  112.             _N0[index] += 1
  113.  
  114. # количество пересечений огибающей всех уровней - S
  115. for value in _N0:
  116.     S0 += value
  117.  
  118. # вероятности пересечения огибающей каждого уровня
  119. p0 = [_N0[i] / S0 for i in range(len(U_levels))]
  120.  
  121. sigma0_sqr = 0
  122. for i in range(N0):
  123.     sigma0_sqr += U_levels[i] * U_levels[i] * p0[i]
  124.  
  125. m = 0
  126. for i in range(N0):
  127.     if U_levels[i] > 0:
  128.         m += p0[i] * math.log(U_levels[i])
  129.  
  130. H0 = 0
  131. for i in range(N0):
  132.     if p0[i] != 0:
  133.         H0 -= p0[i] * math.log(p0[i])
  134.  
  135. c = 0.577
  136. r = math.sqrt(2) * math.exp(1 + m + (c - sigma0_sqr) / 2)
  137.  
  138. Hp = -m + 2 * math.log(r) + sigma0_sqr / (2 * r * r)
  139.  
  140. nu0 = math.exp(H0 - Hp)
  141.  
  142. nu_result = nu_M * nu0
  143.  
  144. print(nu_result)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement