编程实现将分帧加窗后的语音信号恢复成原始分帧前的信号。设计一个低通滤波器并绘出其幅频和相频曲线。设计指标为:fs=8000HzWp=60HzWs=50Hz Rp=3dBRs=80dB。来滤去语音信号中的低频成分并用 FFT 分析 其频谱变化情况;编写去加重函数
- 将分帧加窗后的语音信号恢复成原始分帧前的信号:
import numpy as np
import scipy.signal as signal
# 定义帧长、帧移和窗函数
frame_length = 256
frame_shift = 128
window = signal.hamming(frame_length)
# 假设分帧加窗后的语音信号为frames,shape=(num_frames, frame_length)
# 恢复原始信号
signal = np.zeros((num_frames-1)*frame_shift + frame_length)
for i in range(num_frames):
signal[i*frame_shift:i*frame_shift+frame_length] += frames[i] * window
# 去除最后一帧的末尾部分
signal = signal[:num_frames*frame_shift]
- 设计低通滤波器:
import matplotlib.pyplot as plt
# 设计指标
fs = 8000
wp = 60 / (fs/2)
ws = 50 / (fs/2)
rp = 3
rs = 80
# 求取滤波器阶数和截止频率
N, Wn = signal.cheb1ord(wp, ws, rp, rs)
# 设计低通滤波器
b, a = signal.cheby1(N, rp, Wn, 'low')
# 绘制幅频和相频曲线
w, h = signal.freqz(b, a)
fig, ax1 = plt.subplots()
ax1.set_title('Frequency Response')
ax1.plot(0.5*fs*w/np.pi, 20*np.log10(np.abs(h)), 'b')
ax1.set_ylabel('Amplitude [dB]', color='b')
ax1.set_xlabel('Frequency [Hz]')
ax1.grid()
ax2 = ax1.twinx()
angles = np.unwrap(np.angle(h))
ax2.plot(0.5*fs*w/np.pi, angles, 'g')
ax2.set_ylabel('Phase [rad]', color='g')
ax2.grid()
plt.show()
- 去加重函数:
def preemphasis(signal, coeff=0.95):
"""
去加重函数
:param signal: 输入信号
:param coeff: 加重系数
:return: 去加重后的信号
"""
return np.append(signal[0], signal[1:] - coeff * signal[:-1])
原文地址: http://www.cveoy.top/t/topic/b2sA 著作权归作者所有。请勿转载和采集!