
1. 项目背景与核心问题在无线通信系统的设计与评估中一个永恒的核心议题就是在恶劣的信道环境下系统的性能究竟如何我们常常听到“信号不好”导致通话断断续续或网速变慢这背后往往就是信道衰落和噪声在作祟。对于采用正交频分复用OFDM技术的现代通信系统如Wi-Fi、4G/5G而言理解其在频率选择性瑞利衰落信道中的表现是工程师和研究者必须掌握的基本功。频率选择性衰落简单来说就是信道对不同频率的信号分量有着不同的衰减。想象一下你在一间充满回声的大厅里说话有些音调频率的声音被墙壁吸收得很厉害几乎听不见而另一些音调却可能因为反射而增强。无线信号在传播中遇到建筑物、树木等障碍物产生的多径效应就会导致这种频率选择性。瑞利衰落则描述了当信号传播路径中没有一条占主导地位的直射路径时即非视距传播NLOS接收信号幅度的统计特性。这种场景在城市密集区域或室内非常常见。那么我们如何量化这种恶劣环境下的系统性能呢最关键的指标之一就是误码率Bit Error Rate, BER与信噪比Signal-to-Noise Ratio, SNR的关系曲线。这条曲线直观地告诉我们为了达到某个可接受的误码率水平比如千分之一我们需要提供多高的信噪比。信噪比越高意味着信号功率相对于噪声功率越强理论上误码率就越低。但在频率选择性瑞利衰落信道中事情变得复杂起来衰落会导致某些子载波上的信号功率急剧下降即使平均信噪比很高这些“深衰落”子载波上的误码率也可能极高从而拉高整体平均误码率。因此本项目的目的就是通过Matlab仿真亲手构建一个完整的OFDM系统链路将其置于频率选择性瑞利衰落信道中通过蒙特卡洛方法即大量随机实验取平均来绘制出BER随SNR变化的曲线。这个过程不仅能让我们从理论走向实践深刻理解OFDM对抗频率选择性衰落的原理关键在于其循环前缀和频域均衡更能掌握一套完整的通信系统性能评估方法论。无论你是通信工程的学生还是初入行的无线算法工程师这个仿真练习都能为你打下坚实的实践基础。2. OFDM系统与频率选择性瑞利衰落信道建模要点要仿真BER-SNR关系首先得在Matlab里把我们的“虚拟实验室”搭建起来。这包括两个核心部分一个尽可能贴近实际的OFDM收发机模型以及一个能够模拟多径衰落的信道模型。建模的准确性直接决定了仿真结果的可信度。2.1 OFDM系统核心模块搭建一个简化的OFDM基带系统主要包括以下模块我们在Matlab中需要逐一实现随机比特流生成这是我们的信源。使用randi函数生成[0, 1]的随机序列。序列的长度决定了每次仿真传输的比特数也影响了蒙特卡洛仿真的统计可靠性。通常为了获得平滑的BER曲线低至1e-5或更低需要仿真数百万甚至更多的比特。调制映射将比特流映射为复数符号。常用的调制方式有BPSK、QPSK、16QAM等。调制阶数越高频谱效率越高但在相同SNR下误码性能越差。本项目可以从最简单的BPSK开始其映射关系为比特0 - 1 比特1 - -1或者映射为复数10j和-10j。使用qammod函数需要Communications Toolbox或自行编写映射表可以方便地实现。OFDM调制IFFT这是OFDM的核心。将并行的调制符号每个子载波一个符号通过逆快速傅里叶变换IFFT转换到时域形成OFDM符号。关键参数包括子载波数N_fft通常为2的幂次方如64、128、256。它决定了系统的带宽和符号周期。循环前缀CP长度在IFFT输出的时域符号末尾取一部分样本复制到符号开头。它的长度必须大于信道的最大时延扩展以消除符号间干扰ISI并将线性卷积转化为循环卷积。这是OFDM能抵抗频率选择性衰落的关键设计之一。信道模型这是本项目的重点。我们需要模拟一个频率选择性瑞利衰落信道。多径抽头延迟线模型信道可以建模为具有L条不同延迟和衰落的路径。每条路径的复增益是一个瑞利分布的随机变量意味着没有直射路径其相位在[0, 2π]均匀分布。路径的功率延迟分布PDP描述了每条路径的平均功率通常服从指数衰减如COST 207 TU模型。在Matlab中我们可以用rayleighchan函数旧版本或comm.RayleighChannel系统对象来生成这样的信道。需要设定的关键参数包括最大多径时延、各径时延、各径平均功率、多普勒频谱对于静态或慢衰落可以设为0等。频率选择性当信道的相干带宽与最大时延扩展成反比小于OFDM子载波间隔时信道就表现出频率选择性。通过合理设置多径时延我们就能构造出这样的信道。加入加性高斯白噪声AWGN使用awgn函数根据设定的SNR通常指每个接收符号的平均信噪比Es/N0向经过信道后的信号添加高斯白噪声。这里需要注意SNR的定义和换算是仿真中常见的坑点之一。OFDM解调FFT接收端去除循环前缀后对时域信号进行FFT变回频域符号。信道估计与均衡在频率选择性信道下每个子载波经历了不同的复增益衰减和相位旋转。因此我们需要估计出每个子载波上的信道频率响应CFR然后进行均衡来补偿衰落。最简单的方法是使用导频符号。我们在某些固定的子载波上插入已知的导频符号接收端通过比较接收到的导频和已知导频可以插值估计出所有子载波上的信道响应。均衡通常采用迫零ZF或最小均方误差MMSE算法。解调与比特判决将均衡后的频域符号根据调制方式映射回比特流。对于BPSK就是判断符号的实部大于0还是小于0。误码率计算比较发送的原始比特流和接收端判决后的比特流统计错误的比特数除以总比特数得到本次仿真的BER。2.2 蒙特卡洛仿真循环框架BER-SNR曲线不是一次仿真就能得到的。我们需要在一个SNR范围内例如0dB到30dB步长2dB对每个SNR点进行多次独立的仿真实验。每次实验都生成新的随机比特、新的信道实现瑞利衰落的随机抽头系数和新的噪声实现然后计算该次实验的误码数。将所有实验的误码数累加除以总发送比特数得到该SNR点下的平均BER。% 伪代码框架 SNR_dB 0:2:30; % SNR范围 BER zeros(size(SNR_dB)); % 存储每个SNR点的BER for snr_idx 1:length(SNR_dB) snr SNR_dB(snr_idx); total_errors 0; total_bits 0; % 针对每个SNR进行多次蒙特卡洛实验 for mc_iter 1:num_monte_carlo % 1. 生成随机比特流 % 2. 调制 - OFDM调制 - 加CP % 3. 通过频率选择性瑞利衰落信道 (每次迭代信道随机) % 4. 加入AWGN噪声 (噪声功率根据当前snr计算) % 5. 去CP - OFDM解调(FFT) % 6. 信道估计与均衡 % 7. 解调 - 比特判决 % 8. 计算本次迭代的误码数累加到 total_errors % 9. 累加总比特数到 total_bits end BER(snr_idx) total_errors / total_bits; end % 绘制 BER vs SNR 曲线 semilogy(SNR_dB, BER, b-o, LineWidth, 1.5); grid on; xlabel(SNR (dB)); ylabel(Bit Error Rate (BER)); title(BER vs SNR in Frequency-Selective Rayleigh Fading Channel);这个框架是仿真的骨架接下来的所有细节和“坑”都围绕着如何填充这个骨架展开。3. 关键参数设置与仿真中的“坑”参数设置不当轻则得到错误的曲线重则仿真无法进行或结果毫无意义。以下是一些关键参数的选择逻辑和常见陷阱。3.1 子载波数与循环前缀长度子载波数N_fft选择64或128是一个不错的起点。太小的FFT如16可能无法充分体现频率选择性太大的FFT如2048会急剧增加计算量。需要确保子载波间隔Δf 采样率 / N_fft小于信道的相干带宽才能观察到频率选择性。在实际仿真中我们通常更关注归一化的时延扩展。循环前缀长度N_cp这是最容易出问题的地方之一。CP的长度必须严格大于信道冲击响应的最大时延以采样点为单位。例如如果你的多径信道最大时延是20个采样点那么N_cp至少设为21。如果CP长度小于最大时延就会引入符号间干扰ISI和子载波间干扰ICI破坏OFDM的正交性导致BER曲线在高SNR时出现无法降低的“错误平层”。一个经验法则是设置为最大时延的1.5到2倍留出余量。注意CP是开销不承载有用数据。因此系统频谱效率 (有用符号长度) / (有用符号长度 CP长度)。在设置参数时需要权衡性能和效率。3.2 信道模型参数最大时延与多普勒最大时延扩展Tau_max这决定了信道的频率选择性程度。Tau_max越大信道的相干带宽越小频率选择性越强。在仿真中我们通常用采样周期Ts的倍数来表示。例如假设系统带宽为10MHz采样率Fs10MHz则Ts0.1us。如果设置Tau_max 10 * Ts 1us这是一个典型的城市环境时延扩展。多普勒频移Fd它决定了信道的时变性即快衰落或慢衰落。如果仿真一个准静态块衰落block fading信道即在一个OFDM符号时间内信道不变可以设Fd0。如果要研究快衰落的影响可以设置一个值例如对应于移动速度v30km/h载频fc2.1GHz时Fd (v*fc)/c ≈ 58 Hz。对于BER-SNR曲线通常先研究慢衰落Fd0更为基础。3.3 SNR的定义与换算这是新手最容易混淆和出错的地方在通信仿真中SNR有多种定义Eb/N0每比特能量与噪声功率谱密度之比。这是最根本的衡量指标与调制方式无关。Es/N0每个符号的能量与噪声功率谱密度之比。对于M阶调制Es/N0 Eb/N0 10*log10(log2(M))。SNR通常指接收端的平均信号功率与噪声功率之比。在仿真中我们通常在添加噪声环节使用这个。在Matlab的awgn函数中snr参数默认指的是SNR (dB)即信号功率与噪声功率之比。但我们的信号功率是多少这里有个关键步骤在添加噪声前需要将发送信号的功率归一化。通常的做法是确保每个OFDM符号不包括CP的平均功率为1。这样awgn(x, snr)中的snr就清晰地代表了Es/N0 (dB)因为信号功率Es被归一化为1。% 示例功率归一化与加噪声 ofdm_symbol_tx ... % 生成的OFDM时域符号已加CP % 方法计算有用符号部分去掉CP的功率并进行归一化 useful_part ofdm_symbol_tx(N_cp1:end); % 假设CP加在前面 avg_power mean(abs(useful_part).^2); ofdm_symbol_tx_normalized ofdm_symbol_tx / sqrt(avg_power); % 归一化功率为1 % 通过信道信道会改变功率 ofdm_symbol_rx_channel conv(ofdm_symbol_tx_normalized, channel_impulse_response); % 或使用filter % 添加噪声此时snr_in_dB对应的是归一化后的信号功率Es1时的SNR ofdm_symbol_rx_noisy awgn(ofdm_symbol_rx_channel, snr_in_dB, measured);如果不做归一化发送信号的功率是随机的那么你设置的SNR就失去了标准意义不同次仿真之间无法比较与理论曲线也无法对照。3.4 导频设计与信道估计在频率选择性信道中没有信道估计的均衡是无从谈起的。最简单的导频设计是梳状导频即在每个OFDM符号中每隔固定的子载波插入一个已知的导频符号。导频间隔由信道的相干带宽决定。在频率方向导频间隔应小于信道的相干带宽才能正确捕捉信道频率响应的变化。通常可以设为小于等于N_fft/最大时延扩展采样点。信道估计方法收到信号后在导频位置提取接收值除以已知的导频值得到导频位置的信道估计值H_pilot。对于非导频位置数据子载波需要进行插值。最常用的是线性插值或低通插值如sinc插值。Matlab的interp1函数可以方便地实现。% 假设 pilot_locations 是导频子载波索引 H_pilot 是这些位置的信道估计值 % all_locations 是所有子载波索引0到N_fft-1 H_estimated interp1(pilot_locations, H_pilot, all_locations, linear, extrap);均衡得到所有子载波的信道估计H_estimated后对于迫零均衡直接执行Y_eq Y_rx ./ H_estimated其中Y_rx是接收到的频域符号。这种方法简单但在H_estimated很小深衰落的子载波上会放大噪声。MMSE均衡性能更好但需要知道噪声方差。4. 完整Matlab代码实现与逐行解析下面我将结合一个相对完整的仿真示例逐段解释代码并穿插说明其中的技巧和注意事项。我们假设一个使用BPSK调制、64个子载波、慢衰落频率选择性瑞利信道的简单系统。%% 1. 仿真参数设置 clear all; close all; clc; % OFDM参数 N_fft 64; % FFT点数子载波数 N_cp 16; % 循环前缀长度采样点 N_data 52; % 实际用于传输数据的子载波数通常去掉直流和边带 pilot_interval 8; % 导频间隔子载波 num_symbols 100; % 每个SNR点仿真的OFDM符号数 bits_per_symbol N_data; % BPSK下每个OFDM符号承载的比特数假设所有数据子载波都用于传输 % 信道参数 max_delay_taps 10; % 信道最大时延扩展采样点 pdp exp(-(0:max_delay_taps-1)/3); % 指数衰减的功率延迟分布3是衰减因子 pdp pdp / sum(pdp); % 归一化总功率为1 % 生成瑞利衰落信道抽头。每个抽头是CN(0, pdp(i))的复高斯变量。 channel_taps (randn(1, max_delay_taps) 1j*randn(1, max_delay_taps)) .* sqrt(pdp/2); % 仿真参数 SNR_dB_vec 0:2:20; % 信噪比范围 (dB) num_monte_carlo 100; % 每个SNR点的蒙特卡洛实验次数实际需要更多如1000 BER_sim zeros(size(SNR_dB_vec)); % 存储仿真BER解析去掉了直流子载波和部分边带子载波N_data52是实际系统的常见做法以避免直流偏移和带外辐射问题。信道生成这里生成了一个具体的信道冲击响应channel_taps。randn生成零均值、方差为1的高斯随机变量sqrt(pdp/2)将其缩放使得每个抽头的平均功率为pdp(i)并且实部和虚部独立同分布这样其幅度就是瑞利分布。每次蒙特卡洛迭代都需要重新生成这个channel_taps以模拟信道的变化。num_monte_carlo设为100是为了快速演示实际为了获得低BER如1e-5的可靠统计需要成千上万次迭代。%% 2. 导频图案设计 all_sc_indices 0:N_fft-1; % 所有子载波索引 data_sc_indices setdiff(all_sc_indices, [0, N_fft/2]); % 简单假设去掉直流和Nyquist频率子载波 data_sc_indices data_sc_indices(1:N_data); % 取前N_data个作为数据子载波 % 在数据子载波中均匀插入导频 pilot_locations data_sc_indices(1:pilot_interval:end); data_locations setdiff(data_sc_indices, pilot_locations); % 生成导频符号采用BPSK但也可以使用其他已知序列如Zadoff-Chu序列 pilot_symbols 1 - 2*randi([0,1], 1, length(pilot_locations)); % BPSK: 1/-1解析导频位置pilot_locations是从数据子载波中按固定间隔抽取的。data_locations是剩下的用于传输真实数据的子载波。导频符号可以是固定的如全1也可以是随机的BPSK符号。使用随机符号可以避免因特定图案引入的估计偏差。%% 3. 主仿真循环 for snr_idx 1:length(SNR_dB_vec) SNR_dB SNR_dB_vec(snr_idx); fprintf(仿真 SNR %d dB ...\n, SNR_dB); total_bit_errors 0; total_num_bits 0; for mc_iter 1:num_monte_carlo %% 3.1 发射机处理 % 生成随机比特流 (每个OFDM符号) tx_bits randi([0, 1], 1, length(data_locations)); % BPSK数据子载波数等于比特数 % BPSK调制 tx_data_symbols 1 - 2*tx_bits; % 映射0-1, 1--1 % 构建完整的频域符号向量 freq_symbols zeros(1, N_fft); freq_symbols(data_locations1) tx_data_symbols; % 1是因为Matlab索引从1开始 freq_symbols(pilot_locations1) pilot_symbols; % OFDM调制 (IFFT) 和 加循环前缀 time_symbols ifft(freq_symbols, N_fft); tx_ofdm_symbol [time_symbols(end-N_cp1:end), time_symbols]; % 加CP %% 3.2 信道传输 (频率选择性瑞利衰落) % 重新生成信道每次蒙特卡洛实验信道独立变化 channel_taps (randn(1, max_delay_taps) 1j*randn(1, max_delay_taps)) .* sqrt(pdp/2); % 通过信道线性卷积模拟多径 rx_ofdm_symbol_channel filter(channel_taps, 1, tx_ofdm_symbol); % 注意filter函数会引入信道时延输出长度变长。我们通常只取与输入等长的部分或处理ISI。 % 为了简化这里假设CP足够长我们取中间一段等于发送符号长度的部分。 start_idx max_delay_taps; % 跳过信道瞬态响应 rx_ofdm_symbol rx_ofdm_symbol_channel(start_idx1:start_idxlength(tx_ofdm_symbol)); %% 3.3 功率归一化与加噪声 % 计算有用部分去掉CP的功率用于归一化更严谨的做法 useful_part_tx time_symbols; % IFFT输出即有用符号部分 avg_power mean(abs(useful_part_tx).^2); % 实际上我们的tx_ofdm_symbol功率已经包含了CP但噪声添加是基于SNR(Es/N0)。 % 因此我们需要根据Es来调整噪声功率。一个等效方法是 % 信号功率 Es 1 (因为BPSK符号能量为1)。噪声功率 N0 1/(10^(SNR_dB/10)) noise_power 1 / (10^(SNR_dB/10)); noise sqrt(noise_power/2) * (randn(size(rx_ofdm_symbol)) 1j*randn(size(rx_ofdm_symbol))); rx_ofdm_symbol_noisy rx_ofdm_symbol noise; %% 3.4 接收机处理 % 去除循环前缀 rx_time_symbols rx_ofdm_symbol_noisy(N_cp1:end); % OFDM解调 (FFT) rx_freq_symbols fft(rx_time_symbols, N_fft); %% 3.5 信道估计与均衡 % 提取导频位置接收值 rx_pilots rx_freq_symbols(pilot_locations1); % 最小二乘(LS)信道估计在导频位置 H_est_pilots rx_pilots ./ pilot_symbols; % 插值得到所有子载波的信道频率响应估计 H_est_all interp1(pilot_locations, H_est_pilots, all_sc_indices, linear, extrap); % 迫零均衡 rx_freq_symbols_eq rx_freq_symbols ./ H_est_all; %% 3.6 数据提取与解调 % 提取数据子载波上的均衡后符号 rx_data_symbols rx_freq_symbols_eq(data_locations1); % BPSK解调判决实部符号 rx_bits real(rx_data_symbols) 0; % 实部小于0判为1否则为0 %% 3.7 误码统计 bit_errors sum(rx_bits ~ tx_bits); total_bit_errors total_bit_errors bit_errors; total_num_bits total_num_bits length(tx_bits); end BER_sim(snr_idx) total_bit_errors / total_num_bits; end逐段解析与关键技巧3.1 发射机ifft的输出time_symbols是复数功率需要归一化。我们通过BPSK符号能量为1隐含了归一化。tx_ofdm_symbol的构造是[CP, 有用符号]。3.2 信道传输使用filter函数进行线性卷积来模拟多径效应。这是一个关键点。filter(channel_taps, 1, x)的输出长度是length(x) length(channel_taps) - 1。由于我们加了CP只要CP长度N_cp max_delay_taps我们就可以从输出中截取一段完整的、只受当前符号影响的序列从max_delay_taps开始取length(tx_ofdm_symbol)个点。这模拟了CP消除ISI的效果。如果CP长度不足这里截取的部分就会包含前一个符号的干扰导致错误。3.3 加噪声这是另一个关键点。我们直接根据理论公式添加噪声。noise_power 1 / (10^(SNR_dB/10))是因为我们假设信号功率Es 1对于BPSK|symbol|^2 1。复噪声的实部和虚部独立方差各为noise_power/2所以生成噪声时乘以sqrt(noise_power/2)。这种方法避免了调用awgn函数可能带来的功率计算混淆概念更清晰。3.5 信道估计与均衡H_est_pilots rx_pilots ./ pilot_symbols是最小二乘LS估计在导频位置直接除。interp1进行线性插值。extrap参数用于处理边缘子载波的插值但效果可能不好。更稳健的做法是在频域两端多放几个导频或者使用更先进的插值方法如基于DFT的插值。迫零均衡./ H_est_all在H_est_all接近零时会极大放大噪声这是其缺点。可以简单添加一个很小的正则化因子来避免除零rx_freq_symbols_eq rx_freq_symbols ./ (H_est_all 1e-10)。3.6 解调对于BPSK只需判决符号的实部或虚部因为BPSK是实符号映射到同相分量。对于QPSK等需要分别判决实部和虚部。%% 4. 绘制结果 figure; semilogy(SNR_dB_vec, BER_sim, b-s, LineWidth, 1.5, MarkerFaceColor, b); grid on; xlabel(SNR (Es/N0) [dB]); ylabel(Bit Error Rate (BER)); title(BER vs SNR in Frequency-Selective Rayleigh Fading (BPSK, OFDM)); legend(仿真结果, Location, best); % 可选绘制理论曲线作为对比 % 理论AWGN信道下BPSK的BER: BER_theory_awgn 0.5*erfc(sqrt(10.^(SNR_dB_vec/10))) % 理论平坦瑞利衰落信道下BPSK的BER: BER_theory_rayleigh 0.5*(1 - sqrt(10.^(SNR_dB_vec/10)./(110.^(SNR_dB_vec/10)))) % 频率选择性衰落下的理论曲线较为复杂通常通过仿真获得。 hold on; SNR_linear 10.^(SNR_dB_vec/10); BER_awgn 0.5*erfc(sqrt(SNR_linear)); BER_rayleigh_flat 0.5*(1 - sqrt(SNR_linear./(1SNR_linear))); semilogy(SNR_dB_vec, BER_awgn, k--, LineWidth, 1.5); semilogy(SNR_dB_vec, BER_rayleigh_flat, r--, LineWidth, 1.5); legend(仿真 (频率选择性衰落), 理论 (AWGN), 理论 (平坦瑞利衰落));解析绘制曲线时使用semilogy让y轴以对数刻度显示便于观察BER数量级的变化。同时绘制AWGN和平坦瑞利衰落的理论曲线作为参考可以直观看出频率选择性衰落带来的性能损失。你会发现在频率选择性衰落信道中OFDM系统的BER曲线通常位于平坦瑞利衰落曲线之下性能更好这是因为OFDM将宽带的频率选择性信道转化为了多个并行的平坦衰落子信道并通过均衡进行了补偿获得了频率分集增益。但在低SNR时由于信道估计误差和噪声放大性能可能比理论平坦衰落还要差。5. 结果分析与性能提升方向运行上述代码后你会得到一条BER-SNR曲线。分析这条曲线并与理论曲线对比是仿真工作的最终目的。曲线形状在高SNR区域频率选择性衰落信道下的OFDM系统BER曲线通常会呈现一个较平坦瑞利衰落更陡峭的下降斜率。这是因为在频率选择性信道中虽然某些子载波经历深衰落但其他子载波可能处于好状态通过编码和交织本项目未涉及可以获得分集增益。我们的简单系统没有编码所以分集增益主要来自均衡后多个独立衰落的子载波的合并效应。错误平层观察曲线在高SNR时是否趋于平缓。如果出现错误平层可能的原因有CP长度不足导致残留的ISI/ICI。信道估计误差插值误差或导频数量不足在深衰落的子载波上估计不准。均衡器缺陷迫零均衡在深衰落子载波上噪声放大严重。可以尝试切换到MMSE均衡。仿真误差蒙特卡洛次数不够统计不充分。与理论值的差距在低SNR区域仿真BER可能高于平坦瑞利衰落理论值这是因为我们的简单信道估计和迫零均衡在低信噪比下性能很差。可以通过以下方法改进采用更优的信道估计例如使用最小均方误差MMSE估计代替LS估计。MMSE估计在低SNR时能利用信道统计信息抑制噪声。采用MMSE均衡MMSE均衡在噪声放大和干扰抑制之间取得平衡其公式为W_mmse H^H / (H*H^H N0*I)其中N0是噪声方差需要被估计。增加导频密度提高导频数量可以改善信道估计精度但会降低频谱效率。引入信道编码如卷积码或LDPC码这是实际系统中提升性能最有效的手段。可以仿真编码后的BER观察编码增益。仿真加速技巧蒙特卡洛仿真非常耗时尤其是仿真低BER。并行计算利用Matlab的parfor循环并行处理不同的SNR点或蒙特卡洛实验。重要性采样一种高级的仿真技术可以显著减少低BER仿真所需的样本数但实现复杂。分段仿真对高SNR低BER区域增加蒙特卡洛次数对低SNR区域减少次数。这个仿真项目是一个强大的起点。你可以通过修改参数调制方式、子载波数、信道模型、均衡算法来探究不同因素对系统性能的影响。例如将BPSK换成16QAM你会明显看到在相同SNR下BER升高或者需要更高的SNR才能达到相同的BER。你也可以尝试更复杂的信道模型如ITU定义的步行、车载信道模型让仿真更贴近现实。