锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

python 使用无循环和有循环两种方法实现常见的延迟效果器

时间:2023-02-28 03:00:00 sr循环数显继电器dh48s

延迟效应器的具体参数如下表所示

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))

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章