定義
濾波器(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);