next up previous
Next: この文書について... Up: 多重帰還型LPFの現実的な定数を求める方法 Previous: 2 サレンキー型LPFの特性


3 定数を求めるプログラム

フィルタの定数を求めるRのプログラムを,以下に示します.

3.0.0.1 lpfparam.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のベクトルで与えます. 基準となる抵抗の値(R2R4 の幾何平均)がこの範囲になるような コンデンサの値を使います. 結果として,抵抗値がこの範囲を外れることもあります. 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 $ \mu$F, R4 = 24 + 2.2 kΩ, C5 = 2200 pF とすればよいことがわかります.


next up previous
Next: この文書について... Up: 多重帰還型LPFの現実的な定数を求める方法 Previous: 2 サレンキー型LPFの特性
Ayumi Nakabayashi
平成24年7月21日