跳转至

初次使用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 安装就行,然后点击管理

1681633638483-767af713-ab10-4fac-9a22-67275d4276b4.png

如果没装过驱动应该会让你用 zadig 安装驱动。然后 Test Connection,能找到设备就行

1681633751275-00846622-2fba-4281-a41b-14f68afa3329.png

或者直接在命令行敲命令,检查能不能识别到

sdrinfo

1681633842119-9b895c4d-04b1-4157-8006-9d32a4252f86.png

同时在 Simulink 中应该也有了 RTL SDR 的模块

选择 Simulink,然后随便创建一个

1685450518836-6aff2335-15cb-411f-9de7-2f2af84b115d.png

在 Library Browser 中就可以看到了,这是一个 RTL-SDR 的接收机,它是一个参数化的接口,可以实时的把 RTL-SDR 的采样值送入 Simulink

1685450649839-ac9536f9-836b-4bb6-9f6e-7b24043251d8.png

将附件中的 rtlsdr_book_library 添加到路径中1683525026747-f0de24da-770e-4384-a75f-b26ed0342e39.png

然后看一下 Simulink Library Browser,是不是有 RTL-SDR Book Library 这个库,没有的话刷新一下

1683525158370-45483ec8-3eb2-4a6a-909c-36922d34d16e.png

打开附件的 intro\rtlsdr_rx_startup_simulink.slxc 之后,修改 Centre Frequency 的频率为 433.92MHz,然后运行,这时候就能收到 433.92MHz 的信号了

1683525588710-a4801717-c35b-4d9c-babe-5b523bfdd7e3.png

1683525464170-11345f4a-6673-4381-9106-05c3016e363e.png

然后来看一下 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 是一致的

原文: https://www.yuque.com/hxfqg9/iot/zqs42mol203wuyf3