问题解构
用户需要一段MATLAB程序来生成包含多种调制类型的信号数据集,用于通信系统仿真、深度学习训练或信号处理研究。核心需求包括:
- 信号生成:生成多种调制类型的基带/已调信号。
- 参数可控:能够灵活设置信号参数,如符号速率、载波频率、信噪比等。
- 信道仿真:模拟真实信道环境,如加性高斯白噪声(AWGN)、多径衰落等。
- 数据集构建:将生成的信号及其标签组织成结构化的数据集,便于后续处理。
方案推演
根据参考资料,一个完整的调制信号数据集生成程序应包含以下模块:
- 调制信号生成:实现常见的数字调制(如BPSK、QPSK、16QAM)和模拟调制(如AM、FM)。
- 信道模型:添加AWGN噪声,并可扩展至多径、频偏等效应。
- 数据封装:将信号数据、调制类型标签、关键参数(如SNR)打包存储。
- 可视化与验证:可选地生成时频图(如频谱图)用于直观检查或作为深度学习模型的输入特征。
具体实现
以下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文件,便于后续加载使用。 | - |
扩展与定制建议
- 增加调制类型:参考,可在
generateModulatedSignal函数中轻松添加MFSK、OQPSK、SSB(需使用希尔伯特变换)等其他调制方式。 - 复杂信道模型:除了AWGN,可引入多径衰落(瑞利或莱斯信道)、载波频率偏移(CFO)和采样时钟偏移(SCO)等更真实的损伤模型。
- 生成时频图数据集:若用于深度学习分类(如CNN),可将主循环中的
noisySignal通过pspectrum函数转换为频谱图,并保存为图像文件,构建图像数据集。 - 音频信号调制:如需处理音频信号,可将
dataBits替换为实际音频文件的采样数据,并调整参数以适应音频频带。 - 批量生成与存储优化:对于大规模数据集,可考虑使用
parfor并行循环加速生成,并将数据分批保存为HDF5等格式以减少内存占用。
参考来源
- Matlab系列之信号调制
- 通信调制信号及时频图数据集制作(MATLAB)
- 单边带调制(SSB调制)的理论基础和MATLAB仿真
- 【信号识别】基于matlab深度学习CNN信号调制分类【含Matlab源码 2066期】
- matlab声音信号调制-3种方法(附matlab代码)
- 基于音频信号的AM、SSB、DSB、FM调制MATLAB仿真