用Matlab进行无线电信号逆向实战1——对模拟广播逆向:从单声道FM找回遗失的电波

发布时间:2026/6/27 3:10:12
用Matlab进行无线电信号逆向实战1——对模拟广播逆向:从单声道FM找回遗失的电波 欢迎来到 MATLAB SDR CTF 闯关指南系列在这个系列中我们将开启一段包含18道题目的宏大无线电逆向之旅从最基础的模拟信号解调一路打怪升级到复杂的数字通信盲解调。作为系列的第一期我们将从模拟广播层破冰。模拟调制是最朴素的信号处理方式能提供最直接的感官反馈听声音、看图像是 SDR 入门的首选。1. 题目背景与逆向方法论题目描述复古的电波 - 单声道FM广播解调背景截获特工在野外使用老旧收音机发送的一段模拟无线电信号。初步侦测显示这是一段干净的单声道调频FM广播信号。信号已被录制为基带复数IQ数据文件。请解调该信号还原出隐藏在语音中的口播 Flag。附件Q01_fm_mono.iq复数双精度二进制文件小端序下载地址。当我们拿到一个未知的.iq文件通用思路是明确格式IQ 数据通常以复数形式存储最常见的是交错存放的 Float32I1, Q1, I2, Q2...。时频分析不要急于写解调算法先用工具看看信号的“长相”。调制识别通过频谱和时域特征判断调制方式。解调与提取根据识别出的方式编写算法。那么具体到这道题我们如何一步步分析出这是一个单声道 FM 信号并成功解调呢2. MATLAB 实战从“盲盒”到识别 FM第一步数据读取与初步观察首先使用fread将二进制文件读取为浮点数由于 I 和 Q 是交错存放的我们需要将其重组为复数数组。clear;clc;fileIDfopen(Q01_fm_mono.iq,r);raw_datafread(fileID,float32);fclose(fileID);% 重组为复数iq_datacomplex(raw_data(1:2:end),raw_data(2:2:end));fs1e6;% 假设我们已知或测试得出采样率为 1 MHz拿到复数数据后如果直接画时域波形plot(real(iq_data))你只能看到一团密密麻麻的高频振荡无法获取有效信息。这时我们需要将其转换到频域。第二步频谱侦测与如何认出 FM利用pwelch绘制功率谱密度PSDfigure;pwelch(iq_data,[],[],[],fs);title(IQ Signal PSD);看着生成的频谱图我们如何逆向推导出它是 FM 信号核心在于以下三个特征的观察与推理观察中心频率信号能量并未集中在 0 Hz纯基带而是有一个明显的中心频点。在这张图上中心位于192 kHz处。这说明信号被搬移到了一个非零的中频上。观察占用带宽这是最关键的线索信号从大约 114 kHz 延伸到 270 kHz占据的带宽约为156 kHz。推理如果这是 AM调幅信号且基带是人声最高频率约 3~4 kHz那么 AM 的带宽最多只有 8 kHz频谱会非常窄。眼前这 156 kHz 的宽带信号直接排除了 AM 和窄带数字通信的可能。反推参数根据 FM 的卡森公式B 2 × ( Δ f f m ) B 2 \times (\Delta f f_m)B2×(Δffm​)。假设基带音频f m ≈ 3 f_m \approx 3fm​≈3kHz那么频偏Δ f B / 2 − f m 78 − 3 75 \Delta f B/2 - f_m 78 - 3 75ΔfB/2−fm​78−375kHz。75 kHz 正是标准 FM 广播的最大频偏这与“广播信号”的背景完美契合。观察频谱形态FM 信号的频谱由贝塞尔函数展开决定其主瓣呈现出类似于“起伏的丘陵”状能量在带内分布相对平缓而不是像 AM 那样有一条极强的尖锐载波线加上平坦的边带。通过上述“看图说话”和公式反推即使题目不告诉你参数我们也能确信这是一个宽带 FM 信号WBFM。3. 核心解调剥茧抽丝既然确认是 FM破题关键就在于提取瞬时频率。FM 信号的信息不在幅度里而在相位的变化率中。只要取出“瞬时频率”就能还原原始声音。第三步核心解调算法鉴频数学上瞬时频率正比于相邻采样点的相位差m [ n ] ∝ ∠ ( x [ n ] ⋅ x ∗ [ n − 1 ] ) m[n] \propto \angle(x[n] \cdot x^*[n-1])m[n]∝∠(x[n]⋅x∗[n−1])。在 MATLAB 中我们可以通过提取相位angle()并求差分diff()来实现。同时必须使用unwrap函数处理相位卷绕防止由于2 π 2\pi2π跳变导致的信号断裂。%% 3. FM 鉴频解调 (相位差分法)% FM 信号: s(t) A * exp(j * 2*pi*fc*t j*2*pi*kf*int(m(t)))% 相位差: diff(phase) 2*pi*fc/fs 2*pi*kf*m(t)/fs% 因为 fc 是已知的解调后可以通过低通滤除 fc 分量或直接取相位差模 2piphaseangle(iq_data);phase_unwrappedunwrap(phase);% 先解包络diff_phase[0;diff(phase_unwrapped)];% 再差分并补一个 0 保持长度一致demod_sigdiff_phase;第四步后处理滤波与重采样解调后的demod_sig采样率仍为 1 MHz其中包含了高频噪声和残留载波分量。我们需要设计一个截止频率为 4 kHz 的低通滤波器给人声留足保护带。另外1 MHz 采样率的音频如果直接用sound播放会变成尖锐的变音。必须将其重采样到标准音频采样率如 44.1 kHz。%% 低通滤波与重采样% 设计低通滤波器截止频率 4 kHzlp_filterdesignfilt(lowpassfir,FilterOrder,64,CutoffFrequency,4000,SampleRate,fs);audio_basebandfiltfilt(lp_filter,demod_sig);% 重采样到 44.1 kHzfs_audio44100;audio_outresample(audio_baseband,fs_audio,fs);% 归一化audio_outaudio_out/max(abs(audio_out));4. 通关时刻听取 Flag经过上述步骤信号已经被还原为标准的人声音频。戴上耳机运行播放代码%% 播放音频disp(正在播放解调音频请仔细听取 Flag...);sound(audio_out,fs_audio);audiowrite(decoded_flag.wav,audio_out,fs_audio);% 保存方便回放伴随着极其轻微的底噪SNR 40dB环境非常干净耳机里传来了清晰的声音。你也可以将导出的decoded_flag.wav拖入 Audacity 中通过波形更加直观地分析这段语音。解析IQ数据的完整代码如下% Q01 FM 解调脚本clear;clc;%% 1. 读取 IQ 数据fileIDfopen(Q01_fm_mono.iq,r);raw_datafread(fileID,float32);fclose(fileID);% 重组为复数iq_datacomplex(raw_data(1:2:end),raw_data(2:2:end));fs1e6;% 采样率%% 2. 时频分析figure;pwelch(iq_data,[],[],[],fs);title(FM Signal PSD);%% 3. FM 鉴频解调 (相位差分法)% FM 信号: s(t) A * exp(j * 2*pi*fc*t j*2*pi*kf*int(m(t)))% 相位差: diff(phase) 2*pi*fc/fs 2*pi*kf*m(t)/fs% 因为 fc 是已知的解调后可以通过低通滤除 fc 分量或直接取相位差模 2piphaseangle(iq_data);phase_unwrappedunwrap(phase);% 先解包络diff_phase[0;diff(phase_unwrapped)];% 再差分并补一个 0 保持长度一致demod_sigdiff_phase;%% 4. 低通滤波与重采样% 设计低通滤波器截止频率 4 kHz (留一定保护带)lp_filterdesignfilt(lowpassfir,FilterOrder,64,CutoffFrequency,4000,SampleRate,fs);audio_basebandfiltfilt(lp_filter,demod_sig);% 重采样到 44.1 kHzfs_audio44100;audio_outresample(audio_baseband,fs_audio,fs);% 归一化audio_outaudio_out/max(abs(audio_out));%% 5. 播放音频disp(正在播放解调音频请仔细听取 Flag...);sound(audio_out,fs_audio);% 保存音频方便回放audiowrite(decoded_flag.wav,audio_out,fs_audio);5. 复盘与下期预告本题总结Q01 难度 1 星是一道非常友好的破冰题。除了掌握 MATLAB 中fread、unwrap以及resample等基础函数的用法本题最大的收获在于通过带宽和频谱形状反推调制方式。这是无线电逆向分析中最核心的基本功。进阶预告真实的广播电台只有单声道吗下一题Q02 立体声 FM将引入 19kHz 导频和 38kHz 副载波并叠加 AWGN 噪声。你的频域分离能力将迎来真正的挑战我们下期见。