SuperCollider学习笔记(三)- 滤波器(Filters)

定义

滤波器(Filters)在维基百科的定义是“可执行信号处理功能的电子线路组件或设备,它专门用于去除信号中不想要的成分或者增强所需成分”,即用于“过滤”掉不想要的信号的一种设施,其有许多分类和应用场景。

分类解读

低通和高通滤波器(Low Pass,High Pass)

这其中包含 LPF 和 HPF 两类,能量衰减均为 12dB/octave,参数有in(输入信号), freq(截断频率), mul 和 add

  • LPF 是一种二阶低通滤波器,低通即表明低于截断频率的信号才能通过:
{ LPF.ar(Saw.ar(200, 0.1), SinOsc.kr(XLine.kr(0.7, 300, 20), 0, 3600, 4000)) }.scope(1); // 输入信号为锯齿信号,截断频率以正弦函数波动
{ LPF.ar(WhiteNoise.ar, MouseX.kr(1e2,2e4,1), 0.2) }.scope(1); // 输入为白噪音,截断频率根据鼠标指针横座标变化
{ LPF.ar(Saw.ar(100), MouseX.kr(1e2,2e4,1), 0.2) }.scope(1);
  • HPF 是一种二阶高通滤波器,高通表示高于截断信号的信号能通过:
{ HPF.ar(Saw.ar(200, 0.1), FSinOsc.kr(XLine.kr(0.7, 300, 20), 0, 3600, 4000), 5)}.scope(1);
{ HPF.ar(WhiteNoise.ar, MouseX.kr(1e2,2e4,1), 0.2) }.scope(1);
{ HPF.ar(Saw.ar(100), MouseX.kr(1e2,2e4,1), 0.2) }.scope(1);

带通和带阻滤波器(Band Pass, Band Cut)

有 BPF 和 BRF 两种,能量衰减均为 12dB/octave,参数有in, freq(通带的中心频率), rq(参数Q的倒数,Q的定义是“截断频率 / 通带的宽度”,故 rq 是(通带的宽度/截断频率)), mul 和 add

  • BPF 是一种二阶带通滤波器,只有在通带之内的信号能通过:
{ BPF.ar(WhiteNoise.ar, MouseX.kr(1e2,2e4,1), 0.4, 0.4) }.scope(1); // 输入为白噪音,通过鼠标指针横座标控制通带中心频率,rq为0.4
{ BPF.ar(Saw.ar(100), MouseX.kr(1e2,2e4,1), 0.4, 0.4) }.scope(1);
{ BPF.ar(Saw.ar(200, 0.5), FSinOsc.kr(XLine.kr(0.7, 300, 20), 0, 3600, 4000), 0.3) }.scope(1);
  • BRF 是一种二阶带阻滤波器,通带之内的信号会衰减:
{ BRF.ar(WhiteNoise.ar, MouseX.kr(1e2,2e4,1), 0.4, 0.2) }.scope(1);
{ BRF.ar(Saw.ar(100), MouseX.kr(1e2,2e4,1), 0.4, 0.2) }.scope(1);
{ BRF.ar(Saw.ar(200, 0.5), FSinOsc.kr(XLine.kr(0.7, 300, 20), 0, 3800, 4000), 0.3) }.scope(1);

共振低通、共振低通和共振带通滤波器(Resonant Low Pass, High Pass, Band Pass)

RLPF 和 RHPF 分别用于生成共振高通和共振低通滤波器,其参数为 in, freq, rq(通带的宽度/截断频率,通带宽度会影响到滤波器的能量保存与散失情况), mul 和 add

  • RLPF 为共振低通滤波器,造成的效果近似于在截止频率附近产生振幅的升高或降低:
{ RLPF.ar(WhiteNoise.ar, MouseX.kr(1e2,2e4,1), 0.2, 0.2) }.scope(1);
{ RLPF.ar(Saw.ar(100), MouseX.kr(1e2,2e4,1), 0.2, 0.2) }.scope(1);
{ RLPF.ar(Saw.ar(200, 0.1), SinOsc.ar(XLine.kr(0.7, 300, 20), 0, 3600, 4000), 0.2) }.scope(1);
  • RHPF 为共振高通滤波器:
{ RHPF.ar(WhiteNoise.ar, MouseX.kr(1e2,2e4,1), 0.2, 0.2) }.scope(1);
{ RHPF.ar(Saw.ar(100), MouseX.kr(1e2,2e4,1), 0.2, 0.2) }.scope(1);
{ RHPF.ar(Saw.ar(200, 0.1), FSinOsc.kr(XLine.kr(0.7, 300, 20), 0, 3600, 4000), 0.2) }.scope(1);

Resonz 与 Ringz 基本相同,区别在于 Resonz 在0分贝处有一个持续的增益,而 Ringz 是一个边缘增益滤波器(constant skirt gain filter),即最大增益是由Q决定的。

  • Resonz 的参数为 in, freq, rq, mul, add:
{ Resonz.ar(WhiteNoise.ar(0.5), 2000, 0.1) }.scope(1);
{ Resonz.ar(WhiteNoise.ar(0.5), XLine.kr(1000, 8000, 10), 0.05)}.scope(1); // 改变滤波器频率
{ Resonz.ar(WhiteNoise.ar(0.5), 2000, XLine.kr(1, 0.001, 8))}.scope(1); // 改变通带宽度
  • Ringz 的参数的为 in, freq, ring time, mul 和 add,其中第三个参数与 Resonz 不同,意义为 60dB 信号的衰减时间:
{ Ringz.ar(Dust.ar(3, 0.3), 2000, 2) }.scope(1); // 输入为随机脉冲
{ Ringz.ar(WhiteNoise.ar(0.005), 2000, 0.5) }.scope(1);
{ Ringz.ar(WhiteNoise.ar(0.005), XLine.kr(100, 3000, 10), 0.5) }.scope(1); // 改变滤波器频率
{ Ringz.ar(Impulse.ar(6, 0.3), 2000, XLine.kr(4, 0.04, 8)) }.scope(1); // 改变衰减时间

较简单滤波器(Simpler Filters)

包含两种滤波器 OnePole 和 OneZero。

  • OnePole 参数为 in, coef(反馈的系数,取值在 -1 到 +1), mul, add,产生的滤波器套用了如下公式:
out(i) = ((1 - abs(coef)) * in(i)) + (coef * out(i-1)).
{ OnePole.ar(WhiteNoise.ar(0.5), 0.95) }.scope(1);
{ OnePole.ar(WhiteNoise.ar(0.5), -0.95) }.scope(1);
{ OnePole.ar(WhiteNoise.ar(0.5), Line.kr(-0.99, 0.99, 10)) }.scope(1);
  • OneZero 参数为 in, coef, mul, add,产生的滤波器公式如下:
out(i) = ((1 - abs(coef)) * in(i)) + (coef * in(i-1)).

前馈系数取 +0.5 时相当于一个 LPZ1 (Two point average filter),取 -0.5 时相当于 HPZ1 (Two point difference filter),取 +1 时相当于将音频滞后一帧或一个控制周期 (Delay1),取 -1 时相当于一个相反的一帧音频滞后:

{ OneZero.ar(WhiteNoise.ar(0.5), 0.5) }.scope(1);
{ OneZero.ar(WhiteNoise.ar(0.5), -0.5) }.scope(1);
{ OneZero.ar(WhiteNoise.ar(0.5), Line.kr(-0.5, 0.5, 10)) }.scope(1);

非线性滤波器(NonLinear Filters)

包括 Median 和 Slew。

  • Median 产生的滤波器效果是返回最后 length 个点的中位数,对于减少脉冲噪音有很好的效果,参数为 length(寻找中位数时参考的点数), in, mul 和 add:
{ Saw.ar(500, 0.1) + Dust2.ar(100, 0.9) }.scope(1);
{ Median.ar(3, Saw.ar(500, 0.1) + Dust2.ar(100, 0.9))}.scope(1);
{ Saw.ar(500, 0.1) + LPZ1.ar(Dust2.ar(100, 0.9)) }.scope(1);
{ Median.ar(5, Saw.ar(500, 0.1) + LPZ1.ar(Dust2.ar(100, 0.9)))}.scope(1);

(
{
	x = SinOsc.ar(1000, 0, 0.2);
	[x, Median.ar(31, x)];
}.scope(1);
)
  • Slew 用于限制信号的斜率,斜率用每秒多少单位来衡量,参数有 in, up(斜率上限), dn(斜率下限), mul 和 add:
{ Saw.ar(500, 0.1) + Dust2.ar(100, 0.9) }.scope(1);
{ Slew.ar(Saw.ar(500, 0.1) + Dust2.ar(100, 0.9), 1000, 1000) }.scope(1);

(
{
	z = LFPulse.ar(800);
	[z, Slew.ar(z, 4000, 4000)]
}.plot
)

共振峰滤波器(Formant Filter)

  • Formlet 产生的滤波器相当于在正弦波之上添加了 Decay2 这个信封的作用,参数为 in, freq, attacktime, decaytime, mul 和 add,输出相当于如下:
Ringz(in, freq, decaytime) - Ringz(in, freq, attacktime)
{ Formlet.ar(Impulse.ar(20, 0.5), 1000, 0.01, 0.1) }.scope(1);
{ Formlet.ar(Blip.ar(XLine.kr(10, 400, 8), 1000, 0.1), 1000, 0.01, 0.1) }.scope(1);

(
{
	var in;
	in = Blip.ar(SinOsc.kr(5, 0.20, 300), 1000, 0.1);
	Formlet.ar(in, XLine.kr(1500, 700, 8), 0.005, 0.04);
}.scope(1);
)
  • Klank 可以用于产生一系列固定频率的谐振器,它们可以用于模拟一个信号的谐振模式,每一个模式会设定 ring time,即这个模式衰减60dB的时间,参数包括 specificationsArrayRef(一个数组,包含用于设定所有模式频率的数组 frequencies,设定所有振幅的数组 amplitudes,设定所有 ring time 的数组 ring times),input, freqscale(初始化时与所有频率相乘), freqoffset(初始化时与所有频率相加), decayscale(初始化时与所有ring time相乘):
{ Klank.ar(`[[800, 1071, 1153, 1723], nil, [1, 1, 1, 1]], Impulse.ar(2, 0, 0.1)) }.scope(1);
{ Klank.ar(`[[800, 1071, 1153, 1723], nil, [1, 1, 1, 1]], Dust.ar(8, 0.1)) }.scope(1);
{ Klank.ar(`[[800, 1071, 1153, 1723], nil, [1, 1, 1, 1]], PinkNoise.ar(0.007)) }.scope(1);
{ Klank.ar(`[[800, 1071, 1153, 1723], nil, [1, 1, 1, 1]], PinkNoise.ar([0.007, 0.007])) }.scope(1);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章