延迟效应器的具体参数如下表所示
d/R |
M(n) |
|
回声(Echo) |
>50ms |
1 |
共鸣(Resonator) |
0..20ms |
1 |
镶边(Flanger) |
0..15ms |
值域为[0,1],频率为1Hz的正弦波 |
合唱(Chorus) |
10..25ms |
随机函数值域为[0,1] |
实现无循环和有循环现原理是无循环和有循环
y[n]=x[n] g*x[n-M[n]*d] 无循环
y[n]=x[n] g*y[n-M[n]*d] 有循环、
其他延迟效应器通过改变每次延迟量D的调制函数来改变延迟量D的大小M[n]实现预期的延迟效果。比如回声(Echo),将延迟量定为50ms调制函数恒为1,每次延迟量不变。与原声相比,变量g用于控制延迟声的权值。对于无循环延迟,只有一个延迟声。对于有循环的延迟效应器,如果g值大于1,则每个延迟声将比上一个更大,并且应谨慎使用。
代码如下:
import librosa
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import lfilter as lf
import IPython.display as ipd
import colorednoise as cn
sr=44100
x,sr=librosa.load('test2.wav',sr=sr)
# 无循环
def delay(x,time, gain): #音频,延迟时间,延迟信号系数
d=int(time*sr)
b=np.zeros(d 1)
b[0]=1
b[d]=gain
a=[1]
y=lf(b,a,x)
return y/(1 gain)
# 有循环
def delayR(x,time, gain):
d=int(time*sr)
b=[1]
a=np.zeros(d 1)
a[0]=1
a[d]=-1*gain
y=lf(b,a,x)
return y/(1 gain)
# 回声和共振只是简单地改变延迟量d(单位ms),以及g的大小。
# 镶边效果器,无循环方法和循环方法
def fit(x,t):
n=np.floor(t)
if n==t:
return x[int(t)]
else:
n=int(n)
return x[n]*(n 1-t) x[n 1]*(t-n)
def flanger(x,g,t,f):
d=int(t*sr)
N=len(x)
y=np.zeros(N d)
x=np.append(x,np.zeros(d)) #x后补充d0
y[0:d]=x[0:d]
n=np.arange(N d)
M=(np.cos(2*np.pi*f*n/sr) 1)/2
for i in range(d,N d):
y[i]=x[i] g*x[int(i-d*M[i])]
return y
def flangerR(x,g,t,f):
d=int(t*sr)
N=len(x)
y=np.zeros(N d)
x=np.append(x,np.zeros(d)) #x后补充d0
y[0:d]=x[0:d]
n=np.arange(N d)
M=(np.cos(2*np.pi*f*n/sr) 1)/2
for i in range(d,N d):
#y[i]=x[i] g*y[int(i-d*M[i])]
y[i]=x[i] g*fit(y,i-d*M[i])
return y
y_flanger1=flanger(x,0.9, 0.005,1)
y_flanger2=flangerR(x,0.5, 0.005,1)
print("边缘-无循环延迟")
ipd.display(ipd.Audio(y_flanger1,rate=sr))
print("镶边-循环延迟-循环延迟")
ipd.display(ipd.Audio(y_flanger2,rate=sr))
# 合唱效果器 无循环延迟法和无循环延迟法
def chorus(x,g,t):
d=int(t*sr) 1
N=len(x)
y=np.zeros(N d)
x=np.append(x,np.zeros(d)) #x后补充d0
y[0:d]=x[0:d]
n=np.arange(N d)
M=cn.powerlaw_psd_gaussian(4,N d)
M=abs(M/max(M))
for i in range(d,N d):
y[i]=x[i] g*x[int(i-d*M[i-d])]
return y
def chorusR(x,g,t):
d=int(t*sr) 1
nbsp; N=len(x)
y=np.zeros(N+d)
x=np.append(x,np.zeros(d)) #在x后面补充d个0
y[0:d]=x[0:d]
n=np.arange(N+d)
M=cn.powerlaw_psd_gaussian(4,N+d)
M=abs(M/max(M))
for i in range(d,N+d):
y[i]=x[i]+g*fit(y,i-d*M[i-d])
return y
y_chorus1=chorus(x,1.0, 0.020)
y_chorus2=chorusR(x,0.5, 0.020)
print("合唱————无循环延迟")
ipd.display(ipd.Audio(y_chorus1,rate=sr))
print("合唱————循环延迟")
ipd.display(ipd.Audio(y_chorus2,rate=sr))