フィルタの定数を求めるRのプログラムを,以下に示します.
1 `lpfparam` <- function (w0, Q, K=1, type="SK", Rrange=c(5e3, 100e3), Cseries=E6) 2 { 3 # LPFの定数を求める 4 # w0: 遮断角周波数 5 # Q: Q 6 # K: 通過域のゲイン(サレンキー型の場合は無視される) 7 # type: "SK" (サレンキー型) または "MF" (多重帰還型) 8 # Rrange: 使用する抵抗値の範囲(これよりいくらか外れることもある) 9 # Cseries: 使用するコンデンサの系列の値 10 # 返値: 11 # type == "SK" の場合、6列の行列 12 # 各列の値は、R1, C2, R3, C4, mr, mc 13 # type == "MF" の場合、7列の行列 14 # 各列の値は、R1, R2, C3, R4, C5, mr, mc 15 16 if (type == "SK") 17 K <- 0 18 mc.min <- 2 * Q * sqrt(1 + K) 19 cat("mc.min=", mc.min, "\n", sep="") 20 z <- combr(mc.min^2, series=Cseries, func="/", mult=0:3, n=100, comp=">") 21 if (nrow(z) == 0) 22 stop("指定された仕様は満たせません. QやKを小さくしてください.") 23 res <- NULL 24 for (i in seq(1:nrow(z))) { 25 Cm <- sqrt(z[i, 1] * z[i, 2]) # コンデンサの値の仮数部 26 mc <- sqrt(z[i, 1] / z[i, 2]) # コンデンサの、基準値からの比率 27 Ce <- log10(1 / (w0 * Rrange * Cm)) # 抵抗値が範囲に収まる 28 Ce <- ceiling(Ce[2]):floor(Ce[1]) # コンデンサの指数を求める 29 C <- Cm * 10^Ce # コンデンサの値 30 R <- 1 / (w0 * C) # 対応する抵抗の値 31 32 # 指定されたQとなる抵抗の比を求める 33 b <- -mc / Q # 2次方程式の一次項 34 c <- 1 + K # 2次方程式の定数項 35 if (type == "SK") { 36 mr <- (-b + sqrt(b^2 - 4 * c)) / 2 # 2次方程式の解 37 for (j in seq(along=C)) { 38 R1 <- R[j] * mr 39 R3 <- R[j] / mr 40 C2 <- C[j] * mc 41 C4 <- C[j] / mc 42 res1 <- c(R1, C2, R3, C4, mr, mc) 43 if (is.null(res)) 44 res <- matrix(res1, nrow=1, 45 dimnames=list(NULL, c("R1", "C2", "R3", "C4", "mr", "mc"))) 46 else if (match(signif(C2, 3), signif(res[, 2], 3), nomatch=0) == 0) 47 res <- rbind(res, res1) 48 } 49 } else if (type == "MF") { 50 mr <- (-b - sqrt(b^2 - 4 * c)) / 2 # 2次方程式の解 51 for (j in seq(along=C)) { 52 R2 <- R[j] * mr 53 R4 <- R[j] / mr 54 R1 <- R2 / K 55 C3 <- C[j] * mc 56 C5 <- C[j] / mc 57 res1 <- c(R1, R2, C3, R4, C5, mr, mc) 58 if (is.null(res)) 59 res <- matrix(res1, nrow=1, 60 dimnames=list(NULL, c("R1", "R2", "C3", "R4", "C5", "mr", "mc"))) 61 else if (match(signif(C3, 3), signif(res[, 3], 3), nomatch=0) == 0) 62 res <- rbind(res, res1) 63 } 64 } 65 } 66 dimnames(res)[[1]] <- 1:nrow(res) 67 res 68 }遮断周波数
w0
は,角周波数で与えることに気を付けてください.
通過域利得 K
は,省略時の値として1が与えられているので,
通常は指定する必要はありません.
フィルタの種類 type
には,
サレンキー型の場合は "SK"
を,
多重帰還型の場合は "MF"
を指定します.
使用する抵抗値の範囲 Rrange
は,長さが2のベクトルで与えます.
基準となる抵抗の値(R2 と R4 の幾何平均)がこの範囲になるような
コンデンサの値を使います.
結果として,抵抗値がこの範囲を外れることもあります.
Cseries
には,コンデンサの系列の仮数部の値のベクトルを指定します.
E6
, E12
, E24
というベクトルを
あらかじめ用意してあります.
結果は6列(サレンキー型の場合)または
7列(多重帰還型の場合)の行列で,
各行が1つの定数の組になっています.
コンデンサの比 mc
(6列目または7列目)が小さい順にならんでいます.
最初のコンデンサの値が同じとなる定数の組は,
最も mc
が小さいもの以外は捨ててあります.
遮断周波数1 kHzで Q が1の多重帰還型フィルタのパラメータを求めた例を, 以下に示します.
> lpfparam(w0=2*pi*1e3, Q=1, type="MF") mc.min=2.828427 R1 R2 C3 R4 C5 mr mc 1 19995.157 19995.157 2.2e-08 26174.000 2.2e-09 0.8740320 3.162278 2 43989.344 43989.344 1.0e-08 57582.799 1.0e-09 0.8740320 3.162278 3 4398.934 4398.934 1.0e-07 5758.280 1.0e-08 0.8740320 3.162278 4 29326.230 29326.230 1.5e-08 38388.533 1.5e-09 0.8740320 3.162278 5 13330.104 13330.104 3.3e-08 17449.333 3.3e-09 0.8740320 3.162278 6 9359.435 9359.435 4.7e-08 12251.659 4.7e-09 0.8740320 3.162278 7 64690.212 64690.212 6.8e-09 84680.587 6.8e-10 0.8740320 3.162278 8 6469.021 6469.021 6.8e-08 8468.059 6.8e-09 0.8740320 3.162278 9 2274.893 2274.893 1.5e-07 15793.931 4.7e-09 0.3795206 5.649327 10 1493.087 1493.087 2.2e-07 23367.842 3.3e-09 0.2527745 8.164966最初の定数の組を使えば, R1 = 20 kΩ, R2 = 20 kΩ, C3 = 0.022 F, R4 = 24 + 2.2 kΩ, C5 = 2200 pF とすればよいことがわかります.