# -*- coding: utf-8 -*-
import os
import numpy as np
import matplotlib.pyplot as plt
# -----------------------------
# Matplotlib キャッシュディレクトリ設定(警告回避)
# -----------------------------
# 書き込み可能なディレクトリを指定
os.environ['MPLCONFIGDIR'] = '/tmp/matplotlib_config' # Linux/macOS
# Windowsの場合:
# os.environ['MPLCONFIGDIR'] = r'C:\Temp\matplotlib_config'
# -----------------------------
# Received power calculation (Free-space)
# -----------------------------
def received_power(distance_m, frequency_hz, tx_power_dbm=20):
c = 3.0e8 # speed of light [m/s]
wavelength = c / frequency_hz
fspl_db = 20 * np.log10(4 * np.pi * distance_m / wavelength)
rx_power_dbm = tx_power_dbm - fspl_db
return rx_power_dbm
# -----------------------------
# Settings
# -----------------------------
distances = np.linspace(1, 200, 200) # distance [m]
tx_power_dbm = 20 # transmit power [dBm]
rx_24 = received_power(distances, 2.4e9, tx_power_dbm)
rx_5 = received_power(distances, 5.0e9, tx_power_dbm)
# -----------------------------
# Plot
# -----------------------------
plt.figure(figsize=(8,5))
plt.plot(distances, rx_24, label="2.4 GHz", color="green", linewidth=2)
plt.plot(distances, rx_5, label="5 GHz", color="blue", linestyle="--", linewidth=2)
plt.title("Received Power vs Distance (Free Space)")
plt.xlabel("Distance [m]")
plt.ylabel("Received Power [dBm]")
plt.grid(True, linestyle="--", alpha=0.7)
plt.legend()
plt.tight_layout()
plt.show()
IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KaW1wb3J0IG9zCmltcG9ydCBudW1weSBhcyBucAppbXBvcnQgbWF0cGxvdGxpYi5weXBsb3QgYXMgcGx0CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTWF0cGxvdGxpYiDjgq3jg6Pjg4Pjgrfjg6Xjg4fjgqPjg6zjgq/jg4jjg6roqK3lrprvvIjorablkYrlm57pgb/vvIkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIOabuOOBjei+vOOBv+WPr+iDveOBquODh+OCo+ODrOOCr+ODiOODquOCkuaMh+Wumgpvcy5lbnZpcm9uWydNUExDT05GSUdESVInXSA9ICcvdG1wL21hdHBsb3RsaWJfY29uZmlnJyAgIyBMaW51eC9tYWNPUwojIFdpbmRvd3Pjga7loLTlkIg6CiMgb3MuZW52aXJvblsnTVBMQ09ORklHRElSJ10gPSByJ0M6XFRlbXBcbWF0cGxvdGxpYl9jb25maWcnCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUmVjZWl2ZWQgcG93ZXIgY2FsY3VsYXRpb24gKEZyZWUtc3BhY2UpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGVmIHJlY2VpdmVkX3Bvd2VyKGRpc3RhbmNlX20sIGZyZXF1ZW5jeV9oeiwgdHhfcG93ZXJfZGJtPTIwKToKICAgIGMgPSAzLjBlOCAgIyBzcGVlZCBvZiBsaWdodCBbbS9zXQogICAgd2F2ZWxlbmd0aCA9IGMgLyBmcmVxdWVuY3lfaHoKICAgIGZzcGxfZGIgPSAyMCAqIG5wLmxvZzEwKDQgKiBucC5waSAqIGRpc3RhbmNlX20gLyB3YXZlbGVuZ3RoKQogICAgcnhfcG93ZXJfZGJtID0gdHhfcG93ZXJfZGJtIC0gZnNwbF9kYgogICAgcmV0dXJuIHJ4X3Bvd2VyX2RibQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFNldHRpbmdzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlzdGFuY2VzID0gbnAubGluc3BhY2UoMSwgMjAwLCAyMDApICAjIGRpc3RhbmNlIFttXQp0eF9wb3dlcl9kYm0gPSAyMCAgICAgICAgICAgICAgICAgICAgICMgdHJhbnNtaXQgcG93ZXIgW2RCbV0KCnJ4XzI0ID0gcmVjZWl2ZWRfcG93ZXIoZGlzdGFuY2VzLCAyLjRlOSwgdHhfcG93ZXJfZGJtKQpyeF81ICA9IHJlY2VpdmVkX3Bvd2VyKGRpc3RhbmNlcywgNS4wZTksIHR4X3Bvd2VyX2RibSkKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQbG90CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KcGx0LmZpZ3VyZShmaWdzaXplPSg4LDUpKQpwbHQucGxvdChkaXN0YW5jZXMsIHJ4XzI0LCBsYWJlbD0iMi40IEdIeiIsIGNvbG9yPSJncmVlbiIsIGxpbmV3aWR0aD0yKQpwbHQucGxvdChkaXN0YW5jZXMsIHJ4XzUsICBsYWJlbD0iNSBHSHoiLCAgY29sb3I9ImJsdWUiLCBsaW5lc3R5bGU9Ii0tIiwgbGluZXdpZHRoPTIpCgpwbHQudGl0bGUoIlJlY2VpdmVkIFBvd2VyIHZzIERpc3RhbmNlIChGcmVlIFNwYWNlKSIpCnBsdC54bGFiZWwoIkRpc3RhbmNlIFttXSIpCnBsdC55bGFiZWwoIlJlY2VpdmVkIFBvd2VyIFtkQm1dIikKcGx0LmdyaWQoVHJ1ZSwgbGluZXN0eWxlPSItLSIsIGFscGhhPTAuNykKcGx0LmxlZ2VuZCgpCnBsdC50aWdodF9sYXlvdXQoKQpwbHQuc2hvdygpCg==