【python信号处理】常见语音编辑等操作
个人使用,仅供参考
音频文件按0.1s进行切割并保存音频文件
def loop_cutaudio(name,origin_signal,sample_rate):
'''每个音频文件去按照0.1秒进行切割'''
total_time = len(origin_signal)/sample_rate
# 按照0.1的间隔去裁剪音频文件
for i in np.arange(0,total_time-0.1,0.1):
filename = f'../car/audio/{name}_{i}.wav'
# 写入文件
wavfile.write(
filename,
sample_rate,
origin_signal[int(i*sample_rate):int((i+0.1)*sample_rate)]
)
sample_rate ,origin_signal = wavfile.read(i)
loop_cutaudio(name,origin_signal,sample_rate)
butter滤波器
butter 属于IIR滤波器(无限长脉冲滤波相应器)
滤波器阶数越高,在阻频带振幅衰减速度越快。 # 有较长的过渡带,在过渡带上很容易造成失真。
# 这里假设采样频率为sample_rate,信号本身最大的频率为1000hz,要滤除300hz以下频率成分,则wn=2*300/sample_ratge
b,a = signal.butter(N = 10,
Wn = 300*2/sample_rate, btype='highpass')
high_signal = signal.lfilter(b,a,single_signal)
firwin滤波器
firwin 属于 FIR滤波器(有限长脉冲响应滤波器)
设计采用窗法。
num_taps = 128 # 滤波器阶数
cutoff_freq = 200/8000 # 截止频率
h = signal.firwin(num_taps, cutoff_freq) # FIR滤波器设计采用窗法。
high_signal2 = signal.lfilter(h,1,single_signal) # https://www.programcreek.com/python/example/100540/scipy.signal.firwin
区别联系
- https://zh.wikipedia.org/zh/%E6%95%B0%E5%AD%97%E6%BB%A4%E6%B3%A2%E5%99%A8
- FIR运算速度快,IIR运算速度慢
时域&频域相互转换
def frequency_domain(signal,sample_rate):
'''输入信号和采样率输出傅里叶变换之后的实数序列和采样频率'''
'''fftpack.fft 返回实数或复数序列的离散傅里叶变换。'''
F = fftpack.fft(signal) # 参数为时域信号
'''fftpack.fftfreq 返回离散傅里叶变换采样频率。'''
N = len(signal)
print('N',N)
f = fftpack.fftfreq(N,1.0/sample_rate) # 参数为采样点数 = 采样频率x单元时间 和 采样周期 = 1 /sample_rate
mask = np.where(f>=0)
# 实信号频谱是对称的,单片谱的代表信号的全部信息,所以可以只看一边
plt.plot(f[mask], abs(F[mask])/N)
plt.show()
return f[mask],abs(F[mask])/N
def time_domain(F):
from scipy import fftpack
F_filtered = F
'''返回实数或复数序列的离散傅里叶逆变换。'''
f_t_filtered = fftpack.ifft(F)
mask = np.where(f >= 0)
t = np.linspace(0, 10, N) # 10为整个时长,N为len(signal)
plt.plot(t,f_t_filtered.real)
plt.show()
plt.plot(f_t_filtered)
plt.show()