Advertisement
paster442

Untitled

Sep 2nd, 2021
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.01 KB | None | 0 0
  1. from math import sqrt
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. from os import listdir, chdir
  5. from os.path import isfile, join
  6. from pydub import AudioSegment
  7. from scipy import polyval, polyfit
  8. from scipy.fft import *
  9. from scipy.io import wavfile
  10. from termcolor import colored
  11.  
  12.  
  13. path = "C:\\Users\\HP\\Downloads\\TMF\\TMF-audio\\Experiment #1\\cutted\\"
  14. chdir(path) #go to directory
  15.  
  16.  
  17. def amplitude(file, path):
  18.  
  19. chdir(path) #.wav files only
  20. sound = AudioSegment.from_mp3(path + file)
  21. loudness = sound.dBFS
  22. return loudness
  23.  
  24. '''sound = AudioSegment.from_mp3(path + file)
  25.  
  26. normalized_sound = sound.apply_gain(-sound.max_dBFS)
  27. return normalized_sound'''
  28.  
  29. #return AudioSegment.from_wav(path + file).max
  30. #print("10cm1.wav".dBFS)
  31.  
  32.  
  33. def duration(file, path):
  34. chdir(path)
  35. return AudioSegment.from_wav(path + file).duration_seconds * 1000 #in milliseconds
  36.  
  37.  
  38. #https://stackoverflow.com/a/66892766
  39. def freq(file, path):
  40. chdir(path)
  41. start_time = 0
  42. end_time = duration(file, path)
  43.  
  44. sr, data = wavfile.read(file, path)
  45. if data.ndim > 1:
  46. data = data[:, 0]
  47. else:
  48. pass
  49.  
  50. dataToRead = data[int(start_time * sr / 1000) : int(end_time * sr / 1000) + 1]
  51.  
  52. N = len(dataToRead)
  53. yf = rfft(dataToRead)
  54. xf = rfftfreq(N, 1 / sr)
  55.  
  56. idx = np.argmax(np.abs(yf))
  57. freq = xf[idx]
  58.  
  59. return round(freq, 1)
  60.  
  61.  
  62. my_audio = list(f for f in listdir(path) if isfile(join(path, f))) #get files in folder
  63.  
  64. for _ in range(10):
  65. my_audio.append(my_audio.pop(0))
  66.  
  67. f, f2 = open("ampl.txt", "r+"), open("freq.txt", "r+")
  68. f.truncate(0); f2.truncate(0) #clear files
  69.  
  70. counter = 1
  71. for audio in my_audio:
  72. try:
  73. if audio[2] in "1234567890":
  74. if counter != 90:
  75. f.write(audio[0:3] + " " + str(amplitude(audio, path)) + "\n")
  76. #f.write(audio[0:3] + " " + str(10**(amplitude(audio, path) / 10)) + "\n")
  77. f2.write(audio[0:3] + " " + str(freq(audio, path)) + "\n")
  78. else:
  79. f.write(audio[0:3] + " " + str(amplitude(audio, path)))
  80. #f.write(audio[0:3] + " " + str(10**(amplitude(audio, path) / 10)))
  81. f2.write(audio[0:3] + " " + str(freq(audio, path)))
  82. else:
  83. if counter != 90:
  84. f.write(audio[0:2] + " " + str(amplitude(audio, path)) + "\n")
  85. #f.write(audio[0:2] + " " + str(10**(amplitude(audio, path) / 10)) + "\n")
  86. f2.write(audio[0:2] + " " + str(freq(audio, path)) + "\n")
  87. else:
  88. f.write(audio[0:2] + " " + str(amplitude(audio, path)))
  89. #f.write(audio[0:2] + " " + str(10**(amplitude(audio, path) / 10)))
  90. f2.write(audio[0:2] + " " + str(freq(audio, path)))
  91.  
  92. counter += 1
  93. print(colored((audio + " - " + str(amplitude(audio, path)) + " dBFS, " + \
  94. str(freq(audio, path)) + " Hz"), "green")) #green text
  95. except:
  96. pass
  97.  
  98. f.close()
  99. f2.close()
  100.  
  101.  
  102. ############################# plot #############################
  103.  
  104. m = 0.014
  105. g = 9.81
  106. coeff = 0.01 * m * g #convert to Joules
  107.  
  108. heightsA, ampls = list(), list()
  109. for line in open("ampl.txt", "r"):
  110. values = [float(number) for number in line.split()]
  111. heightsA.append(values[0] * coeff)
  112. ampls.append(10**(values[1] / 20))
  113. #ampls.append(values[1])
  114.  
  115.  
  116. print(ampls)
  117.  
  118. _10cmA, _15cmA, _25cmA, _35cmA, _50cmA, _60cmA, _70cmA, _85cmA, _100cmA = \
  119. list(), list(), list(), list(), list(), list(), list(), list(), list()
  120. _10cmA.append(ampls[0:10])
  121. _15cmA.append(ampls[10:20])
  122. _25cmA.append(ampls[20:30])
  123. _35cmA.append(ampls[30:40])
  124. _50cmA.append(ampls[40:50])
  125. _60cmA.append(ampls[50:60])
  126. _70cmA.append(ampls[60:70])
  127. _85cmA.append(ampls[70:75])
  128. _100cmA.append(ampls[75:])
  129. _10cmA, _15cmA, _25cmA, _35cmA, _50cmA, _60cmA, _70cmA, _85cmA, _100cmA = \
  130. _10cmA[0], _15cmA[0], _25cmA[0], _35cmA[0], _50cmA[0], _60cmA[0], _70cmA[0], _85cmA[0], _100cmA[0]
  131.  
  132.  
  133. '''
  134. heightsF, frequencies = list(), list()
  135. for line in open("freq.txt", "r"):
  136. values = [float(number) for number in line.split()]
  137. heightsF.append(values[0])
  138. frequencies.append(values[1])
  139.  
  140. _10cmF, _25cmF, _35cmF, _50cmF, _70cmF, _100cmF = \
  141. list(), list(), list(), list(), list(), list()
  142. _10cmF.append(frequencies[0:10])
  143. _25cmF.append(frequencies[10:20])
  144. _35cmF.append(frequencies[20:30])
  145. _50cmF.append(frequencies[30:40])
  146. _70cmF.append(frequencies[40:50])
  147. _100cmF.append(frequencies[50:])
  148. _10cmF, _25cmF, _35cmF, _50cmF, _70cmF, _100cmF = \
  149. _10cmF[0], _25cmF[0], _35cmF[0], _50cmF[0], _70cmF[0], _100cmF[0]
  150. '''
  151.  
  152.  
  153. def average(list):
  154. return sum(list) / len(list)
  155.  
  156.  
  157. def dispersion(list):
  158. aver = average(list)
  159. sum = 0
  160. for item in list:
  161. a = (aver - item)**2
  162. sum += a
  163. disp = sum / len(list)
  164. return sqrt(disp) / sqrt(len(list))
  165.  
  166.  
  167. h1 = 10*coeff
  168. h2 = 25*coeff
  169. h3 = 35*coeff
  170. h4 = 50*coeff
  171. h5 = 70*coeff
  172. h6 = 100*coeff
  173. h7 = 15*coeff
  174. h8 = 60*coeff
  175. h9 = 85*coeff
  176.  
  177.  
  178. '''plot1 = plt.scatter(heightsF, frequencies, c = "darkgreen", s = 2)
  179. plt.show()'''
  180.  
  181. experiment_size = 1
  182. average_size = 25
  183. average_color = "red"
  184. errorbar_color = "darkgreen"
  185. errorbar_width = 2
  186.  
  187. #plot2 = plt.scatter(heightsA, ampls, c = "darkblue", s = experiment_size)
  188.  
  189. plt.scatter(h1, average(_10cmA), c = average_color, s = average_size)
  190. plt.errorbar(h1, average(_10cmA), xerr = 0, \
  191. yerr = dispersion(_10cmA), c = errorbar_color, linewidth = errorbar_width)
  192.  
  193. plt.scatter(h2, average(_25cmA), c = average_color, s = average_size)
  194. plt.errorbar(h2, average(_25cmA), xerr = 0, \
  195. yerr = dispersion(_25cmA), c = errorbar_color, linewidth = errorbar_width)
  196.  
  197. plt.scatter(h3, average(_35cmA), c = average_color, s = average_size)
  198. plt.errorbar(h3, average(_35cmA), xerr = 0, \
  199. yerr = dispersion(_35cmA), c = errorbar_color, linewidth = errorbar_width)
  200.  
  201. plt.scatter(h4, average(_50cmA), c = average_color, s = average_size)
  202. plt.errorbar(h4, average(_50cmA), xerr = 0, \
  203. yerr = dispersion(_50cmA), c = errorbar_color, linewidth = errorbar_width)
  204.  
  205. plt.scatter(h5, average(_70cmA), c = average_color, s = average_size)
  206. plt.errorbar(h5, average(_70cmA), xerr = 0, \
  207. yerr = dispersion(_70cmA), c = errorbar_color, linewidth = errorbar_width)
  208.  
  209. plt.scatter(h6, average(_100cmA), c = average_color, s = average_size)
  210. plt.errorbar(h6, average(_100cmA), xerr = 0, \
  211. yerr = dispersion(_100cmA), c = errorbar_color, linewidth = errorbar_width)
  212.  
  213.  
  214.  
  215. plt.scatter(h7, average(_15cmA), c = average_color, s = average_size)
  216. plt.errorbar(h7, average(_15cmA), xerr = 0, \
  217. yerr = dispersion(_15cmA), c = errorbar_color, linewidth = errorbar_width)
  218.  
  219. plt.scatter(h8, average(_60cmA), c = average_color, s = average_size)
  220. plt.errorbar(h8, average(_60cmA), xerr = 0, \
  221. yerr = dispersion(_60cmA), c = errorbar_color, linewidth = errorbar_width)
  222.  
  223. #plt.scatter(h9, average(_85cmA), c = average_color, s = average_size)
  224. #plt.errorbar(h9, average(_85cmA), xerr = 0, \
  225. # yerr = dispersion(_85cmA), c = errorbar_color, linewidth = errorbar_width)
  226.  
  227.  
  228. fit_color = "blue"
  229.  
  230. #https://stackoverflow.com/a/4296777
  231. '''x = [h1, h7, h2, h3, h4]
  232. y = [average(_10cmA), average(_15cmA), average(_25cmA), average(_35cmA), average(_50cmA)]
  233. a, b, c = np.polyfit(x, y, 2)
  234. y_pred = np.polyval([a, b, c], x)
  235. x_out = np.linspace(0, 0.07, 20)
  236. y_pred = np.polyval([a, b, c], x_out)
  237. plt.plot(x_out, y_pred, c = fit_color)
  238.  
  239. x = [h4, h5, h6]
  240. y = [average(_50cmA), average(_70cmA), average(_100cmA)]
  241. a, b = np.polyfit(x, y, 1)
  242. y_pred = np.polyval([a, b], x)
  243. x_out = np.linspace(0.05, 0.14, 20)
  244. y_pred = np.polyval([a, b], x_out)
  245. plt.plot(x_out, y_pred, c = fit_color)'''
  246.  
  247.  
  248. plt.xlabel("Энергия, E [Дж]")
  249. plt.ylabel("Амплитуда, A [отн. ед.]")
  250.  
  251. #plt.text(0.00, 30500, "$m_{шарика} = 0.014 кг$", fontsize = 15)
  252. plt.text(0.02, 0.101, "$m_{шарика} = 0.014 кг$", fontsize = 15)
  253.  
  254. plt.grid(linestyle = "-", linewidth = 0.4, c = "black")
  255. plt.rc("axes", axisbelow = True)
  256.  
  257. plt.tick_params(direction = "in")
  258.  
  259. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement