aboutsummaryrefslogtreecommitdiffstats
path: root/aweight.py
blob: 3c06bcdadc0eddc1477bd34e3e696d43d5dc60b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from scipy import signal
from waveform_analysis import A_weighting
from math import pi
import numpy
import matplotlib.pyplot as plt


# Create our X axis values, the frequencies to test at:
gs = 2 * pi * numpy.geomspace(10, 24000, 1000)


# This is the ideal A-weighting filter:
z, p, k = A_weighting(48000, output='zpk')
_, hA = signal.freqz_zpk(z, p, k, gs, fs=48000)


# And here is our three-stage implementation:
z, p, k = signal.iirfilter(1, [640, 10000], btype='bandpass', analog=False, fs=48000, output='zpk')
_, hB = signal.freqz_zpk(z, p, k * 1.17, gs, fs=48000)

z, p, k = signal.iirfilter(1, 12000, btype='lowpass', analog=False, fs=48000, output='zpk')
_, hL = signal.freqz_zpk(z, p, k, gs, fs=48000)

z, p, k = signal.iirfilter(1, 120, btype='highpass', analog=False, fs=48000, output='zpk')
_, hH = signal.freqz_zpk(z, p, k, gs, fs=48000)


# Lastly, our SOS approximation:
sos = [[ 0.5,  0,   -0.5,  1, -1.062,  0.14],
       [ 0.5,  0.5,  0,    1,  0,      0   ],
       [ 1.0, -1.0,  0,    1, -0.985,  0   ]]
wS, hS = signal.sosfreqz(sos, fs=48000)


# Plot everything:
plt.semilogx(gs, 20 * numpy.log10(hA), label='A')
plt.semilogx(gs, 20 * numpy.log10(hB * hL * hH), label='bp+lp+hp')
plt.semilogx(wS, 20 * numpy.log10(hS), label='sos')

plt.title('Frequency response')
plt.xlabel('Frequency [Hz]')
plt.ylabel('Amplitude [dB]')
plt.ylim(-30, 10)
plt.xlim(20, 24000)
plt.grid(True, color='0.7', linestyle='-', which='major', axis='both')
plt.grid(True, color='0.9', linestyle='-', which='minor', axis='both')
plt.legend()
plt.show()