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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章