|
#!/usr/bin/env python |
|
# -*- coding: utf-8 -*- |
|
""" |
|
Translated from a MATLAB script (which also includes C-weighting, octave |
|
and one-third-octave digital filters). |
|
|
|
Author: Christophe Couvreur, Faculte Polytechnique de Mons (Belgium) |
|
couvreur@thor.fpms.ac.be |
|
Last modification: Aug. 20, 1997, 10:00am. |
|
BSD license |
|
|
|
http://www.mathworks.com/matlabcentral/fileexchange/69 |
|
Translated from adsgn.m to Python 2009-07-14 endolith@gmail.com |
|
""" |
|
|
|
from numpy import pi, polymul |
|
from scipy.signal import bilinear |
|
|
|
|
|
def A_weighting(fs): |
|
"""Design of an A-weighting filter. |
|
|
|
b, a = A_weighting(fs) designs a digital A-weighting filter for |
|
sampling frequency `fs`. Usage: y = scipy.signal.lfilter(b, a, x). |
|
Warning: `fs` should normally be higher than 20 kHz. For example, |
|
fs = 48000 yields a class 1-compliant filter. |
|
|
|
References: |
|
[1] IEC/CD 1672: Electroacoustics-Sound Level Meters, Nov. 1996. |
|
|
|
""" |
|
# Definition of analog A-weighting filter according to IEC/CD 1672. |
|
f1 = 20.598997 |
|
f2 = 107.65265 |
|
f3 = 737.86223 |
|
f4 = 12194.217 |
|
A1000 = 1.9997 |
|
|
|
NUMs = [(2*pi * f4)**2 * (10**(A1000/20)), 0, 0, 0, 0] |
|
DENs = polymul([1, 4*pi * f4, (2*pi * f4)**2], |
|
[1, 4*pi * f1, (2*pi * f1)**2]) |
|
DENs = polymul(polymul(DENs, [1, 2*pi * f3]), |
|
[1, 2*pi * f2]) |
|
|
|
# Use the bilinear transformation to get the digital filter. |
|
# (Octave, MATLAB, and PyLab disagree about Fs vs 1/Fs) |
|
return bilinear(NUMs, DENs, fs) |
Dear all, I am new to digital signal processing. I am wondering, in order to get A weighted sound pressure level, should I first apply this function to the wav data read by functions like "scipy.io.wavfile.read" then convert it to SPL, or first convert wav data to sound pressure level then use this function for A weighting? Thanks in advance!