BladeRF基于matlab的GPS L1接收机
0.简单说明
0.1开发环境
- 本人使用MATLAB 2021 ,低版本应该可以使用,但是不做保证
- 需要额外下载链接库(链接库会包含在本项目中,其他文件以及bladerf测试详见nuand网站)
- 项目使用BladeRF XA4)
0.2版本信息
- 当前版本:1.0.2
- 更新日期:18/11/2021
- 作者:xiaoyeyimier
- 联系方式:xiaoyeyimier@163.com
- 当前md仅用作交流,维护程序,谢谢。
0.3 其他说明
- 如有不足之处请gitee下Issue或者邮件我
1.BladeRF Setup
1.1下载Installer
最新的安装程序可以在以下的链接下载到:
https://nuand.com/windows_installers/bladeRF-win-installer-latest.exe
历史版本见:
https://nuand.com/installers.php
在安装程序成功完成前,不要连接bladeRF,除非固件升级控制台指示这样做。首先运行exe文件。如果Windows提示是否允许程序执行,请在单击“是”之前验证该发行商是否为Nuand, LLC。启动后,将显示一个欢迎视窗,如下所示。根据提示操作就行。
1.2 固件更新
下面的页面提供了在安装过程中更新bladeRF固件的选项。v2.0.0 bladeRF固件引入了一个新的USBVID/PID。这需要libbladeRF (bladeRF.dll) v1.16.0或更高版本。然而,第三方应用程序或其他系统(例如,实时映像、Linux发行版)可能提供较旧的libbladeRF版本,这些版本无法检测到运行这个新固件的设备。
因此,v1.9.1固件也提供了反向兼容性的目的。总是可以使用bladeRF-cliprogram2在稍后的时间升级(或降级)固件。FX3固件镜像在bladerf安装中的FX3固件文件夹中提供。这个安装程序也可以重新运行以在v1.9.3和v2.0.0固件之间切换。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sPT9TLSZ-1637484445278)(https://i.loli.net/2021/11/18/WEKfm3ujV6g1nQ9.png)]
1.3 MATLAB®搜索路径
如果检测到安装了64位MATLAB,将显示以下视窗。建议选择将bladeRF项添加到MATLAB搜索路径的默认选项。
1.4 开始菜单
这个页面提供了自定义开始菜单位置的功能,在该位置可以放置到bladeRF-cli和卸载程序的快捷方式。
1.5 安装
按照提示操作(懒得翻译了,ψ(`∇´)ψ)
1.6 系统路径
在安装结束时,将显示以下视窗。将bladeRF项目添加到%PATH%将允许从cmd.exe执行bladeRF-cli,以及其他程序来定位bladeRF.dll
1.7 安装完成
完成前面的步骤后,将显示最后的完成视窗。重要地,为了使对系统路径和MATLAB搜索路径变量的更改生效,您可能需要注销并重新登录
1.8 测试基本设备接入
验证安装成功的一种快速方法是使用bladeRF-cli程序查看有关bladeRF的信息。可以从开始菜单中选择的位置执行bladeRF-cli的快捷方式。也可以通过cmd.exe执行命令:在命令行界面中,bladeRF-cli -iOnce可以通过version、info、print命令获取设备信息。示例输出如下所示。
1.9 MATLAB搜索路径
如果在第1.3小节中没有将bladeRF项添加到MATLAB搜索路径中,那么以下路径必须提供给MATLAB 的 addpath函数。;例如:
c:\Program Files\bladeRF\x64
C:\Program Files\bladeRF\matlabChange C:\Program Files\bladeRF
- 至此所有安装结束(不清楚的戳这里┐( ‾᷅㉨‾᷅ )┌ )
2.项目简介
2.1 目的
接IQ GPS L1数据,验证BladeRF功能
2.2 基本baldeRF设置
基本配置见于:\SetBladeRF.m
%% set bladerf
rootpath = cd;
DevSettings.sampletime = 30; % Data receiving time [s]
DevSettings.num_rxs = 10; % Number of batches stored [times]
DevSettings.Fs = 6e6; % Sampling Frequency [Hz]
DevSettings.Fc = 1575.42e6; % Center Frequency [Hz]
DevSettings.Bw_rx = 1.5e6; % Bandwidth [Hz]
DevSettings.num_buf = 512; % buffer size of BladeRF
DevSettings.channel = 'RX2'; % Choose Channel 'RX1'/'RX2'
DevSettings.biastee = 1; % Biastee (1/0 = open or close)
DevSettings.dataType = 'double'; % Data type (BladeRF & GPS Receiver)
DevSettings.SavePath = [rootpath,'\',...
datestr(now,'mmmm-dd-yyyy__HH-MM-SS')];% Save file path named as now time
DevSettings.FileName = datestr(now,'mmmm-dd-yyyy__HH-MM-SS'); % Stored file named as now time
DevSettings.LibPath = 'C:\Program Files\bladeRF\matlab'; % BladeRF matlab lib
DevSettings.RealTimeProcess = true; % if RealTimeProcess = false,use history data
DevSettings.HistoryDataPath = 'C:\matlab项目\BladeRF_GPS\有源天线_10_8\'; % It only works when RealTimeProcess = false
DevSettings.HistoryDataName = 'GPSData@Fs10000KHz_Fc1575420KHz_Bw200_'; % It only works when RealTimeProcess = false
DevSettings.FileType = 'txt'; % File type (BladeRF & GPS Receiver)
字段 | 单位 | 意义 |
---|---|---|
sampletime | 秒 | 采样时间 |
num_rxs | 次 | 储存批次数 |
Fs | Hz | 采样频率 |
Fc | Hz | 中心频率 |
Bw_rx | Hz | 带宽 |
num_buf | 个 | BladeRF的缓冲大小 |
channel | ‘RX1’/‘RX2’ | 通道号 |
biastee | 1/0 | 宽带放大器馈电电路 |
dataType | MATLAB数据格式 | 保存数据格式 |
SavePath | 可设置 | 保存数据路径,不建议修改 |
FileName | 可设置 | 保存数据文件名,不建议修改 |
LibPath | 自行选择 | BladeRF链接库位置(忘记了戳这里,再戳这里) |
RealTimeProcess | true/false | true接收机直接使用当前数据,false使用历史数据 |
HistoryDataPath | 自行选择 | 如果选择回放历史数据,其路径 |
HistoryDataName | 自行选择 | 如果选择回放历史数据,其文件名 |
FileType | txt | 读取和保存文件的类型 |
我们知道matlab是无法实现多线程的,因此我们再文件存储时就没法进行接收机的数据读取,造成实际接收数据存在一定的gap,所以采样时间、储存批次数之间的关系就显得很重要,储存批次数太大,gap过多可能导致无法跟踪。储存批次数太小,开辟内存太大,可能导致程序卡死。如当前程序采样30秒,分10批次,一次采集3s数据,需要开辟
2
×
T
t
o
t
a
l
s
a
m
p
l
e
N
r
x
s
×
F
S
×
L
D
a
t
a
T
y
p
e
=
2
×
30
10
×
1
0
7
×
8
=
480
M
B
y
t
e
s
2\times\frac{T_{totalsample}}{N_{rxs}}\times F_S\times L_{DataType}=2\times\frac{30}{10}\times10^7\times8=480MBytes
2×NrxsTtotalsample×FS×LDataType=2×1030×107×8=480MBytes
2.2 输出格式
成功运行一次程序,输出一个文件夹,文件夹格式mm-dd-yy_hour-min-sec,如下图所示:
文件夹中包含Idata,Qdata,Log三个文件。
其中Log文件记录了一些当前运行时的接收机设置
接收机部分是一个功能非常不完全的接收机,实际上我只是为了验证数据接收完好,读取有效而抄了一小段程序。仅包含了捕获和跟踪,没有定位。欢迎使用者自己开发。~( ̄▽ ̄~)~
显示捕获结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z4ibH7HY-1637484445292)(https://m1.im5i.com/2021/11/18/UnCJc3.png)]
显示跟踪结果(这个中间掉电了┐( ‾᷅㉨‾᷅ )┌ )
3.硬件链接
硬件连接需要注意:
- USB保证是3.0接口
- 需要一个biastee,不知道为什么内置biastee打开了也没用
- 不要用电脑USB端口给biastee供电,电流不够,需外接移动电源
4.接收机配置
%% Processing settings ===========================================
% Number of milliseconds to be processed used 36000 + any transients (see
% below - in Nav parameters) to ensure nav subframes are provided
%% read settings of bladerf
Fs = DevSettings.Fs;
IF = DevSettings.Fc-1575.42e6;
Bw = DevSettings.Bw_rx;
ms2Process = 25000; %[ms]
ms2Skip = 50; %[ms]
dataType = DevSettings.dataType;
eval(['Tempa=',dataType,'(0);']);
Info_A = whos('Tempa');
BytesPerData = Info_A.bytes;
skipNumberOfBytes = ms2Skip*Fs*BytesPerData*1e-3;
%% Acquisition settings ==========================================
% List of satellites to look for. Some satellites can be excluded to speed
% up acquisition
% Intermediate, sampling and code frequencies
AcqSettings.samplingFreq = Fs;
AcqSettings.codeLength = 1023;
AcqSettings.IF = IF;
AcqSettings.acqSearchBand = 10;
AcqSettings.acqSatelliteList = 1:32;
AcqSettings.acq_Acc_ms_No = 5;
AcqSettings.OnlyI = false;
AcqSettings.codeFreqBasis = 1.023e6;
AcqSettings.acqThreshold = 2;
AcqSettings.numberOfChannels = 8;
%% Tracking loops settings =======================================
%% Fields of settings used
TrackingSettings.msToProcess = ms2Process;
TrackingSettings.skipNumberOfBytes = skipNumberOfBytes;
TrackingSettings.numberOfChannels = 8;
TrackingSettings.codeFreqBasis = 1.023e6;
TrackingSettings.samplingFreq = Fs;
TrackingSettings.codeLength = 1023;
TrackingSettings.Pa = 5e-3;
TrackingSettings.BytesPerData = BytesPerData;
% Code tracking loop parameters
TrackingSettings.dllDampingRatio = 0.7;
TrackingSettings.dllNoiseBandwidth = 2; %[Hz]
TrackingSettings.dllCorrelatorSpacing = 0.5; %[chips]
% Carrier tracking loop parameters
TrackingSettings.pllDampingRatio = 0.7;
TrackingSettings.pllNoiseBandwidth = 25; %[Hz]
TrackingSettings.dataType = dataType;
TrackingSettings.IsBlanking = true;
4.1 捕获参数
字段 | 单位 | 意义 |
---|---|---|
msToProcess | Hz | 采样频率 |
codeLength | bits | 伪码长度 |
IF | Hz | 中频 |
acqSearchBand | KHz | 多普勒搜索带宽 |
acqSatelliteList | 编号无量纲 | 卫星编号PRN |
acq_Acc_ms_No | 个(毫秒) | 非相干积分时间(多少个毫秒) |
OnlyI | true/false | 1只是用I支路,0用IQ支路 |
codeFreqBasis | bits/s | 伪码速率 |
acqThreshold | 比值无量纲 | 相关峰主峰与次峰门限 |
numberOfChannels | 个 | 最大捕获个数 |
4.2 跟踪参数
字段 | 单位 | 意义 |
---|---|---|
skipNumberOfBytes | bits | 跳过起始不稳定时间 |
Pa | 概率无量纲 | 干扰消除虚警率(计算门限用) |
dataType | MATLAB数据格式 | 读取·数据格式 |
IsBlanking | SavePathtrue/false | 可设置是否进行干扰消除 |
其余参数为标准CT参数,懒得解释了。
5.下载
本项目可移步gitee下载,更多设置(比如Linux环境下配置和TX的使用)可以参考Nuand的GitHub仓库