Estoy tratando de aprender sobre el ruido, la sensibilidad y el teorema de Shannon-Hartley , y estoy usando algunas especificaciones para un nodo LoRa IC para probarlo.
El teorema de Shannon-Hartley dice que la tasa de datos máxima \ $ C \ $ está dada por
$$ C = BW \ log_2 \ left (1 + \ frac {S} {N} \ right). $$
Donde \ $ S \ $ y \ $ N \ $ son las potencias de señal y ruido dentro del ancho de banda totalmente utilizado \ $ BW \ $. LoRa ocupa el ancho de banda utilizando un Chirp Spread Spectrum bastante bueno del cual puedes leer más en esta gran respuesta y la pregunta allí también.
El piso fundamental para el ruido en la electrónica analógica de pequeña señal suele ser ruido térmico, y si lo comprendo correctamente, esto se debe a
$$ N \ = \ k_B \ T \ BW. $$
Calculé el límite de Shannon-Hartley para la tasa de datos máxima teórica posible para los diversos valores en la Tabla 12 de la hoja de datos, y en comparación con los bits por segundo realmente implementados a las sensibilidades citadas, me alegró mucho ver que Estoy en el estadio correcto y siguiendo muy bien la tendencia.
El límite de Shannon-Hartley siempre es un factor de 20 a 30 más rápido que la tasa indicada.
Sólo tengo curiosidad; ¿Podría ser esto un margen de seguridad, o una especificación conservadora (¿mantuvieron la sensibilidad para asegurarse de que podrían cumplirlo) o hay un factor que he olvidado?
Pregunta: ¿Estoy utilizando el teorema de Shannon-Hartley y el ruido térmico correctamente aquí?
Como beneficio adicional, ¿alguna idea de si los 14 dB son un margen de seguridad, o si el nivel de ruido en realidad no es térmico?
nota: A estas tasas, la señal está muy por debajo del ruido que también se señala en la hoja de datos.
Tabla 12 de la Rev. 5 - Agosto de 2016 de SX1276 / 77/78 de SEMTECH / 79 Hoja de datos . © 2016 Semtech Corporation www.semtech.com
deflog2(x):returnnp.log(x)/np.log(2.)importnumpyasnpimportmatplotlib.pyplotaspltkB=1.38064852E-23#JoulesK^-1"Boltzman's Constant"
T = 298. # about 25C
BW = np.array(2*[10400] + 2*[20800] + 2*[62500] + 2*[125000], dtype=float)
SF = np.array(4*[6, 12], dtype=float)
bps = np.array([782, 24, 1562, 49, 4688, 146, 9380, 293], dtype=float)
dBm = np.array([-131, -147, -128, -144, -121, -139, -118, -136], dtype=float)
lines = np.arange(1, 9)
noise = kB * T * BW # Joules K^-1 * K * s^-1 = Watts
signal = 10**(0.1*dBm-3.) # Watts
Shannon = BW * log2(1. + signal/noise)
plt.figure()
plt.plot(lines, bps, linewidth=2)
plt.plot(lines, Shannon, linewidth=2)
plt.yscale('log')
lfs, tfs = 16, 16
plt.text(6, 50, 'bps', fontsize=tfs)
plt.text(5, 250000, 'Shannon', fontsize=tfs)
plt.xlabel('line in Table 12', fontsize=lfs)
plt.ylabel('rate (Hz)', fontsize=lfs)
plt.show()