看一下这本书:《Software Defined Radio using MATLAB Simulink and the RTL-SDR》,这篇文章主要说一下环境配置与测试
下载地址:https://ww2.mathworks.cn/campaigns/offers/download-rtl-sdr-ebook.html
很明显,用的 Matlab 和 RTL-SDR,Matlab 可以淘宝30多块钱买个账号
RTL-SDR 尽量买原装进口的,我试了两家不同的国内产的 RTL-SDR,在别的软件上都可以用,但是 Matlab 识别不了,最后狠心买了个贵的原装进口的一点阻碍都没有,很轻松的就识别了
Matlab 下好之后去附加功能中搜索 RTL SDR 安装就行,然后点击管理
如果没装过驱动应该会让你用 zadig 安装驱动。然后 Test Connection,能找到设备就行
或者直接在命令行敲命令:sdrinfo,检查能不能识别到
同时在 Simulink 中应该也有了 RTL SDR 的模块,选择 Simulink,然后随便创建一个
在 Library Browser 中就可以看到了,这是一个 RTL-SDR 的接收机,它是一个参数化的接口,可以实时的把 RTL-SDR 的采样值送入 Simulink
将附件中的 rtlsdr_book_library 添加到路径中
然后看一下 Simulink Library Browser,是不是有 RTL-SDR Book Library 这个库,没有的话刷新一下
打开附件的 intro\rtlsdr_rx_startup_simulink.slxc 之后,修改 Centre Frequency 的频率为 433.92MHz 就能收到 433.92MHz 的信号了
点击上面的 Run,运行起来,找个 443 的射频遥控器按一下就能看到频谱图出现了变化
然后来看一下 rtlsdr_rx_startup_matlab.m,这是 Matlab 的代码,里面先设置了一堆 RTL-SDR 的参数
rtlsdr_id = '0'; % RTL-SDR ID
rtlsdr_tunerfreq = 433.92e6; % RTL-SDR tuner frequency in Hz
rtlsdr_gain = 25; % RTL-SDR tuner gain in dB
rtlsdr_fs = 2.4e6; % RTL-SDR sampling rate in Hz
rtlsdr_frmlen = 4096; % RTL-SDR output data frame size
rtlsdr_datatype = 'single'; % RTL-SDR output data type
rtlsdr_ppm = 0; % RTL-SDR tuner parts per million correction
sim_time = 60; % simulation time in seconds
然后创建了一些对象
% rtl-sdr object 使用RTL-SDR对象,设置的参数是前面写好的
obj_rtlsdr = comm.SDRRTLReceiver(...
rtlsdr_id,...
'CenterFrequency', rtlsdr_tunerfreq,...
'EnableTunerAGC', false,...
'TunerGain', rtlsdr_gain,...
'SampleRate', rtlsdr_fs, ...
'SamplesPerFrame', rtlsdr_frmlen,...
'OutputDataType', rtlsdr_datatype ,...
'FrequencyCorrection', rtlsdr_ppm );
% spectrum analyzer objects 使用了两个频谱分析对象,一个设置为FFT格式,一个设置为瀑布流格式
obj_specfft = dsp.SpectrumAnalyzer(...
'Name', 'Spectrum Analyzer FFT',...
'Title', 'Spectrum Analyzer FFT',...
'SpectrumType', 'Power density',...
'FrequencySpan', 'Full',...
'SampleRate', rtlsdr_fs);
obj_specwaterfall = dsp.SpectrumAnalyzer(...
'Name', 'Spectrum Analyzer Waterfall',...
'Title', 'Spectrum Analyzer Waterfall',...
'SpectrumType', 'Spectrogram',...
'FrequencySpan', 'Full',...
'SampleRate', rtlsdr_fs);
通过一帧的数据量除以采样率,用来控制仿真运行的时间
rtlsdr_frmtime = rtlsdr_frmlen/rtlsdr_fs;
通过仿真,监听在对应的频率,实现的效果与 Simulink 是一致的
% check if RTL-SDR is active 先检查RTL-SDR设备是不是能用
if isempty(sdrinfo(obj_rtlsdr.RadioAddress))
error(['RTL-SDR failure. Please check connection to ',...
'MATLAB using the "sdrinfo" command.']);
end
% reset run_time to 0 (secs) 初始化时间
run_time = 0;
% run while run_time is less than sim_time 当前时间只要不超过设定的时间就会一直跑
while run_time < sim_time
% fetch a frame from the rtlsdr RTL-SDR获取到的数据帧存储在rtlsdr_data中
rtlsdr_data = step(obj_rtlsdr);
% update spectrum analyzer windows with new data
% 将 rtlsdr_data 更新到 obj_specfft 和 obj_specwaterfall
step(obj_specfft, rtlsdr_data);
step(obj_specwaterfall, rtlsdr_data);
% update run_time after processing another frame 运行时间
run_time = run_time + rtlsdr_frmtime;
end
RTL-SDR 使用的 R820T 调谐器能够接收到 25MHz 到 1.75GHz,把工作目录切换到:spectrum,打开 exploring_the_spectrum.slx,通过这个例子可以观察各种信号的频谱图
中心频率是可以通过 GUI 界面进行调节的,当前这个设置 RTL-SDR 的中心频率是 99MHz,同时采样率被设置为了 2.8MHz,这样 RTL-SDR 采样的范围是:99-1.4 到 99+1.4,也就是在 97.6MHz 到 100.4MHz 都会被 RTL-SDR 捕捉到
调整好中心频率后点击 Start Simulation 就会开始解析射频信号,后面我们会分析这些信号,分析的前提是需要把这些信号调整到中心频率上,比如当前看到有两个比较明显的信号,都是 ±1 左右,因此把 Centre Frequency ±1 即可把其中一个信号频率设置为中心频率
当然还需要微调一下
另一个参数是增益(Gain),简而言之,增益就是放大倍数,需要注意提高增益可能导致噪声随着所需信号的增加而增加
书中通过这个例子介绍了一些常见信号的频谱特征(FM电台信号、2G、3G、4G蜂窝电话信号、433MHz的无线传感器信号、数字电视信号),但是因为教程是国外的,频段是有差距的,有些在国内对应的频率啥也没有
我从网上搜了搜国内的频率,观察到一些波形跟书中描述的很像的,但也不知道是不是,等后面解析信号的时候再看吧