news 2026/4/22 15:52:17

生成多种调制信号数据集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
生成多种调制信号数据集

问题解构

用户需要一段MATLAB程序来生成包含多种调制类型的信号数据集,用于通信系统仿真、深度学习训练或信号处理研究。核心需求包括:

  1. 信号生成:生成多种调制类型的基带/已调信号。
  2. 参数可控:能够灵活设置信号参数,如符号速率、载波频率、信噪比等。
  3. 信道仿真:模拟真实信道环境,如加性高斯白噪声(AWGN)、多径衰落等。
  4. 数据集构建:将生成的信号及其标签组织成结构化的数据集,便于后续处理。

方案推演

根据参考资料,一个完整的调制信号数据集生成程序应包含以下模块:

  1. 调制信号生成:实现常见的数字调制(如BPSK、QPSK、16QAM)和模拟调制(如AM、FM)。
  2. 信道模型:添加AWGN噪声,并可扩展至多径、频偏等效应。
  3. 数据封装:将信号数据、调制类型标签、关键参数(如SNR)打包存储。
  4. 可视化与验证:可选地生成时频图(如频谱图)用于直观检查或作为深度学习模型的输入特征。

具体实现

以下MATLAB程序实现了上述功能,生成一个包含BPSK、QPSK、16QAM和FM四种调制类型的数据集,每种调制类型在不同信噪比(SNR)下生成多个样本。

%% 生成不同调制信号数据集的MATLAB程序 % 作者:基于CSDN博客的调制原理与数据集构建方法实现 % 功能:生成包含BPSK, QPSK, 16QAM, FM四种调制类型的信号数据集,并添加AWGN信道噪声。 clear; close all; clc; %% 1. 参数设置 fs = 100e3; % 采样率 (Hz),需满足奈奎斯特采样定律 fc = 10e3; % 载波频率 (Hz) Rs = 1e3; % 符号速率 (波特) sps = fs / Rs; % 每符号采样点数 numSymbols = 1024; % 每种调制类型每个样本的符号数 numSamplesPerMod = 50; % 每种调制类型每个SNR下的样本数 modulationTypes = {'BPSK', 'QPSK', '16QAM', 'FM'}; SNR_dB = -5:5:20; % 信噪比范围 (dB),模拟不同信道条件 % 初始化数据集结构 dataset = struct(); datasetIndex = 1; %% 2. 主循环:生成所有调制类型和SNR下的信号 for modIdx = 1:length(modulationTypes) modType = modulationTypes{modIdx}; fprintf('正在生成调制类型: %s ', modType); for snrIdx = 1:length(SNR_dB) SNR = SNR_dB(snrIdx); for sampleIdx = 1:numSamplesPerMod % 2.1 生成随机比特流作为信源 numBits = numSymbols * log2(getModulationOrder(modType)); dataBits = randi([0 1], numBits, 1); % 2.2 根据调制类型生成基带信号 modulatedSignal = generateModulatedSignal(dataBits, modType, sps, fc, fs); % 2.3 通过AWGN信道 noisySignal = awgn(modulatedSignal, SNR, 'measured'); % 2.4 存储到数据集结构 dataset(datasetIndex).Signal = noisySignal; dataset(datasetIndex).ModulationType = modType; dataset(datasetIndex).SNR_dB = SNR; dataset(datasetIndex).OriginalBits = dataBits; % 可选:存储原始比特用于解调验证 dataset(datasetIndex).Fs = fs; dataset(datasetIndex).Fc = fc; datasetIndex = datasetIndex + 1; end end end fprintf('数据集生成完成!共生成 %d 个信号样本。 ', length(dataset)); %% 3. 保存数据集 save('ModulationDataset.mat', 'dataset', '-v7.3'); disp('数据集已保存为 ModulationDataset.mat'); %% 4. 可视化示例(可选):绘制最后生成的4个样本的时域波形和频谱 figure('Position', [100, 100, 1200, 800]); for i = 1:4 idx = length(dataset) - 4 + i; signal = dataset(idx).Signal; modType = dataset(idx).ModulationType; snr = dataset(idx).SNR_dB; % 时域波形 subplot(4, 2, 2*i-1); t = (0:length(signal)-1) / fs; plot(t*1e3, real(signal)); % 绘制实部(对于FM是实信号) xlabel('时间 (ms)'); ylabel('幅度'); title(sprintf('%s调制 (SNR=%d dB) 时域波形', modType, snr)); grid on; % 频谱(使用pspectrum函数进行时频分析) subplot(4, 2, 2*i); pspectrum(signal, fs, 'spectrogram', 'FrequencyResolution', 500, 'OverlapPercent', 80); title(sprintf('%s调制频谱图', modType)); colorbar off; end %% 5. 辅助函数:根据调制类型生成已调信号 function modulatedSignal = generateModulatedSignal(dataBits, modType, sps, fc, fs) % 根据调制类型生成相应的已调信号 switch modType case 'BPSK' % BPSK调制:比特0映射为相位0,比特1映射为相位π symbols = 2 * dataBits - 1; % 映射为±1 baseband = rectpulse(symbols, sps); % 矩形脉冲成型 t = (0:length(baseband)-1)' / fs; modulatedSignal = baseband .* cos(2*pi*fc*t); % 载波调制 case 'QPSK' % QPSK调制:每两个比特映射为一个符号 symbols = qammod(dataBits, 4, 'InputType', 'bit', 'UnitAveragePower', true); baseband = rectpulse(symbols, sps); t = (0:length(baseband)-1)' / fs; modulatedSignal = real(baseband .* exp(1j*2*pi*fc*t)); % 取实部得到实信号 case '16QAM' % 16QAM调制:每4个比特映射为一个符号 symbols = qammod(dataBits, 16, 'InputType', 'bit', 'UnitAveragePower', true); baseband = rectpulse(symbols, sps); t = (0:length(baseband)-1)' / fs; modulatedSignal = real(baseband .* exp(1j*2*pi*fc*t)); case 'FM' % FM调制:频率随调制信号线性变化 % 首先将比特流转换为模拟信号(这里简单使用双极性NRZ) analogSignal = 2 * dataBits - 1; analogSignal = rectpulse(analogSignal, sps); % 设置调频灵敏度Kf Kf = 50; % Hz/volt,控制调制指数 intSignal = cumsum(analogSignal) / fs; % 积分得到相位 t = (0:length(analogSignal)-1)' / fs; modulatedSignal = cos(2*pi*fc*t + 2*pi*Kf*intSignal); otherwise error('不支持的调制类型: %s', modType); end end %% 6. 辅助函数:获取调制阶数(每个符号的比特数) function order = getModulationOrder(modType) switch modType case 'BPSK' order = 1; case 'QPSK' order = 2; case '16QAM' order = 4; case 'FM' order = 1; % FM通常视为模拟调制,这里为简化也使用1比特/符号 otherwise order = 1; end end

代码说明与关键特性

模块功能说明对应参考资料
参数设置定义采样率fs、载波频率fc、符号速率Rs等全局参数。采样率需满足奈奎斯特采样定律以避免混叠。
调制信号生成generateModulatedSignal函数实现了四种调制:
BPSK/QPSK/16QAM:使用qammod函数进行星座映射,矩形脉冲成型后与载波相乘。
FM:对基带信号积分得到相位,再与载波频率结合生成调频信号,其中Kf为调频灵敏度。
信道仿真使用awgn函数添加加性高斯白噪声(AWGN),SNR_dB数组定义了从-5 dB到20 dB的信噪比范围,模拟不同质量的传输信道。
数据集结构每个样本存储为结构体,包含:
Signal:加噪后的已调信号(时域波形)。
ModulationType:调制类型标签(字符串)。
SNR_dB:信噪比标签。
OriginalBits:原始比特序列(可用于解调性能验证)。
Fs,Fc:采样率和载波频率参数。
可视化程序最后绘制了4个样本的时域波形和频谱图(使用pspectrum函数生成时频图),便于直观检查信号特征。频谱图也可直接作为深度学习模型的输入特征。
数据保存使用save命令将整个dataset结构保存为MAT文件,便于后续加载使用。-

扩展与定制建议

  1. 增加调制类型:参考,可在generateModulatedSignal函数中轻松添加MFSKOQPSKSSB(需使用希尔伯特变换)等其他调制方式。
  2. 复杂信道模型:除了AWGN,可引入多径衰落(瑞利或莱斯信道)、载波频率偏移(CFO)和采样时钟偏移(SCO)等更真实的损伤模型。
  3. 生成时频图数据集:若用于深度学习分类(如CNN),可将主循环中的noisySignal通过pspectrum函数转换为频谱图,并保存为图像文件,构建图像数据集。
  4. 音频信号调制:如需处理音频信号,可将dataBits替换为实际音频文件的采样数据,并调整参数以适应音频频带。
  5. 批量生成与存储优化:对于大规模数据集,可考虑使用parfor并行循环加速生成,并将数据分批保存为HDF5等格式以减少内存占用。

参考来源

  • Matlab系列之信号调制
  • 通信调制信号及时频图数据集制作(MATLAB)
  • 单边带调制(SSB调制)的理论基础和MATLAB仿真
  • 【信号识别】基于matlab深度学习CNN信号调制分类【含Matlab源码 2066期】
  • matlab声音信号调制-3种方法(附matlab代码)
  • 基于音频信号的AM、SSB、DSB、FM调制MATLAB仿真
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 15:48:41

AI教材生成神器,低查重效果显著,快速完成教材编写任务!

教育工作者编写教材的困境与AI工具的解决方案 每个教育工作者或多或少都经历过编写教材时的痛苦。这种情况下,你面对着空白页面,心中满是疑虑,甚至不知道从何下手——先讲理论还是先举实例?章节设计应该按照逻辑还是按时间分配&a…

作者头像 李华
网站建设 2026/4/22 15:45:04

Rust的#[derive(PartialEq, Eq)]派生宏与等价关系在自定义类型中的一致性

Rust语言中的类型系统以其严谨性著称,而#[derive(PartialEq, Eq)]派生宏则为自定义类型的等价关系提供了优雅的实现方式。等价关系是数学中的基本概念,要求满足自反性、对称性和传递性。在编程中,正确实现这些性质对于数据比较、集合操作等场…

作者头像 李华
网站建设 2026/4/22 15:41:52

从“能识别”到“能上线”:我们的语言检测系统设计与实践

从“能识别”到“能上线”:我们的语言检测系统设计与实践这是一篇面向工程实践的语言检测方案文章。 重点不在“哪个模型最准”,而在“如何做成一个低延迟、可解释、可降级、可演进的线上系统”。一、背景:语言检测为什么难 很多人把语言检测…

作者头像 李华
网站建设 2026/4/22 15:37:58

2011款MacBook Pro A1278升级指南:300元预算让它流畅运行Catalina和Win11

2011款MacBook Pro A1278升级指南:300元预算焕发新生 当一台十年前的MacBook Pro A1278摆在面前,大多数人可能觉得它已经完成了历史使命。但事实上,通过一些巧妙的硬件升级和系统优化,这台老机器完全可以流畅运行最新的macOS Cata…

作者头像 李华