资讯动态

MATLAB信号仿真:窄带、宽带与全频带信号建模与工程实践

发布时间:2026/8/12 17:57:25 来源:尧图企业网站定制
1. 项目概述信号仿真的核心价值与MATLAB优势在通信、雷达、声学以及各类信号处理系统的研发初期直接进行硬件实现和物理测试不仅成本高昂而且风险巨大。一个微小的设计缺陷在实物阶段可能需要耗费数周甚至数月来定位和修复。因此仿真成为了连接理论设计与工程实现之间不可或缺的桥梁。它允许我们在一个完全可控的虚拟环境中对系统模型进行反复的“试错”和优化从而在投入真金白银之前就将性能提升到预期水平。这个项目的核心就是利用MATLAB这一强大的科学计算与仿真平台来构建三种不同带宽特性的信号模型窄带信号、宽带信号和全频带信号。这听起来像是一个基础的信号生成练习但其背后蕴含的工程意义非常深远。例如在设计一个接收机时你需要知道它对一个中心频率为1GHz、带宽只有10kHz的窄带通信信号如某些物联网设备信号的响应也需要测试它对一个带宽高达20MHz的宽带信号如Wi-Fi信号的处理能力甚至要评估其在整个工作频段比如从500MHz到2GHz内的全频带性能以防止带外强干扰信号导致接收机阻塞。MATLAB之所以成为这个任务的绝佳选择原因在于其无缝集成了算法开发、数据可视化和系统仿真三大功能。你无需在不同的软件间切换从编写一个简单的正弦波公式到构建包含滤波器、混频器、ADC的完整收发信链路模型都可以在同一个环境中完成。其丰富的信号处理工具箱Signal Processing Toolbox、通信工具箱Communications Toolbox以及直观的Simulink图形化建模环境为信号仿真提供了从底层操作到高层系统建模的全套工具链。对于工程师和研究者而言掌握在MATLAB中灵活生成与操控不同带宽信号的能力是进行后续频谱分析、滤波器设计、调制解调算法验证等一系列高级工作的基石。2. 核心概念解析带宽如何定义信号“性格”在深入代码之前我们必须厘清这三个核心概念的本质区别。带宽简而言之就是信号能量主要集中的频率范围。但“窄”、“宽”、“全”的界定并非绝对而是相对于我们关心的系统中心频率或观测频段而言的。2.1 窄带信号频谱的“尖峰”窄带信号通常指其带宽B远小于其中心频率f_c即 B f_c。在频谱图上它表现为一个以f_c为中心的、非常陡峭的尖峰。典型场景传统的调幅AM、调频FM广播许多无线传感器网络的通信信号以及雷达发射的脉冲信号在频域看其主瓣。数学与MATLAB表征窄带信号常表示为s(t) A(t) * cos(2*pi*f_c*t phi(t))。其中A(t)和phi(t)是相对于载波频率f_c变化缓慢的包络和相位函数。在MATLAB中生成一个简单的窄带信号如单频信号非常直接fs 10000; % 采样频率 10 kHz t 0:1/fs:1; % 1秒时间向量 f_c 1000; % 中心频率 1 kHz B 20; % 带宽 20 Hz远小于1kHz % 生成一个带宽为20Hz的调频信号作为窄带例子 s_narrow cos(2*pi*f_c*t 0.1*sin(2*pi*B*t));这里通过一个缓慢变化的相位0.1*sin(2*pi*B*t)来引入一个很小的频率展宽约20Hz从而模拟一个窄带信号。直接绘制其频谱你会看到能量高度集中在1000Hz附近。2.2 宽带信号频谱的“平台”宽带信号的带宽B与其中心频率f_c可比拟甚至可能更大B ≈ f_c 或 B f_c。其频谱占据了一段较宽的连续频带。典型场景扩频通信如CDMA、GPS、超宽带UWB雷达与通信、数字电视信号如OFDM、以及高速数据通信如5G NR的部分频段。数学与MATLAB表征宽带信号通常由基带的高速数字序列经过调制和脉冲成形后产生。例如一个简单的二进制相移键控BPSK调制信号其带宽与符号速率直接相关。在MATLAB中我们可以用通信工具箱快速生成data randi([0 1], 1000, 1); % 生成随机二进制数据 modSymbols pskmod(data, 2); % BPSK调制生成复基带符号 % 设计一个平方根升余弦滤波器进行脉冲成形直接影响带宽 sps 10; % 每个符号的采样点数 span 6; % 滤波器符号长度 rolloff 0.25; % 滚降系数影响带宽 rrcFilter rcosdesign(rolloff, span, sps); txSignal upfirdn(modSymbols, rrcFilter, sps); % 脉冲成形生成的txSignal就是一个典型的宽带复基带信号。其带宽约为(1 rolloff) * 符号速率。上变频到射频后即成为一个实宽带信号。2.3 全频带信号频域的“白噪声”理想模型全频带信号在本语境下通常指在我们关心的整个目标频段内功率谱密度均匀分布的信号。它是最“宽”的极端情况常用于测试系统在整个工作带宽内的频率响应或作为干扰测试信号。典型场景测试一个接收机前端滤波器如声表面波滤波器的带内插损和带外抑制特性评估一个ADC在整个奈奎斯特带宽内的动态性能作为系统级仿真中的阻塞干扰或宽带噪声源。数学与MATLAB表征理想的全频带信号在时域上通常表现为白噪声。在MATLAB中生成一个限带白噪声即在特定带宽内功率谱平坦是标准操作fs 1e6; % 采样率 1 MHz N 1e5; % 点数 t (0:N-1)/fs; f_low 100e3; % 目标频带低端 100 kHz f_high 400e3; % 目标频带高端 400 kHz % 生成白噪声 noise randn(N, 1) 1j*randn(N, 1); % 复高斯白噪声 % 通过设计一个带通滤波器将噪声限制在目标频带 bpFilt designfilt(bandpassfir, FilterOrder, 200, ... CutoffFrequency1, f_low, CutoffFrequency2, f_high, ... SampleRate, fs); fullband_signal filter(bpFilt, noise);这样得到的fullband_signal其功率谱在100kHz到400kHz之间近似平坦在其他频率处被强烈抑制完美模拟了一个全频带测试信号。注意这三个概念的边界是模糊的。在实践中一个信号是“窄带”还是“宽带”完全取决于你所分析的系统带宽。对于一个带宽为10kHz的接收机一个5MHz带宽的信号无疑是“宽带”干扰但对于一个带宽为100MHz的频谱分析仪同一个信号可能只算一个“窄带”谱线。3. 仿真系统设计与参数化建模思路要构建一个灵活、可复用的信号仿真框架而不是写一堆一次性的脚本关键在于参数化设计和模块化思维。我们的目标是通过改变几个核心参数就能一键生成所需带宽特性的信号并方便地进行后续分析和可视化。3.1 顶层参数定义首先我们需要定义一组全局仿真参数它们构成了所有信号生成的共同基础。%% 仿真主参数定义 clear; close all; clc; % 1. 基本采样参数 param.fs 100e6; % 采样频率 (Hz)决定了无混叠的最高仿真频率 (fs/2) param.T_total 100e-6; % 信号总时长 (秒)影响频率分辨率 df 1/T_total param.N round(param.fs * param.T_total); % 总采样点数 % 2. 目标频带定义 (用于全频带信号和某些分析) param.f_band_low 10e6; % 目标频带低端 (Hz) param.f_band_high 40e6; % 目标频带高端 (Hz) param.f_center (param.f_band_low param.f_band_high) / 2; % 中心频率 param.BW_band param.f_band_high - param.f_band_low; % 目标频带宽度 % 3. 窄带信号参数 param.fc_narrow 25e6; % 窄带信号中心频率 (Hz)落在目标频带内 param.BW_narrow 1e6; % 窄带信号带宽 (Hz)应远小于 fc_narrow % 4. 宽带信号参数 param.fc_wide param.f_center; % 宽带信号中心频率通常也设在目标频带内 param.BW_wide 15e6; % 宽带信号带宽 (Hz)与中心频率可比拟 % 5. 信号功率与噪声 param.SNR_dB 30; % 信噪比 (dB)用于添加高斯白噪声这样设计的好处是所有参数集中管理修改起来一目了然。例如如果你想研究不同采样率下的信号表现只需修改param.fs所有相关计算如点数N、频率向量都会自动更新。3.2 信号生成模块化函数设计接下来我们将三种信号的生成过程封装成独立的函数。这提高了代码的复用性和可读性。窄带信号生成函数示例 (generate_narrowband_signal)这个函数可以生成多种窄带信号如单频、线性调频LFM、或带有调制的信号。function [signal, t] generate_narrowband_signal(param, type) % 生成窄带信号 % 输入 % param: 参数结构体 % type: 信号类型 CW单频 LFM线性调频 MOD已调信号 % 输出 % signal: 生成的时域信号 % t: 时间向量 t (0:param.N-1) / param.fs; % 列向量时间轴 switch type case CW % 连续波单频 signal cos(2 * pi * param.fc_narrow * t); case LFM % 线性调频 % 瞬时频率从 fc_narrow - BW_narrow/2 扫到 fc_narrow BW_narrow/2 f_start param.fc_narrow - param.BW_narrow/2; k param.BW_narrow / param.T_total; % 调频率 phase 2*pi*(f_start*t 0.5*k*t.^2); signal cos(phase); case MOD % 一个简单的AM调制信号作为例子 fm param.BW_narrow / 2; % 假设调制信号带宽为BW/2 modulating_signal 0.5 * cos(2*pi*fm*t); % 调制信号 signal (1 modulating_signal) .* cos(2*pi*param.fc_narrow*t); otherwise error(未知的窄带信号类型); end end宽带信号生成函数 (generate_wideband_signal)这里以生成一个QPSK调制信号为例其带宽由符号速率和脉冲成形滤波器决定。function [signal, t] generate_wideband_signal(param) % 生成宽带信号 (以QPSK为例) % 输入param结构体 % 输出上采样并脉冲成形后的实信号 % 1. 生成随机符号 M 4; % QPSK numSymbols 1000; % 符号数 data randi([0 M-1], numSymbols, 1); modSymbols pskmod(data, M, pi/4); % QPSK调制pi/4偏移 % 2. 脉冲成形参数直接影响带宽 sps round(param.fs / (param.BW_wide * 1.2)); % 每个符号采样点数与带宽相关 % 经验公式符号速率 Rs ≈ BW / (1rolloff)这里反推sps span 6; % 滤波器跨度 rolloff 0.35; % 滚降系数 % 3. 设计根升余弦滤波器并成形 rrcFilter rcosdesign(rolloff, span, sps, sqrt); txWaveform upfirdn(modSymbols, rrcFilter, sps); % 4. 调整长度并上变频到载频 % 确保输出长度不超过param.N txWaveform txWaveform(1:min(length(txWaveform), param.N)); % 如果长度不足补零 if length(txWaveform) param.N txWaveform [txWaveform; zeros(param.N - length(txWaveform), 1)]; else txWaveform txWaveform(1:param.N); end t (0:param.N-1) / param.fs; % 上变频到实信号载频 signal real(txWaveform .* exp(1j*2*pi*param.fc_wide*t)); end全频带信号生成函数 (generate_fullband_signal)生成目标频带内的限带白噪声。function [signal, t, freq_vector] generate_fullband_signal(param) % 生成功率谱在目标频带内平坦的全频带信号限带白噪声 % 输入param结构体 % 输出 % signal: 时域信号 % t: 时间向量 % freq_vector: 单边频谱对应的频率向量正频率部分 t (0:param.N-1) / param.fs; % 1. 生成复高斯白噪声 noise_complex (randn(param.N, 1) 1j*randn(param.N, 1)) / sqrt(2); % 功率归一化 % 2. 设计理想带通滤波器这里用FIR近似 bpFilt designfilt(bandpassfir, ... FilterOrder, 500, ... % 阶数越高带外抑制越好过渡带越陡 CutoffFrequency1, param.f_band_low, ... CutoffFrequency2, param.f_band_high, ... SampleRate, param.fs); % 3. 滤波得到限带噪声 signal_complex filter(bpFilt, noise_complex); % 4. 取实部对于实信号系统或直接使用复信号对于复基带分析 % 这里生成实信号便于与窄带/宽带信号统一处理 signal real(signal_complex); % 5. 生成对应的频率向量用于后续频谱绘制 freq_vector (0:floor(param.N/2)) * param.fs / param.N; end3.3 核心工具函数频谱分析与可视化一个专业的仿真离不开直观的可视化。我们将频谱绘制封装成一个工具函数确保所有信号的频谱图采用统一、专业的格式。function plot_spectrum(signal, fs, plot_title, f_range) % 绘制信号的功率谱密度图 % 输入 % signal: 时域信号 % fs: 采样率 % plot_title: 图标题 % f_range: [f_min, f_max] 频率显示范围 (Hz)可选 N length(signal); % 计算功率谱密度 (PSD) - 使用pwelch方法比直接FFT更平滑稳定 [pxx, f] pwelch(signal, hamming(256), 128, 1024, fs, centered); figure(Position, [100 100 800 400]); plot(f/1e6, 10*log10(pxx/max(pxx)eps)); % 归一化并转换为dB grid on; xlabel(频率 (MHz)); ylabel(归一化功率谱密度 (dB)); title(plot_title); if nargin 3 ~isempty(f_range) xlim(f_range/1e6); else % 自动显示到fs/2 xlim([-fs/2, fs/2]/1e6); end end4. 完整仿真流程与结果深度分析有了模块化的函数整个仿真流程就变得清晰而高效。我们将按照“生成-分析-对比”的步骤进行。4.1 信号生成与基本时频域观察首先调用函数生成三种信号并观察它们的时域波形和频谱。%% 主仿真流程 % 生成信号 [s_narrow, t_narrow] generate_narrowband_signal(param, LFM); % 使用LFM窄带信号 [s_wide, t_wide] generate_wideband_signal(param); [s_full, t_full, f_full] generate_fullband_signal(param); % 绘制时域波形片段 figure(Position, [50 50 1200 800]); subplot(3,2,1); plot(t_narrow(1:1000)*1e6, s_narrow(1:1000)); % 显示前1000个点 xlabel(时间 (\mus)); ylabel(幅度); title(窄带信号 (LFM) 时域波形 (片段)); grid on; subplot(3,2,3); plot(t_wide(1:2000)*1e6, s_wide(1:2000)); xlabel(时间 (\mus)); ylabel(幅度); title(宽带信号 (QPSK) 时域波形 (片段)); grid on; subplot(3,2,5); plot(t_full(1:2000)*1e6, s_full(1:2000)); xlabel(时间 (\mus)); ylabel(幅度); title(全频带信号 (限带噪声) 时域波形 (片段)); grid on; % 绘制频谱 subplot(3,2,2); plot_spectrum(s_narrow, param.fs, 窄带信号 (LFM) 功率谱, [-param.fs/2, param.fs/2]); subplot(3,2,4); plot_spectrum(s_wide, param.fs, 宽带信号 (QPSK) 功率谱, [-param.fs/2, param.fs/2]); subplot(3,2,6); plot_spectrum(s_full, param.fs, 全频带信号 (限带噪声) 功率谱, [-param.fs/2, param.fs/2]);结果分析时域窄带LFM信号波形看起来像频率逐渐变化的正弦波。宽带QPSK信号波形复杂幅度和相位快速随机变化。全频带噪声信号则完全是无规则的随机波动。频域窄带信号频谱呈现一个清晰的尖峰且主瓣宽度约1MHz与我们设定的BW_narrow一致。宽带信号频谱呈现一个较宽的“平台”其形状由根升余弦滤波器的频谱决定带宽约为15MHz。全频带信号频谱在10MHz到40MHz的目标频带内相对平坦在带外急剧下降完美模拟了限带白噪声的特性。4.2 关键指标定量计算与验证仿真的价值在于定量分析。我们需要计算一些关键指标来验证信号是否按预期生成。计算信号的等效噪声带宽 (ENBW) 和占用带宽 (OBW)对于窄带和宽带信号我们常关心其-3dB带宽半功率带宽和占用带宽包含99%功率的带宽。%% 定量分析计算带宽指标 % 以窄带信号为例 [pxx_narrow, f_narrow] pwelch(s_narrow, hamming(1024), 512, 1024, param.fs, centered); pxx_narrow fftshift(pxx_narrow); % pwelch的‘centered’输出已居中但确保一下 f_narrow fftshift(f_narrow); % 找到峰值频率和峰值功率 [max_power, max_idx] max(pxx_narrow); f_peak f_narrow(max_idx); % 计算-3dB带宽 power_3dB max_power / 2; idx_3dB find(pxx_narrow power_3dB); BW_3dB (f_narrow(idx_3dB(end)) - f_narrow(idx_3dB(1))) / 1e6; % 转换为MHz fprintf(窄带信号峰值频率: %.2f MHz\n, f_peak/1e6); fprintf(窄带信号-3dB带宽: %.2f MHz\n, BW_3dB); % 计算占用带宽 (OBW, 99%) total_power sum(pxx_narrow); cum_power cumsum(pxx_narrow); idx_low find(cum_power 0.005 * total_power, 1, first); % 0.5% idx_high find(cum_power 0.995 * total_power, 1, first); % 99.5% OBW_99 (f_narrow(idx_high) - f_narrow(idx_low)) / 1e6; fprintf(窄带信号99%%占用带宽: %.2f MHz\n, OBW_99);计算全频带信号的带内平坦度对于全频带信号我们关心其在目标频带内功率谱的波动程度。%% 分析全频带信号的平坦度 % 提取目标频带内的PSD idx_band find(f_full param.f_band_low f_full param.f_band_high); pxx_band pxx_full(idx_band); % pxx_full来自plot_spectrum函数或重新计算 f_band f_full(idx_band); % 计算带内波动峰峰值差单位dB power_dB 10*log10(pxx_band); flatness_pp max(power_dB) - min(power_dB); flatness_std std(power_dB); fprintf(全频带信号在[%.1f, %.1f] MHz内功率谱波动:\n, ... param.f_band_low/1e6, param.f_band_high/1e6); fprintf( 峰峰值波动: %.2f dB\n, flatness_pp); fprintf( 标准差: %.2f dB\n, flatness_std); % 理想情况下波动应很小例如1dB这取决于滤波器的设计和阶数。4.3 系统级测试信号通过带通滤波器仿真的最终目的是为了测试系统。让我们模拟一个简单的场景将这三个信号分别通过一个相同的带通滤波器观察其输出变化。这可以模拟接收机前端滤波器的效果。%% 系统测试信号通过带通滤波器 % 设计一个带通滤波器通带略宽于我们的目标频带 f_pass [param.f_band_low*0.9, param.f_band_high*1.1]; % 通带频率 f_stop [param.f_band_low*0.7, param.f_band_high*1.3]; % 阻带频率 apass 1; % 通带衰减 (dB) astop 60; % 阻带衰减 (dB) bpFilt_system designfilt(bandpassfir, ... PassbandFrequency1, f_pass(1), PassbandFrequency2, f_pass(2), ... StopbandFrequency1, f_stop(1), StopbandFrequency2, f_stop(2), ... PassbandRipple, apass, StopbandAttenuation, astop, ... SampleRate, param.fs, DesignMethod, equiripple); % 滤波 s_narrow_filt filter(bpFilt_system, s_narrow); s_wide_filt filter(bpFilt_system, s_wide); s_full_filt filter(bpFilt_system, s_full); % 绘制滤波前后频谱对比以宽带信号为例 figure(Position, [100 100 1000 400]); subplot(1,2,1); plot_spectrum(s_wide, param.fs, 宽带信号 (滤波前), [0, param.fs/2]); hold on; % 叠加绘制滤波器频率响应归一化 [h, w] freqz(bpFilt_system, param.fs); plot(w/1e6, 20*log10(abs(h)) - 50, r--, LineWidth, 1.5); % 偏移显示 legend(信号谱, 滤波器响应 (右轴偏移)); subplot(1,2,2); plot_spectrum(s_wide_filt, param.fs, 宽带信号 (滤波后), [0, param.fs/2]);结果分析通过对比滤波前后的频谱图可以清晰看到窄带信号由于其频谱完全落在滤波器通带内滤波后信号几乎无失真只有轻微的边带被修剪。宽带信号其频谱部分超出了滤波器的通带因此滤波后信号位于通带外的频率成分被显著抑制信号带宽被“裁剪”时域波形也会发生改变。这模拟了接收机带宽限制对宽带信号的影响。全频带信号滤波后只有目标频带内的噪声成分被保留带外噪声被极大抑制。输出信号变成了一个“干净”的限带噪声其带宽严格等于滤波器的通带宽度。这验证了滤波器对宽带噪声的滤除能力。5. 常见问题、调试技巧与性能优化在实际仿真过程中你一定会遇到各种问题。以下是我从大量实践中总结出的核心要点和避坑指南。5.1 频谱泄露与栅栏效应这是信号处理中最常见的问题之一。问题现象对信号做FFT后频谱图上本应是单根的谱线出现了“拖尾”或“扩散”或者幅值、频率读数不准确。根本原因FFT默认假设信号是周期性的且截取的长度正好是信号周期的整数倍。如果不符合就会发生频谱泄露。解决方案加窗在FFT前对时域信号乘以一个窗函数如汉明窗、汉宁窗可以显著抑制泄露但会轻微降低频率分辨率并加宽主瓣。pwelch函数内部已经使用了窗函数和平均是估计功率谱密度PSD的推荐方法比直接fft更稳健。整周期采样确保采样时长T_total是信号基波周期的整数倍。对于单频信号这很容易做到。但对于复杂信号或未知信号很难实现。增加FFT点数补零这不能减少泄露但可以增加频谱的采样密度即“栅栏”更密使真实的谱峰位置更容易被观察到称为插值。使用fft(x, NFFT)其中NFFT length(x)。% 错误示例直接对非整周期信号做FFT f0 10.5; % 频率不是采样时长的整数倍倒数 t 0:1/100:1; % 采样率100Hz时长1秒 x sin(2*pi*f0*t); X fft(x); % 此时频谱会泄露 % 改进示例1加窗 window hamming(length(x)); x_windowed x .* window; X_windowed fft(x_windowed); % 改进示例2使用pwelch推荐 [pxx, f] pwelch(x, hamming(256), 128, 1024, 100);5.2 滤波器设计陷阱设计用于仿真信号的滤波器时参数选择不当会导致结果失真。过渡带过宽如果滤波器的过渡带设置得太宽可能会将我们希望保留的信号成分过度衰减对于带通或未能有效抑制带外成分对于带阻。技巧在designfilt中可以通过指定PassbandFrequency和StopbandFrequency并设置严格的PassbandRipple和StopbandAttenuation来控制过渡带。FIR滤波器的阶数 (FilterOrder) 直接决定了过渡带的陡峭程度阶数越高越陡峭但计算量也越大。相位失真FIR滤波器在具有线性相位特性的同时会引入固定的群延迟约为N/2个采样点N为滤波器阶数。这意味着滤波后的信号在时域上会有相应的时移。技巧使用filtfilt函数进行零相位滤波。它通过前向-后向两次滤波来抵消相位失真但代价是滤波器的幅频响应会变为原响应的平方且计算量加倍。在仿真中如果需要精确的时域对齐如雷达脉冲测距必须考虑使用filtfilt或手动补偿延迟。% 使用filtfilt进行零相位滤波 y_zero_phase filtfilt(bpFilt_system, s_wide); % 比较与filter的差异 delay grpdelay(bpFilt_system, 1); % 计算群延迟采样点数5.3 仿真性能与精度权衡对于长序列或高采样率的仿真计算速度和内存可能成为瓶颈。向量化操作始终使用MATLAB的向量和矩阵运算避免for循环。例如生成时间向量t (0:N-1)/fs比在循环中累加快得多。合理选择FFT点数对于功率谱估计pwelch函数中的nfft参数FFT点数不必设得巨大。通常1024或2048已能提供足够平滑和详细的频谱。点数越多计算越慢。使用单精度如果数据范围允许可以使用单精度single变量来减少内存占用和加速计算尤其是在处理大型数组时。但要注意量化噪声可能带来的影响。s_narrow_single single(s_narrow);频域滤波对于非常长的信号和阶数很高的FIR滤波器时域卷积filter函数可能很慢。可以考虑使用重叠-保留法或重叠-相加法在频域实现快速卷积。MATLAB的fftfilt函数就是基于重叠相加法实现的对于长数据滤波效率更高。% 使用fftfilt进行频域滤波尤其适用于长数据 y_fast fftfilt(bpFilt_system.Numerator, s_wide); % 传入滤波器系数5.4 复信号与实信号处理在通信和雷达仿真中我们经常处理复基带信号I/Q信号。为什么用复信号复信号s(t) I(t) j*Q(t)可以同时表示信号的幅度和相位信息其频谱是单边带的仅正频率或仅负频率有内容频谱利用率高处理方便。仿真中的处理在MATLAB中生成调制信号如pskmod通常直接得到复基带符号。脉冲成形后得到复基带波形。如果需要上变频到实射频信号则需进行如下操作% s_baseband 是复基带信号 t (0:length(s_baseband)-1)/fs; s_rf real(s_baseband .* exp(1j*2*pi*fc*t)); % 上变频注意事项对实信号做FFT频谱是共轭对称的关于0Hz对称。对复信号做FFT频谱没有对称性。在分析复基带信号频谱时通常只关心正频率部分或将其移到零中频附近观察。5.5 信噪比SNR的精确添加在仿真中为信号添加高斯白噪声是基本操作但如何精确控制SNR公式SNR(dB) 10*log10(Ps / Pn)其中Ps是信号功率Pn是噪声功率。MATLAB实现function signal_noisy add_awgn(signal, snr_dB) % 计算信号功率 Ps mean(abs(signal).^2); % 根据SNR计算所需的噪声功率 Pn Ps / (10^(snr_db/10)); % 生成与信号同长度的复高斯噪声对于实信号取实部 noise sqrt(Pn/2) * (randn(size(signal)) 1j*randn(size(signal))); % 如果是实信号应使用实噪声 if isreal(signal) noise real(noise); end signal_noisy signal noise; end关键点是对于实信号噪声功率Pn是单边功率谱密度在正负频率上对称分布。上面代码中生成复噪声再取实部其方差是Pn。也可以直接生成实噪声sqrt(Pn) * randn(size(signal))效果相同。通过系统地应用这些模块、方法和技巧你就能在MATLAB中游刃有余地仿真和分析任意带宽的信号为更复杂的通信系统、雷达系统或音频处理算法的开发打下坚实的基础。仿真的魅力在于你可以在电脑上构建一个完全可控的虚拟世界尽情探索“如果……会怎样”的问题而成本几乎为零。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价