Gammatone滤波器组归一化实现代码
时间: 2023-06-14 15:05:45 浏览: 155
Gammatone 滤波器的 Python 代码实现.zip_3DR_Gammatone_gammatone滤波器_python
5星 · 资源好评率100%
以下是一个简单的 Python 实现代码,实现对 Gammatone 滤波器组进行归一化:
```python
import numpy as np
import math
def gammatone_filterbank(fs, nfft, nfilts, flow, fhigh):
# 计算频率向量
frequencies = np.linspace(0, fs / 2, nfft // 2 + 1)
# 计算 Bark 频率向量
bark_frequencies = 13 * np.arctan(0.00076 * frequencies) + 3.5 * np.arctan(np.power(frequencies / 7500, 2))
# 确定滤波器中心的 Bark 频率
min_bark = 13 * np.arctan(0.00076 * flow) + 3.5 * np.arctan(np.power(flow / 7500, 2))
max_bark = 13 * np.arctan(0.00076 * fhigh) + 3.5 * np.arctan(np.power(fhigh / 7500, 2))
bark_centers = np.linspace(min_bark, max_bark, nfilts)
# 计算滤波器中心频率对应的线性频率
linear_centers = 7500 * (np.exp(0.05 * bark_centers) - np.exp(-0.05 * bark_centers)) / (np.exp(0.05 * bark_centers) + np.exp(-0.05 * bark_centers))
# 计算每个滤波器的带宽
bandwidths = np.zeros(nfilts)
bandwidths[1:nfilts - 1] = linear_centers[2:nfilts] - linear_centers[0:nfilts - 2]
bandwidths[0] = linear_centers[1] - linear_centers[0]
bandwidths[nfilts - 1] = linear_centers[nfilts - 1] - linear_centers[nfilts - 2]
# 初始化 Gammatone 滤波器组
gammatone_filters = np.zeros((nfilts, nfft // 2 + 1))
# 计算每个滤波器的系数
for i in range(nfilts):
cf = linear_centers[i]
b = bandwidths[i]
# 计算 Gammatone 滤波器的系数
f = np.linspace(0, fs / 2, nfft // 2 + 1)
gammatone_filters[i, :] = np.power((2 * np.pi * b), -0.5) * np.power((1j * 2 * np.pi * f + 2 * np.pi * b * cf), -1) * np.exp(-2 * np.pi * b * np.abs(1j * 2 * np.pi * f + 2 * np.pi * b * cf))
# 对每个滤波器进行归一化
for i in range(nfilts):
# 计算当前滤波器的功率响应
filter_power = np.power(np.abs(gammatone_filters[i, :]), 2)
# 计算当前滤波器的归一化系数
normalization_factor = np.sqrt(np.sum(filter_power))
# 对当前滤波器进行归一化
gammatone_filters[i, :] /= normalization_factor
return gammatone_filters
```
该函数接受以下参数:
- `fs`:采样率。
- `nfft`:FFT 长度。
- `nfilts`:Gammatone 滤波器的数量。
- `flow` 和 `fhigh`:Gammatone 滤波器的频率范围。
该函数返回一个数组,其中每一行表示一个 Gammatone 滤波器的频率响应。
阅读全文