ExcelでdBmの換算フォームを作ってみよう

dBm、mW、mVppの変換ツールをExcelマクロで作ってみませんか?

Vppとは?

突然ですが、次のような波形があった場合、電圧振幅が何Vか分かりますか?

この波形の振幅は?

この波形の振幅は?

その通り。答えは1 [V]です。

では、あなたは、Vppという単位を見たことがありますか?
ボルトピーピーと読みます。Vp-pと書く人もいます。
この波形の振幅をVppで表すと、どんな値になりますか?

ボルトピーピーは略語です。本当は、「Volt Peak to Peak」で、最大値と最小値の差の値を示す言葉です。この波形例では、2[Vpp]になります。

高周波の分野では、扱う信号が小さいため、mVppという単位をよく使います。

dBmとは?

dB(ディービー、デシベル)は街中でもよく耳にする単語です。

1 [Vpp]の振幅が増幅器を通って5 [Vpp]になったとすると、

    \begin{align*} 20\log_{10}5\cong14\left[dB\right]~~~\eqno(1) \end{align*}

なので、「14デシのアンプが得られた」なんて感じで使います。

では、dBmという単位を見たことがありますか?

「ディービーエム」と読みます。僕は聞き間違えされないように、「デービーエム」と発音しています。

dBmは、1 [mW]の電力を基準とした単位です。P [mW]をdBmで表すと、

    \begin{align*} 10\log_{10}P\left[dBm\right]~~~\eqno(2) \end{align*}

となります。

高周波回路は小さい電力値を扱うことが多いので、mWが良く使われます。また、アンプの利得やフィルタの損失はdBで表されます。dBmは、これらと整合性が良いためによく使われます。。

念のための注意ですが、dBは「比」を表しているので無次元です、dBmは「電力」という物理量を表します。くれぐれも間違わないようにしてください。

ちなみに、釈迦に説法だと思いますが、式(1)の係数は20、式(2)の係数は10を使っています。これは、次の理由によります。

Pを電力、Vを振幅、Rを抵抗値とすると、

    \begin{align*} P_1=\frac{V_1^2}{R} \\ P_2=\frac{V_2^2}{R} \\ \therefore \frac{P_2}{P_1}=\frac{V_2^2}{V_1^2} \end{align*}

であり、両辺の常用対数を取って10倍すると、

    \begin{align*} 10\log_{10}\frac{P_2}{P_1}=20\log_{10}\frac{V_2}{V_1} \end{align*}

となります。電力比の常用対数は「ベル」であり、「デシ」は10倍なので、左辺はデシベルです。このとき、右辺の電圧比に対する係数は20になります。

dBm、mW、mVppの関係式を導こう

50[Ω]系において、1 [dBm]は1 [mW]であり、632 [mVpp]です。これは、高周波を扱うのであれば、知っておいて損のない値です。(最後の632 [mV]は\sqrt{10}の値を知っていれば、手計算で導けます。すなわち、\sqrt{10}=3.1622(ひとまるはみいろにならぶ)なので、これを200倍して、632.44です)

では、これらの関係を導いてみましょう。
電力P [mW]はx [dBm]であり、振幅v [mVpp]だとします。

まず、電力P [mW]からx [dBm]でへの換算は定義から、

    \begin{align*} x\left[dBm\right]=10\log_{10}P\left[mW\right] \end{align*}

です。これは簡単です。

逆に、x [dBm]から電力P [mW]への換算は、

    \begin{align*} P\left[mW\right]=10^{\frac{x\left[dBm\right]}{10}} \end{align*}

です。

次に、系のインピーダンスがR[Ω]のとき、電力P [mW]を振幅v [mVpp]で表すと、

    \begin{align*} P\left[mW\right]=\frac{\left(\frac{v\left[mV_{pp}\right]}{2\sqrt{2}\cdot1000}\right)^{2}}{R\left[\Omega\right]}\cdot1000 \end{align*}

です。vを2で割る理由は、ppを振幅に直すためです。√2で割っているのは、実効値にするためです。1000で割ったり掛けたりしているのは、ミリ(m)を考慮するためです。

約分すると、

    \begin{align*} P\left[mW\right]=\frac{\left(v\left[mV_{pp}\right]\right)^{2}}{8000R\left[\Omega\right]} \end{align*}

となります。
これをv[mVpp]について解くと、

    \begin{align*} v\left[mV_{pp}\right]=20\sqrt{20\cdot P\left[mW\right]\cdot R\left[\Omega\right]} \end{align*}

となります。

これで、x [dBm]やv [mVpp]からP [mW]を計算することができ、逆にP [mW]からx [dBm]やv [mVpp]を計算することができるので、3形式間を自由に変換できるようになりました。

dBm、mW、mVppの変換フォームをExcelマクロで作ってみよう

変換方法が分かったら、これをExcelのマクロで表現してみましょう。

以下、手順を述べますが、マクロを使ったことが無い方は、まずこちらをご覧ください。「開発」タブの出し方から説明しています。

フォームの作り方

フォームを作る手順は次の通りです。

  • Excelを立ち上げます
  • 「開発」タブ→「Visual Basic」をクリック
  • 「VBAProject (Book1)」を右クリック→「挿入」→「ユーザーフォーム」
  • ツールボックスが見当たらない場合は、「表示」タブ→「ツールボックス」で、ツールボックスを出します
フォームにテキストボックスとラベルを配置する

フォームにテキストボックスとラベルを配置する

  • テキストボックスを1つ配置します
  • 配置したテキストボックスを選び、プロパティウインドウの(オブジェクト名)欄に「txtdBm」と入力して名前を付けます

※プロパティウィンドウが無い場合は、「表示」タブ→「プロパティウィンドウ」を選択して表示します

  • さらに「text」の欄に「txtdBm」と入力すると、それがテキストボックスに表示されます
  • 「font」欄の値をクリックすると「…」が現れるので、必要であればそれをクリックして、フォントやサイズを変更してください
  • 同様に、「txtmW」、「txtmVpp」、「txtOhm」のテキストボックスを作り、図のように配置します。
  • ラベルを4つ配置し、Caption欄にそれぞれ「dBm」「mW」、「mVpp」、「Ω系」と入力してテキストボックスの内容を表示します
  • キャプション部等をクリックしてフォームを選びます
  • (オブジェクト名)欄に、「frmdBmConversion」などと名前を付けます

※この名前は後でフォームを開くときに使います

  • 「F7」キーを押してエディタを表示します
  • エディタ上の全ての文字を消してから、以下のコードを貼り付けます
Option Explicit

'-----------------------------------------------------------------------
' Summary: 抵抗値のボックスを除いたテキストボックスをクリアする
'-----------------------------------------------------------------------
Private Sub TextBoxClear()
    Me.txtdBm.Text = ""
    Me.txtmW.Text = ""
    Me.txtmVpp.Text = ""
End Sub

'-----------------------------------------------------------------------
' Summary: txtdBmでキーを押した時の処理
'-----------------------------------------------------------------------
Private Sub txtdBm_KeyDown( _
        ByVal KeyCode As MSForms.ReturnInteger, _
        ByVal Shift As Integer)
        
    ' Enterキーを押したときにdBmからの変換値を計算する
    If KeyCode = vbKeyReturn Then
        Dim dblmW As Double     ' 電力[mV]
        ' 電力値をmW単位で計算する
        dblmW = 10 ^ (Val(Me.txtdBm.Text) / 10)
        ' 電力値を表示する
        Me.txtmW.Text = Format(dblmW, "0.00")
        ' 電圧振幅をmVpp単位で表示する
        Me.txtmVpp.Text = Format( _
                20 * Sqr(20 * dblmW * Val(Me.txtOhm.Text)), "0.000")
    End If
End Sub

'-----------------------------------------------------------------------
' Summary: txtmVppでキーを押した時の処理
'-----------------------------------------------------------------------
Private Sub txtmVpp_KeyDown( _
        ByVal KeyCode As MSForms.ReturnInteger, _
        ByVal Shift As Integer)
    
    ' Enterキーを押したときにmVppからの変換値を計算する
    If KeyCode = vbKeyReturn Then
        Dim dblmW As Double     ' 電力[mV]
        ' 電力値をmW単位で計算する
        dblmW = Val(Me.txtmVpp.Text) ^ 2 / Val(Me.txtOhm.Text) / 8000
        ' 電力値を表示する
        Me.txtmW.Text = Format(dblmW, "0.00")
        ' 電力値をdBm単位で表示する
        Me.txtdBm.Text = Format(10 * Log(dblmW), "0.00")
    End If
End Sub

'-----------------------------------------------------------------------
' Summary: txtmWでキーを押した時の処理
'-----------------------------------------------------------------------
Private Sub txtmW_KeyDown( _
        ByVal KeyCode As MSForms.ReturnInteger, _
        ByVal Shift As Integer)
        
    ' Enterキーを押したときにmWからの変換値を計算する
    If KeyCode = vbKeyReturn Then
        ' 電力値をdBm単位で表示する
        Me.txtdBm.Text = Format(10 * Log(Val(Me.txtmW.Text)), "0.00")
        ' 電圧振幅をmVpp単位で表示する
        Me.txtmVpp.Text = Format( _
            20 * Sqr(20 * Val(Me.txtmW.Text) * Val(Me.txtOhm.Text)), _
            "0.000")
    End If
End Sub

'-----------------------------------------------------------------------
' Summary: txtOhmでキーを押した時の処理
'-----------------------------------------------------------------------
Private Sub txtOhm_Change()
    ' 抵抗値のボックスを除いたテキストボックスをクリアする
    TextBoxClear
End Sub

'-----------------------------------------------------------------------
' Summary: フォームの初期化
'-----------------------------------------------------------------------
Private Sub UserForm_Initialize()
    ' 系のインピーダンスを暫定的に50Ωにする
    Me.txtOhm.Text = 50
    ' 抵抗値のボックスを除いたテキストボックスをクリアする
    Call TextBoxClear
End Sub

フォームを呼び出すためのおまじない

  • 「プロジェクト」欄で、「VBAProject (Book1)」を右クリック→「挿入」→「標準モジュール」
  • 現れた標準モジュールのエディタに、以下のコードを貼り付けます

※「frmdBmConversion」は上でフォームに付けた名前です

Public Sub dBm変換フォームを表示()
    frmdBmConversion.Show (vbModeless)
End Sub

実行方法

  • Excelシート→「開発」タブ→「マクロ」→「dBm変換フォームを表示」を選択→「実行」をクリック
  • 変換前の値を当該出来ストボックスに入力してEnterを押すと、他の欄に変換結果が表示されます。(図はdBmの欄に0を入力した時の実行結果)
  • Excelのファイルを保存する際には、「Excel マクロ有効ブック(*.xlsm)」で保存してください
0dBmを変換してみた

0dBmを変換してみた

まとめ

マクロのコードの中を眺めると、ここで導いた式を使っていることが分かると思います。

同様にしてマクロを組めば、長さや圧力の変換フォームも作ることが出来ます。
標準モジュールに「Public」で呼び出し関数を作ると、「開発」タブの「マクロ」から呼び出すことが出来るようになります。フォームを「vbModeless」でShowすると、フォームを開いている最中に、Excelのシートの編集をすることができます。編集をさせたくなければ、「vbModal」でShowして下さい。

コメント

タイトルとURLをコピーしました