【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

区别联系

  1. https://zh.wikipedia.org/zh/%E6%95%B0%E5%AD%97%E6%BB%A4%E6%B3%A2%E5%99%A8
  2. 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()