python进行普通滤波、维销波波、卡尔曼泡波、自适应滤波等病波方法消除或压制语音信号嗓声的代码
时间: 2023-07-10 15:37:15 浏览: 112
python语音信号处理
5星 · 资源好评率100%
以下是Python实现常用的滤波方法的代码:
普通滤波:
```python
import numpy as np
import scipy.signal as signal
# 生成测试信号
fs = 8000
t = np.arange(fs) / fs
f1, f2 = 1000, 2000
x = 0.5 * np.sin(2 * np.pi * f1 * t) + 0.5 * np.sin(2 * np.pi * f2 * t)
# 设计低通滤波器
fc = 1500
b, a = signal.butter(4, fc / (fs / 2), 'low')
# 滤波
y = signal.filtfilt(b, a, x)
# 绘制结果
import matplotlib.pyplot as plt
plt.subplot(211)
plt.plot(t, x)
plt.title('Input signal')
plt.subplot(212)
plt.plot(t, y)
plt.title('Filtered signal')
plt.tight_layout()
plt.show()
```
维纳滤波:
```python
import numpy as np
import scipy.signal as signal
# 生成测试信号
fs = 8000
t = np.arange(fs) / fs
f1, f2 = 1000, 2000
x = 0.5 * np.sin(2 * np.pi * f1 * t) + 0.5 * np.sin(2 * np.pi * f2 * t)
# 设计带通滤波器
fband = [1200, 1800]
b, a = signal.butter(4, [2 * fband[0] / fs, 2 * fband[1] / fs], 'band')
# 加入高斯白噪声
noise = 0.05 * np.random.randn(len(t))
xn = x + noise
# 维纳滤波
y = signal.wiener(xn, mysize=len(b))
# 绘制结果
import matplotlib.pyplot as plt
plt.subplot(311)
plt.plot(t, x)
plt.title('Input signal')
plt.subplot(312)
plt.plot(t, xn)
plt.title('Noisy signal')
plt.subplot(313)
plt.plot(t, y)
plt.title('Filtered signal')
plt.tight_layout()
plt.show()
```
卡尔曼滤波:
```python
import numpy as np
import scipy.signal as signal
# 生成测试信号
fs = 8000
t = np.arange(fs) / fs
f1, f2 = 1000, 2000
x = 0.5 * np.sin(2 * np.pi * f1 * t) + 0.5 * np.sin(2 * np.pi * f2 * t)
# 初始化卡尔曼滤波器
Q = 1e-5
R = 1
xhat = np.zeros_like(x)
P = np.zeros_like(x)
K = np.zeros_like(x)
# 卡尔曼滤波
for k in range(1, len(x)):
# 预测
xhat[k] = xhat[k-1]
P[k] = P[k-1] + Q
# 更新
K[k] = P[k] / (P[k] + R)
xhat[k] = xhat[k] + K[k] * (x[k] - xhat[k])
P[k] = (1 - K[k]) * P[k]
# 绘制结果
import matplotlib.pyplot as plt
plt.subplot(211)
plt.plot(t, x)
plt.title('Input signal')
plt.subplot(212)
plt.plot(t, xhat)
plt.title('Filtered signal')
plt.tight_layout()
plt.show()
```
自适应滤波:
```python
import numpy as np
import scipy.signal as signal
# 生成测试信号
fs = 8000
t = np.arange(fs) / fs
f1, f2 = 1000, 2000
x = 0.5 * np.sin(2 * np.pi * f1 * t) + 0.5 * np.sin(2 * np.pi * f2 * t)
# 自适应滤波
mu = 0.01
y = np.zeros_like(x)
e = np.zeros_like(x)
w = np.zeros(50)
for n in range(len(x)):
# 计算输出值
y[n] = np.dot(w, x[n-49:n+1])
# 计算误差
e[n] = x[n] - y[n]
# 更新权值
w = w + mu * e[n] * x[n-49:n+1]
# 绘制结果
import matplotlib.pyplot as plt
plt.subplot(311)
plt.plot(t, x)
plt.title('Input signal')
plt.subplot(312)
plt.plot(t, y)
plt.title('Filtered signal')
plt.subplot(313)
plt.plot(t, e)
plt.title('Error')
plt.tight_layout()
plt.show()
```
阅读全文