初次使用RTLSDR和MATLAB
初次使用RTLSDR和MATLAB
看一下这本书:《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 的信号了
然后来看一下 rtlsdr_rx_startup_matlab.m,这是 matlab 的代码,里面先设置了一堆 RTLSDR 的参数
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;
通过仿真,监听在对应的频率
% 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
实现的效果与 simulink 是一致的