Witam, zostałem postawiany przed zadaniem napisania programu w Python i mianowicie nie wiem jak otrzymaną tablice wartości z mikrofonu przeliczyć na hałas. Wartości z mikrofonu są reprezentowane w Pulse Code Modulation.
Stawiam, że PCM==WAV;
Co dokładnie masz policzyć? Nie jesteś w stanie tego w prosty sposób obliczyć dB_SPL bez znajomości charakterystyki sprzętu, co najwyżej możesz sobie przeskalować głośność do decybeli w odniesieniu do najwyższej amplitudy w pliku czy jakiejś umownej wartości...
http://stackoverflow.com/questions/2445756/how-can-i-calculate-audio-db-level
alagner dzięki za zainteresowanie. Już tamten problem pokonałem, niemniej jednak stoję przed zadaniem pomiaru hałasu z użyciem krzywej ważonej A. Jest to projekt z informatyki który staram się skończyć. Znalazłem pewien kod który tak jakby to realizuje, nie mniej jednak aktualnie staram się go zrozumieć jak on to wykonuje(nie jestem orłem w tej dziedzinie). Jeśli chodzi o kalibrację to już mam ją za sobą. A mój plan jest taki że spróbuje rozwikłać kod który znalazłem lub jeśli mi się nie uda to spróbuje poddać PCM/WAV transformacji fouriera i przycięcie do żądanej krzywej następnie inwersja FFT i wyliczenie hałasu z tego. Jeśli masz wiedzę w tej dziedzinie z chęcią przeczytam i wysłucham rad.
Czy rozumiem dobrze:
masz jakiś poziom referencyjny, tzn. wiesz, że powiedzmy maksymalna wartość w wave'ie odnosi się do jakiegoś dB_SPL? Następnie chcesz to przepuścić przez filtr A-curve? Ok.
Przeczytaj jeszcze to: http://scicomp.stackexchange.com/questions/19004/fft-convolution-vs-direct-convolution
Pzdr.
Tak mam minimalną wartość mikrofonu którą można zmierzyć co odpowiada 20µPa i chce przepuścić przez tą krzywą. Mam już kawałek kodu zerknij.
from scipy.io import wavfile
from matplotlib import pyplot as plt
import numpy as np
# Load the data and calculate the time of each sample
rate, data = wavfile.read('sin0Hz-20KHz.wav')
def A_weight(f):
return 12200**2*f**4/((f**2+20.6**2)*(f**2+12200**2)*np.sqrt(f**2+107.7**2)*np.sqrt(f**2+737.9**2))
# Make the plot
# You can tweak the figsize (width, height) in inches
print(rate)
Fs = rate # sampling rate
Ts = 1.0/Fs # sampling interval
t = np.arange(0.,1.,Ts) # time vector
n = len(data) # length of the signal
k = np.arange(n)
T = n/Fs
frq = k/T # two sides frequency range
frq = frq[range(n/2)] # one side frequency range
Y = np.fft.fft(data)/2 # fft computing and normalization
#for i in range(4000,10000):
# Y[i] = 0.0 + 0.0j
tab = A_weight(np.log(np.arange(0.,20050,1)))
inverse = np.fft.ifft(Y)
A = np.fft.fft(inverse)/2
A = A[range(n/2)]
Y = Y[range(n/2)]
fig, ax = plt.subplots(1, 2)
ax[0].plot(t,data)
ax[0].set_xlabel('Time')
ax[0].set_ylabel('Amplitude')
ax[1].plot(frq,abs(Y),'r') # plotting the spectrum
ax[1].set_xlabel('Freq (Hz)')
ax[1].set_ylabel('|Amplitude|')
#ax[2].plot(inverse)
#ax[2].set_xlabel('Time')
#ax[2].set_ylabel('Amplitude')
plt.figure(2)
plt.subplot(211)
plt.plot(tab) # plotting the spectrum
#plt.set_xlabel('Freq (Hz)')
#plt.set_ylabel('|Amplitude|')
plt.show()
A to wynik.
https://drive.google.com/open?id=0B1qLnTVMJ4mQc0RJcDFjeW4xenRSdEYtZVBNbkpZNkdiYXVF
Teraz muszę przemnożyć otrzymaną krzywą przez otrzymany dźwięk i wykonać inwersje FFT, a następnie wyliczyć dB.