Jeremiah_

PDS 2019.4 - RMS and PSD of an Electromyography Signal

Dec 19th, 2019
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.29 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. Created on Wed Dec 18 23:36:47 2019
  5.  
  6. @author: jeremiah
  7. """
  8.  
  9. #%% importings
  10. import numpy as np
  11. from scipy.io import wavfile
  12. import matplotlib.pyplot as plt
  13. import soundfile as sf
  14. import wave
  15. #%%
  16.  
  17. def rms_arr(arr, win_size, win_sobrep_proportion):
  18.     def rms_win(win_arr):
  19.         #return np.sqrt(np.sum(win_arr**2))/win_size
  20.         return np.sqrt(np.mean(win_arr**2))
  21.    
  22. # =============================================================================
  23. #     rest = (len(arr)%win_size)
  24. #    
  25. #     if rest:
  26. #         arr = arr[:-rest]
  27. # =============================================================================
  28.     ans = []
  29.     for i in np.arange(0, len(arr), int(win_size/win_sobrep_proportion)):
  30.         if i+win_size >= len(arr):
  31.             break
  32.        
  33.         ans.append(rms_win(arr[i:i+win_size]))
  34.    
  35.     return ans
  36.  
  37. #%%
  38. # =============================================================================
  39. # Diego's function
  40. # =============================================================================
  41. def rms(arr, window_size):
  42.     ans = []
  43.     n = len(arr)
  44.     if (window_size > n):
  45.         return ans
  46.    
  47.     def compute_rms(x):
  48.         return np.sqrt(x) / window_size
  49.    
  50.     cur = 0
  51.  
  52.     for i in range(window_size):
  53.         cur += arr[i] * arr[i]
  54.     ans.append(compute_rms(cur))
  55.     for i in range(1, n - window_size + 1):
  56.         cur -= arr[i - 1] * arr[i - 1]
  57.         cur += arr[i + window_size - 1] * arr[i + window_size - 1]
  58.         ans.append(compute_rms(cur))
  59.    
  60.     return ans
  61.  
  62. #%%
  63. def psd(signal, fft_win_size, psd_win_size, win_sobrep_proportion):
  64.    
  65.     psd = []
  66.     fft = []
  67.     count = 0
  68.     for i in np.arange(0, len(signal), int(fft_win_size/win_sobrep_proportion)):
  69.         count += 1
  70.        
  71.         if i+fft_win_size >= len(signal):
  72.             break
  73.         fft.append(np.abs(np.fft.fft(signal[i:i+fft_win_size])))
  74.        
  75.         if count == psd_win_size:
  76.             fft = np.array(fft, "float64")
  77.             psd.append(np.sum(fft**2, axis=0)/psd_win_size)
  78.             fft = []
  79.             count = 0
  80.        
  81.        
  82.     return np.array(psd, "float64")
  83.        
  84.        
  85.        
  86.        
  87. #%%
  88. file_name = "02.wav"
  89. path = '/media/jeremiah/7E9BF5A34D96B6A4/2019.4/PDS/pds-2019.4-master/'+file_name
  90. data, _ = sf.read(path)
  91. #_, data = wavfile.read("/media/jeremiah/7E9BF5A34D96B6A4/2019.4/PDS/pds-2019.4-master/01.wav")
  92. print(data[:10])
  93. data = np.array(data, "float64")
  94. win_sobrep_proportion = 4
  95. win_size = 2**16
  96. rms_data = rms_arr(data, win_size, win_sobrep_proportion)
  97. plt.plot(rms_data)
  98. plt.title("RMS with window size of "+str(win_size))
  99. plt.savefig("/media/jeremiah/7E9BF5A34D96B6A4/2019.4/PDS/pds-2019.4-master/"+file_name+"rms-win-of"+str(win_size)+".png")
  100. plt.show()
  101.  
  102. #%%
  103. win_sobrep_proportion = 2
  104. fft_win_size = 2**11
  105. psd_win_size = 2**6
  106. psd_data = psd(data, fft_win_size, psd_win_size, win_sobrep_proportion)
  107. median_psd_data = np.median(psd_data, axis=1)
  108. plt.plot(median_psd_data)
  109. plt.title("PSD with fft window size of "+str(fft_win_size)+" and psd window size of "+str(psd_win_size))
  110. plt.savefig("/media/jeremiah/7E9BF5A34D96B6A4/2019.4/PDS/pds-2019.4-master/"+file_name+"psd-fft_win-of"+str(fft_win_size)+"-psd_win-of"+str(psd_win_size)+".png")
Advertisement
Add Comment
Please, Sign In to add comment