LoRa SX1262 速率计算公式
LoRa调制技术的速率(比特率)可通过以下公式计算: [ R_b = \frac{SF \cdot BW}{2^{SF}} \cdot CR ] 其中:
- ( R_b ):比特率(bps)
- ( SF ):扩频因子(Spreading Factor,取值范围6~12)
- ( BW ):带宽(Hz,常见值125 kHz、250 kHz、500 kHz)
- ( CR ):编码率(Coding Rate,取值1~4对应4/5~4/8)
参数说明与典型值
扩频因子(SF)
LoRa的核心参数,直接影响速率和灵敏度。SF值每增加1,速率大约减半,但传输距离增加。SX1262支持的SF范围为6~12。
带宽(BW)
常用值为:
- 125 kHz(默认)
- 250 kHz
- 500 kHz
带宽越大,速率越高,但抗噪性会降低。
编码率(CR)
纠错编码比例,通常表示为 ( \frac{4}{4+CR} )。例如:
- CR=1 → 4/5
- CR=2 → 4/6
- CR=3 → 4/7
- CR=4 → 4/8
CR越高,纠错能力越强,但有效速率降低。
实际速率计算示例
以SF=7、BW=125 kHz、CR=1(4/5)为例: [ R_b = \frac{7 \times 125000}{2^7} \times \frac{4}{5} = \frac{875000}{128} \times 0.8 \approx 5468.75 \text{ bps} ]
其他常见配置的速率:
- SF=12, BW=125 kHz, CR=4 → 约293 bps
- SF=7, BW=500 kHz, CR=1 → 约21875 bps
低速率优化(SX1262特有功能)
SX1262支持低速率优化(Low Data Rate Optimization),当符号周期超过16 ms时自动启用,可改善灵敏度。计算公式中需考虑符号时间: [ T_{sym} = \frac{2^{SF}}{BW} ] 若 ( T_{sym} > 16 \text{ ms} ),建议启用低速率优化。
注意事项
- 速率与距离、抗干扰性存在权衡,高SF和低BW适合远距离,但速率低。
- 实际速率还需考虑数据包头、前导码等开销。
- SX1262支持LoRa和FSK调制,上述公式仅适用于LoRa模式。
以下是一个动态计算LoRa速率的HTML页面脚本实现,包含表单输入和实时计算结果展示功能:
HTML结构
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>LoRa速率计算器</title>
<style>
body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
.container { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.input-group { margin-bottom: 15px; }
label { display: block; margin-bottom: 5px; font-weight: bold; }
input, select { width: 100%; padding: 8px; box-sizing: border-box; }
.result { background-color: #f5f5f5; padding: 15px; border-radius: 5px; }
h3 { margin-top: 0; color: #333; }
</style>
</head>
<body>
<h1>LoRa速率计算器</h1>
<div class="container">
<div class="input-section">
<div class="input-group">
<label for="sf">扩频因子 (SF):</label>
<select id="sf" onchange="calculate()">
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10" selected>10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>
</div>
<div class="input-group">
<label for="bw">带宽 (kHz):</label>
<select id="bw" onchange="calculate()">
<option value="125">125</option>
<option value="250">250</option>
<option value="500">500</option>
</select>
</div>
<div class="input-group">
<label for="cr">编码率 (CR):</label>
<select id="cr" onchange="calculate()">
<option value="1">4/5 (1)</option>
<option value="2">4/6 (2)</option>
<option value="3">4/7 (3)</option>
<option value="4" selected>4/8 (4)</option>
</select>
</div>
<div class="input-group">
<label for="payload">负载长度 (bytes):</label>
<input type="number" id="payload" value="20" min="1" onchange="calculate()">
</div>
<div class="input-group">
<label for="preamble">前导码长度:</label>
<input type="number" id="preamble" value="8" min="1" onchange="calculate()">
</div>
</div>
<div class="result-section">
<div class="result">
<h3>计算结果</h3>
<p>符号速率: <span id="symbolRate">0</span> 符号/秒</p>
<p>比特率: <span id="bitRate">0</span> bps</p>
<p>空中传输时间: <span id="airTime">0</span> 毫秒</p>
<p>有效数据速率: <span id="effectiveRate">0</span> bps</p>
</div>
</div>
</div>
<script>
// 计算函数将在下方实现
</script>
</body>
</html>
JavaScript计算逻辑
function calculate() {
// 获取输入值
const sf = parseInt(document.getElementById('sf').value);
const bw = parseInt(document.getElementById('bw').value);
const cr = parseInt(document.getElementById('cr').value) + 4;
const payload = parseInt(document.getElementById('payload').value);
const preamble = parseInt(document.getElementById('preamble').value);
// 计算符号持续时间 (Ts)
const Ts = Math.pow(2, sf) / (bw * 1000);
// 计算符号速率 (Rs)
const Rs = (bw * 1000) / Math.pow(2, sf);
document.getElementById('symbolRate').textContent = Rs.toFixed(2);
// 计算比特率 (Rb)
const Rb = sf * Rs * (4 / cr);
document.getElementById('bitRate').textContent = Rb.toFixed(2);
// 计算空中传输时间 (Tp)
const payloadSymbNb = 8 + Math.max(Math.ceil((8 * payload - 4 * sf + 28 + 16) / (4 * (sf - 2 * 0))) * (cr + 4), 0);
const Tp = (preamble + 4.25 + payloadSymbNb) * Ts * 1000;
document.getElementById('airTime').textContent = Tp.toFixed(2);
// 计算有效数据速率
const effectiveRate = (payload * 8) / (Tp / 1000);
document.getElementById('effectiveRate').textContent = effectiveRate.toFixed(2);
}
// 初始计算
calculate();
计算公式说明
符号持续时间 (Ts): [ Ts = \frac{2^{SF}}{BW} ] 其中SF为扩频因子,BW为带宽(Hz)
符号速率 (Rs): [ Rs = \frac{BW}{2^{SF}} ]
比特率 (Rb): [ Rb = SF \times \frac{BW}{2^{SF}} \times \frac{4}{CR} ] 其中CR为编码率(4/5到4/8)
有效负载符号数: [ PayloadSymbNb = 8 + \max\left(\left\lceil\frac{8 \times PL - 4 \times SF + 28 + 16}{4 \times (SF - 2 \times 0)}\right\rceil \times (CR + 4), 0\right) ]
空中传输时间 (Tp): [ Tp = (Preamble + 4.25 + PayloadSymbNb) \times Ts ]
这个实现允许用户动态调整LoRa参数并实时查看计算结果,包括符号速率、比特率、空中传输时间和有效数据速率。页面布局分为输入区域和结果展示区域,所有计算会在参数变化时自动更新。
2457

被折叠的 条评论
为什么被折叠?



