中央道で FM 局を快適に聞き続ける

folium を通じた、FM 局の移ろい

 世の中にはいろいろな media があるけれど、一番気に入っているものに FM ラジオがある。音楽もニュースもいろいろな方の話を聞くことができ、それでいて、自分に入ってくる情報量がちょうどいい。動画を見ることと他の事を並行させることはなかなか難しいし、本を読むならばむしろ没入したい。自分の時間と、ラジオという外部の時間は無理なく、そしてほどよく混ざり合う。

  ロングドライブでも、気に入った曲を集めたものと同じ程度かそれ以上に、ラジオに耳を傾ける。ラジオの世界には、何時でもどこでも出入り自由ではあるが、それでいて、確かな時間と場所の特徴がある。

 東京の自宅を出、諏訪湖を眺め、安曇野の清水に映えるわさびの緑に心を洗われる。その後は、知多半島を目指し常滑へ。そんなドライブの間、切り替わる FM 局の流れをもっときちんと知りたい、長いことそう考えていた。

 

目次

folium を通じた、FM 局の移ろい

1.FM 電波はどの位届くのか

 1-1.見通し距離の求め方 ~ アマチュア無線の国家試験から

 1-2.実際のアンテナの見通し距離を計算

 1-3.実際のリスナーの方の声

2.folium 

3.中央道沿いの "FM局" サービスエリア

4.code はこんな感じです

5.まとめ

 

1.FM 電波はどの位届くのか

 FM 放送が実際どの辺りまで聞くことが出来るのか、サービスエリアに関する情報は、検索しても思いの外情報がありませんでした。VHF 帯の電波を使用する FM 放送は、直接波による伝播なので、建物や地形、マルチパスなど、仮にアンテナからの距離が同じであったとしても、受信状況が同じとは確かに言い切れません。

 とはいえ、直接波による伝播の到達距離を求める方法は、明確に計算できます。

1-1.見通し距離の求め方 ~ アマチュア無線の国家試験から

 アマチュア無線の世界では、国家試験にも登場するほどの必須な知識のようです。詳細は、過去問を扱った色々なサイトで詳しく解説されています。

www.gxk.jp

 ザックリ言えば、見通し距離 D は、地球の半径を R (6370 Km)、送信アンテナの高さを h1 (m)、受信アンテナの 高さを h2 (m)、とすると、単位をそろえて三平方の定理を使い、

 D = √*1   (m)

で求められます。言葉にすれば、「送信アンテナから出た電波が、地球表面をかすめ、受信アンテナに達する」距離を見通し距離と呼ぶ、ということになります。

 ただし、電波は大気密度によって伝わり方が変わる(地面の方に曲げられる)ので、実際の到達距離は直線距離よりも伸びます。その効果を上式に取り入れるために、地球の半径 R (km) の代わりに、等価地球半径 KR (8490 km) という値を使うそうです。すると、見通し距離は次式で近似できることになります。

 D = 4121 × (√(h1) + √(h2)) (m)

 理論的な話はこの位にして、この近似式で実際計算してみました。

 

1-2.実際のアンテナの見通し距離を計算

 アンテナの場所に関するデータは以下のサイト使わせて頂きました。

www.denpa-data.com

全部見ていませんが、地方別に放送局の周波数、出力、アンテナの場所が網羅されており驚きです。

 また、地名や住所を入力すると、緯度経度を教えてくれる素晴らしいサイトがありました。今回の企画が実現できたのも、これらのサイトを見つけられたからです。

www.geocoding.jp

100.9 Km 東京スカイツリー
71.4 Km 東京タワー
81.4 Km 境川町坊ケ峰
110.6 Km 長野市地附山
116.6 Km 茅野市晴ヶ峰
70.2 Km 土岐市八剣山
115.8 Km 岡崎市本宮山
74.9 Km 志摩市青峰山
352.1 Km 航空機 (FL240)
447.7 Km 同(FL390)

 描画に使ったアンテナのある場所の標高を h1、受信アンテナは地表 0 (m) として代入してみました。もちろん正確には、h1 は、標高にアンテナの高さを加えなくてはいけませんが、そもそも分かりませんし、車で tuning しながら走る分には、実際には大差ないとひとまずしました。計算法は以下の通りです。 

import math
import numpy as np

def lineofsight(x):
d = 4121*(math.sqrt(x))/1000 # km
return d

stns = ['東京スカイツリー', '東京タワー', '境川町坊ケ峰', '長野市地附山', '茅野市晴ヶ峰', '土岐市八剣山', '岡崎市本宮山', '志摩市青峰山', '航空機 (FL240)', '同(FL390)']
heights = [600, 300, 390, 720, 800, 290, 790, 330, 7300, 11800]

for stn, h in zip(stns, heights):
dist = lineofsight(h)
print('{:5.1f}'.format(dist)+ ' Km ', stn)

 アンテナからは大体 100 km 前後、もちろん、標高が高いければその分到達距離も伸びます。

 また参考に、航空機からの無線の到達距離も計算してみました。航空機無線の場合、その到達距離は概ね 200 NM 前後とも言われているので、やや大きめのような気もします。

 ただちょっと疑問なのは、電波の出力による差異はどう考慮すべきなのか、ということです。建物、地形の影響は別として、出力が違えば、到達距離による受信強度は変わるはずです。例えば、J-Waveスカイツリーからの出力は 7KW、航空機無線は 30W、コミュニティ無線は最大 20W 等、その出力は様々です。その疑問は、体験者の声に耳を傾けることで、ひとまず解決しました。

 

1-3.実際のリスナーの方の声

 アマチュア無線のように送受信を楽しまれる方もいらっしゃれば、BCL のように聴くのがメインという方もいらっしゃいます。見通しが良い時、出力 20W のコミュニティ FM の電波を 100 Km を超えて受信された方もいらっしゃいました。

b9audio.blog.ss-blog.jp

 ということで、直接波の到達距離は、大きくは見通し距離で決まる、ということで今回は描画を試みます。もっとも、1-2.の 8 か所のアンテナの出力は、一応すべて 50W 以上としています。

 

2.folium 

 Python を使った描画には、 matplotlib や Basemap、Cartopy と同様、folium というライブラリも有名なようで、"The Python Gallery" というサイトでも使用例が出ています。

 使用可能な Map tile(地図の種類)については、公式サイトに書いていないものも使えていたり、反対に使えなくなったものもあるようで、先ほどのサイトでも、"mapbox" シリーズ 3 種は読み込めませんでした。zoom レベルによって変わるのかもしれませんが、よく分かりません…。

python-graph-gallery.com

 

3.中央道沿いの "FM局" サービスエリア

 ようやく描いてみたかった図にたどり着きました。ひとまず結果はこんな感じです。

f:id:ohigehige:20201008114316j:plain

 イメージとしては、J-wave (81.3Mhz) を聞きながら出発、山間に入り、聞きづらくなってきたら、FM-FUJI (83.0) / NHK (85.6) に変え、標高が上がるにつれ、FM 長野の周波数をはしご (81.8, 83.3 など)。諏訪湖安曇野に癒された後は、FM-GIFU (81.5)、ZIP-FM (77.1) と radio CUBE (78.1) 愛知と三重県の放送を楽しみながら、常滑に到着です。

 

4.code はこんな感じです

import math
import numpy as np
import folium

def lineofsight(x):
d = 4121*(math.sqrt(x)) # m
return d

# 東京スカイツリー、東京タワー、境川町坊ケ峰、長野市地附山、茅野市宮川晴ヶ峰
# 土岐市八剣山、岡崎市本宮山、志摩市青峰山

lats = [35.7101, 35.6586, 35.3956, 36.6733, 35.9809, 35.2978, 34.9096, 34.4089]
lons = [139.8107, 139.7454, 138.6151, 138.1971, 138.1432, 137.1996, 137.4206, 136.8242]
heights = [600, 300, 390, 720, 800, 290, 790, 330]
colors = ['red', 'darkred', 'orange', 'lightgreen', 'beige', 'aqua', 'blue', 'purple']

m = folium.Map(location=[35.5, 138.5], tiles="stamenterrain", zoom_start=8)

for lat, lon, h, c in zip(lats, lons, heights, colors):
folium.Circle(location=[lat, lon], radius=lineofsight(h),
color=c, fill=True, fillcolor=c
).add_to(m)

m.save('radiomap.html')
m

 

5.まとめ

 今回は、folium を使ったというだけで、code 的には大したことをしているわけではありません。

 ただ、ロングドライブに出る時、

 「だんだん聞こえなくなってきた → サーチをかける or 看板の周波数に変更」

を繰り返すだけでは全く芸が無いので、ある程度流れを把握して走りたいとずっと思っていました。予想通り、FM ラジオ局の数はなかなか多いですし、アンテナの場所を調べるのも、難しくはないのですが手間がかかります。もっとも、8 つやった程度で音を上げていたら、先人の方達にはお叱りを受けそうですね。

 少しのお金を払って radiko を聞けば、時間にも場所にも縛られることなく FM 放送漬けですが、Internet で聞くのならば、ラジオ放送でなくともよい、という選択も出てきます。

 やっぱり FM 放送は、時間にも場所にも多少縛りはあるけれど、入ってくる情報量がちょうど良い、ある意味時間芸術のような面があるから私は止められません。

 そのうち、違うドライブルートでもやってみようと思います。

 

長文最後までお付き合いありがとうございました。

*1:R + h1)^2 - R^2) + √((R + h2)^2 - R^2