一个临界频带的“距离”通常称为一个Bark,频率(Hz)映射到Bark公式:
z
(
f
)
=
13
×
t
a
n
−
1
(
0.00076
×
f
)
+
3.5
×
t
a
n
−
1
[
(
f
7500
)
2
]
(Bark)
z(f)=13\times tan^{-1}(0.00076\times f)+3.5\times tan^{-1}[(\frac{f}{7500})^2]\tag{Bark}
z(f)=13×tan−1(0.00076×f)+3.5×tan−1[(7500f)2](Bark)
对于每个临界频带的频宽也可以从下式中求得:
B
W
c
(
f
)
=
25
+
75
×
[
1
+
1.4
×
(
f
1000
)
2
]
0.69
(Hz)
BW_c(f)=25+75\times [1+1.4\times (\frac{f}{1000})^2]^{0.69}\tag{Hz}
BWc(f)=25+75×[1+1.4×(1000f)2]0.69(Hz)
另外,Bark频带到频率的映射可以由下式估计出来:
f
=
b
×
(
e
0.219
×
b
352
+
0.1
)
−
0.032
×
e
−
0.15
×
(
b
−
5
)
2
(kHz)
f=b\times (\frac{e^{0.219\times b}}{352}+0.1)-0.032\times e^{-0.15\times (b-5)^2}\tag{kHz}
f=b×(352e0.219×b+0.1)−0.032×e−0.15×(b−5)2(kHz)
import numpy as np
import matplotlib.pyplot as plt
# 滤波器组个数
nfilt = 22
# 48000KHz
sample_rate = 48000
NFFT = sample_rate
freq_48 = np.array(range(0, int(sample_rate/2), 1))
Bark_freq = 13*np.arctan(0.00076*freq_48)+3.5*np.arctan((freq_48/7500)**2)
low_freq_bark = 0
high_freq_bark = 13*np.arctan(0.00076*sample_rate/2)+3.5*np.arctan((sample_rate/2/7500)**2)
bark_points = np.linspace(low_freq_bark, high_freq_bark, nfilt + 2)
# print(len(bark_points))
hz_points = np.zeros([24])
for i in range(24):
hz_points[i] = 1000 * bark_points[i] * (pow(np.e, 0.219 * bark_points[i]) / 352. + 0.1) - 0.032 * pow(np.e, -0.15 * pow(bark_points[i] - 5, 2))
print(hz_points)
bin = np.floor((NFFT + 1) * hz_points / sample_rate)
fbank = np.zeros((nfilt, int(np.floor(NFFT / 2 + 1))))
for m in range(1, nfilt + 1):
f_m_minus = int(bin[m - 1]) # left
f_m = int(bin[m]) # center
f_m_plus = int(bin[m + 1]) # right
for k in range(f_m_minus, f_m):
fbank[m - 1, k] = (k - bin[m - 1]) / (bin[m] - bin[m - 1]) # 等高
# fbank[m - 1, k] = fbank[m - 1, k] * 2 / (bin[m+1] - bin[m - 1]) # 等面积
for k in range(f_m, f_m_plus):
fbank[m - 1, k] = (bin[m + 1] - k) / (bin[m + 1] - bin[m])
# fbank[m - 1, k] = fbank[m - 1, k] * 2 / (bin[m + 1] - bin[m-1])
plt.figure(1)
for i in range(0, nfilt):
plt.plot(range(0, 24001), fbank[i])
plt.figure(2)
plt.plot(freq_48, Bark_freq)
plt.ylabel("Bark-frequency")
plt.xlabel("frequency")
plt.title("Frequency to Bark-frequency")
plt.grid()
plt.figure(3)
plt.plot(bark_points, hz_points)
plt.ylabel("Frequency-Bark")
plt.xlabel("Bark")
plt.title("Bark-frequency to Frequency")
plt.grid()
plt.show()