読者です 読者をやめる 読者になる 読者になる

よなかのすうがく

Audio signal processing and Electronic kit, and hobby.

cent ↔ Hzの変換式

最近、論文を読んでたら結構な割合で周波数軸をcent表記している人が多い。
よくよく考えたらチューナーなどでも合わせる対象の周波数に対してどれだけずれているかをcent表記で示していることが多い。(代表例:GarageBandのチューナーの単位もcent)
"ではcentとはなんだ?"といますと、wikipediaでは以下のように書かれています。

セントは2つの周波数の比である。平均律の半音の間隔は100セントと定義される。
オクターヴ(2つの音の周波数比が2:1)は12半音であり、1200セントである。

https://ja.wikipedia.org/wiki/%E3%82%BB%E3%83%B3%E3%83%88_%28%E9%9F%B3%E6%A5%BD%29

なんとなく分かるけど実際にHzからcentに変換するにはどう計算するのか分からなかったので、今回それについて考えてみます。



・Hz→cent変換

ではここから本題。Hz表記されたものをcent表記に直す式を考えましょう。
その時に重要になるのが基準周波数です。centは比率によって求められる値なので、基準となる周波数が必要です。
そこでよく使われるのが440Hzです。もう楽器使っているひとなら聞き覚えのある周波数ですね。そう、あのA4=440Hzです。
よくチューナーで書かれているA4=440Hzとか442Hzとかはこの基準周波数をどこに合わせているかを示しているんですね。まあ、よく考えなくても分かりますが。

そしてもう一つ重要なのが440Hz{\neq}0centであること。0centではC0のことを指しています。ではA4を逆算すると...C5の一音半(短三度)下なので、6000cent - 300cent = 5700centとなります。

では次から数式を羅列していきましょう。まあ、ここに書かれている数式はいろんな場所に調べたらあるものです。
まずは半音の音程をhとしたとき、hは以下の式で表せます。
f:id:tl_muk99:20160310152332p:plain
では1centの比をcと置いたとき、hを使って表記すると以下のように示せます。
f:id:tl_muk99:20160310152235p:plain
ここで求めたい周波数比をrとします。このrをcをどれだけ掛けたかで表現すれば良い。つまりは以下の式で示せる。
f:id:tl_muk99:20160310152122p:plain
この式におけるxを求めたいので対数(log)を使いましょう。logを用いて表現したら以下のようになります。
f:id:tl_muk99:20160310152013p:plain
では最後にrを基準周波数F_{b}とcentに直したい周波数fの比で表現します。また注意するのが基準周波数であるA4は5700centなので、その値を足してあげましょう。
f:id:tl_muk99:20160310151802p:plain
これでHz→centの変換式が求まりました。

・cent→Hz変換

ここでやることは非常に簡単。先ほど導出したHz→centの式におけるfを求めるように変換するだけ。一気にやりましょう。
f:id:tl_muk99:20160310151547p:plain
これでcent→Hzの変換式も求まりました。


実際にPythonで書くとこんな感じです。
hzにはcentに直したい周波数、baseには基準周波数、centにはHzに直したい音程を入れています。

# coding:utf-8
import numpy as np

## Hz->Cent変換
hz = 18.35 # D0
base  = 440.0
ans = 1200 * np.log2(hz/base) + 5700
print "Real: " + str(ans) + "[cent]"
print "Int:  " + str(round(ans, 0)) + "[cent]"

## Cent->Hz変換
cent = 2100.0 # A1
ans = base * (2**((cent - 5700)/1200))
print "Freq: " + str(ans) + "[Hz]"


結果はこんな感じに

>> Real: 199.618133317[cent]
>> Int:  200.0[cent]
>> Freq: 55.0[Hz]