OFDM仿真代码这一行到底哪里出错了呀?

% 基带数据信息
N = 64;            % 子载波数
n = 48;            % 用于传输数据的子载波数
CP = 16;           % 循环前缀长度
M = 4;             % 星座点数,本示例使用 QPSK 调制
modulation = 'QPSK'; % 调制方式

% 发送端
tx_data = randi([0 M-1],n,1);  % 随机生成传输数据
pilots = randi([0 M-1],N-n,1); % 随机生成用于信道估计的导频序列

% 调制
modulated_data = qammod(tx_data,M);   % 调制传输数据
modulated_pilots = qammod(pilots,M); % 调制导频序列

% 构造频域信号
tx_data_freq = zeros(N,1);
tx_data_freq([1:n/2+1 N-n/2+2:N]) = modulated_data; % 插入数据子载波
tx_data_freq(n/2+2:n/2+N-n) = modulated_pilots;      % 插入导频子载波
% IFFT
tx_data_time = ifft(tx_data_freq,N);

% 添加循环前缀
tx_data_cp = [tx_data_time(N-CP+1:N); tx_data_time];

% 通过信道
snr = 10;  % 信噪比
rx_data_cp = awgn(tx_data_cp,snr);

% 接收端
rx_data = rx_data_cp(CP+1:CP+n);

% 解调
demodulated_data = qamdemod(rx_data,M);

% 性能评估
ber = sum(abs(demodulated_data - tx_data))/n; % 计算误比特率
disp(['误比特率 = ' num2str(ber)]);

%% 绘制OFDM的频谱以及波形图
% 频谱
figure(1)
f = -N/2:N/2-1;
plot(f, fftshift(abs(tx_data_freq)))
title('OFDM频谱')
xlabel('子载波编号')
ylabel('幅度')

% 波形
figure(2)
subplot(211)
plot(real(tx_data_time))
title('OFDM时域波形(实部)')
xlabel('时间')
ylabel('幅度')

subplot(212)
plot(imag(tx_data_time))
title('OFDM时域波形(虚部)')
xlabel('时间')
ylabel('幅度')

%% 功率谱密度分析
% 发送信号的功率谱密度
pwelch(tx_data_cp,[],[],[],1,'twosided');

% 接收信号的功率谱密度
pwelch(rx_data_cp,[],[],[],1,'twosided');


以上是完整代码,第十九行“tx_data_freq(n/2+2:n/2+N-n) = modulated_pilots; % 插入导频子载波”matlab一直报错,说两边元素不对等,无法执行赋值,是怎么回事呀?有懂OFDM仿真代码的看一看

img

以下答案引用自GPT-3大模型,请合理使用:

修改意见:
上述代码第19行错误是由于N>n,rx_data_cp(CP+1:CP+n)定义导致的,使用N-n+1替换该行后可以正常执行。具体修改如下: 
tx_data_freq(n/2+2:n/2+N-n+1) = modulated_pilots;      % 插入导频子载波

如果我的回答解决了您的问题,请采纳我的回答

该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据代码,可以看出问题出在第19行的 tx_data_freq(n/2+2:n/2+N-n) = modulated_pilots,因为在此处对 tx_data_freq 的一个子集进行赋值,该子集的长度为 N-n,而 modulated_pilots 的长度是 N-n+16,两者的长度不相等。
-
这可能是由于 n 和 N 的值不一致导致的。你可以检查一下变量的值,确保它们符合预期。如果需要,你可以使用 disp 或 fprintf 命令打印变量的值来进行调试。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^