Jak przeliczyć z PCM jaki to hałas

0

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.

0

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

0

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.

0

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.

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1