一、简介
本文介绍 PEPS 接近检测系统中对 RSSI 值的处理。价绍包含处理方式、思路、原理、以及实现方法,过程中会概述处理的算法原理,对实际测量数据的处理等。文中数据是由 PEPS 方案(基站 NXP PCF7991、钥匙 NXP NCF29A1)所测实际数据。
二、背景
1、PEPS 背景
PEPS 系统主要有两种系统:被动无钥门禁系统(PKES) 和远程无钥匙进入系统 (RKES),该项技术被广泛应用于车辆门禁无钥匙进入系统、车辆无钥匙启动系统、电摩接近检测系统等应用领域。
接近检测系统基于 RFID 定位技术,该技术基于接收的信号强度指示(RSSI),信号传播有着以下规律,发射端距离越近,接收端所测得信号强度越强,发射端距离越远,接收端所测得信号强度越弱,因此可以通过接收的信号强度指示推算出基站的大概距离。其基本原理是利用射频信号和空间耦合(电磁耦合或电磁传播)传输的特性。
2、RSSI 技术背景
在 IEEE 802.11 标准中定义无线网卡或 AP 的电路能够测量 RF 值,这个值即为接收信号强度指示(RSSI Received Signal Strength Indicator)。RSSI 的初衷是给适配器的微代码和驱动程序内部使用,当无线网卡需要传送一个包时,RSSI 用来确定无线信道是否空闲。
三、基本思路
1、实现方式
实际测量实验环境下,对应距离 RSSI 值的数据,通过对数据分析,拟合出趋势线函数关系,利用该趋势线函数通过样本求得未知的数据。
2、曲线拟合
实际条件中,变量间未必都有线性关系,曲线拟合(curve fitting)是指选择适当的曲线类型来拟合观测数据,并用拟合的曲线方程分析两变量间的关系。曲线拟合是一种数据处理方法, 定义为用解析表达式逼近离散数据的方法。
曲线的直线化是曲线拟合的重要手段之一,对于某些非线性的数据可以通过简单的变量变换使之直线化,这样就可以按最小二乘法原理求出变换后变量的直线方程。
四、最小二乘法原理
1、算法概述
最小二乘法是一种数学优化算法,被广泛地应用于非线性方程中。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以通过样本求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和最小。
如下图中,红色实线即为样本实际值与拟合函数之间的差值,在算法实现过程中就是使得这个差值的平方和最小,以达到最佳拟合效果。
最小二乘法寻找拟合函数 f(x) 的原理和思想关键:使得所有x和y相对拟合直线的平方和误差总和最小。
最小二乘法数学公式:
五、RSSI 数据处理
1、polyfit() 函数
polyfit 函数是 matlab 中常用于进行曲线拟合的一个函数。其数学基础是利用最小二乘法曲线拟合原理。
调用方法:polyfit(x,y,n),x 为源数据点对应的横坐标,这里对应为钥匙离基站的距离,y 为源数据点对应的纵坐标,这里对应为钥匙对应距离所测 RSSI 值,n 为要拟合的阶数,一阶直线拟合,二阶抛物线拟合,并非阶次越高越好,看拟合情况而定。
下图为对原始数据进行 1、3、5、7 阶次拟合趋势线图
使用 polyfit() 函数拟合
import matplotlib.pyplot as plt
import numpy as np
# 钥匙离基站的距离
x = [0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 0.90, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.10, 2.20, 2.30, 2.40, 2.50, 2.60, 2.70, 2.80]
# 对应距离钥匙所测 RSSI 值
y = [32.13, 14.5, 8.328125, 5.015625, 3.234375, 2.21875, 1.578125, 1.226562, 0.955078, 0.769531, 0.628906, 0.519531, 0.4375, 0.378906, 0.333984, 0.289062, 0.253906, 0.226562, 0.203125, 0.189453, 0.169922, 0.158203, 0.144531, 0.132812, 0.121094, 0.113281]
# 拟合 1 阶
p = np.polyfit(x, y, 1)
# 合并多项式
c = np.poly1d(p)
print(c)
# 对原始数据画散点图
plt.scatter(x, y, marker='o', label='original datas',color='r')
# 画出拟合函数曲线图
plt.plot(x, c(x), 'b',label='one polyfit')
plt.legend()
plt.show()
2、curve_fit() 函数
随着拟合阶数的增加拟合出的多项式越来越复杂,不利于实际应用。所以采用 python 中 scipy 模块的子模块 optimize 中提供了一个专门用于曲线拟合的函数 curve_fit(),对 RSSI 值做处理。
curve_fit() 函数不仅可以用于直线、二次曲线、三次曲线的拟合和绘制,仿照代码中的形式,可以适用于任意形式的曲线的拟合和绘制,只要定义好合适的曲线模型方程即可。
采用趋势曲线模型:
下图为对原始数据进行拟合趋势线图,可以看出拟合效果较好,趋势函数可以用作表示 RSSI 与距离关系数据的趋向。
使用 curve_fit()函数拟合
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
# 钥匙离基站的距离
x = [0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 0.90, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.10, 2.20, 2.30, 2.40, 2.50, 2.60, 2.70, 2.80]
# 对应距离钥匙所测 RSSI 值
y = [32.13, 14.5, 8.328125, 5.015625, 3.234375, 2.21875, 1.578125, 1.226562, 0.955078, 0.769531, 0.628906, 0.519531, 0.4375, 0.378906, 0.333984, 0.289062, 0.253906, 0.226562, 0.203125, 0.189453, 0.169922, 0.158203, 0.144531, 0.132812, 0.121094, 0.113281]
def fund(x, a, b):
return x ** a + b
popt, pcov = curve_fit(fund, x, y)
# popt数组中,值分别是待求参数a,b
yvals = [fund(i, popt[0], popt[1],) for i in x]
print("RSSI = x^", popt[0], "+", popt[1])
# 对原始数据画散点图
plt.scatter(x, y, marker='o', label='original datas',color='r')
# 画出拟合函数曲线图
plt.plot(x, c, label='fitted curve',color='g')
plt.legend()
plt.show()
3、Excel 数据处理
除了使用程序来处理数据,也可以利用一些便捷的工具分析数据,Excel 中对数据生成曲线的拟合趋势线,所用到的算法原理也是最小二乘法。
1、选择数据生成原始数据的散点图,选择任意数据。
2、单机右键添加趋势线,会生成该数据趋势线,以及设置趋势线格式窗口。
3、选择合适趋势线模型,这里幂乘函数趋势线更加拟合原始数据,选择显示趋势线公式。
评论
Gumustech 00905326688286
2023年3月4日