用Matlab 繪製 OFDM
时间: 2023-07-02 12:16:47 浏览: 42
下面是一个简单的OFDM系统的Matlab代码示例,包括OFDM信号的生成、添加循环前缀、AWGN信道模型、OFDM信号的解调和误码率计算,并且使用Matlab绘制了OFDM信号的时域和频域图像。
```matlab
%% OFDM系统参数定义
N = 64; % 子载波数
cp_len = 16; % 循环前缀长度
data_len = N - cp_len; % 数据长度
M = 16; % 星座数
num_bits = data_len * log2(M); % 每个OFDM符号的比特数
snr = 10; % 信噪比
%% 生成随机数据
data = randi([0 1], num_bits, 1);
%% 星座调制
mod_data = qammod(data, M);
%% OFDM调制
ofdm_data = ifft(mod_data, N);
%% 添加循环前缀
ofdm_data_cp = [ofdm_data(N-cp_len+1:N); ofdm_data];
%% 信道模型
rx_ofdm_data_cp = awgn(ofdm_data_cp, snr, 'measured');
%% OFDM解调
rx_ofdm_data = rx_ofdm_data_cp(cp_len+1:end);
rx_mod_data = fft(rx_ofdm_data, N);
rx_data = qamdemod(rx_mod_data, M);
%% 计算误码率
num_errors = sum(xor(data, rx_data));
ber = num_errors / num_bits;
%% 画图
% 时域图像
figure;
subplot(2,1,1);
plot(real(ofdm_data_cp), 'b');
hold on;
plot(real(rx_ofdm_data_cp), 'r');
title('OFDM信号时域图像');
legend('发送信号', '接收信号');
xlabel('采样点');
ylabel('幅度');
% 频域图像
subplot(2,1,2);
plot(abs(fft(ofdm_data_cp)), 'b');
hold on;
plot(abs(fft(rx_ofdm_data_cp)), 'r');
title('OFDM信号频域图像');
legend('发送信号', '接收信号');
xlabel('子载波');
ylabel('幅度');
```
上述代码中,首先定义了OFDM系统的参数,包括子载波数、循环前缀长度、星座数等。然后生成随机数据,并使用QAM调制将数据转换为模拟信号。接着进行OFDM调制,并添加循环前缀。通过在OFDM信号中添加循环前缀,可以避免多径干扰带来的影响。然后,在OFDM信号上添加AWGN信道模型,模拟实际的信道环境。接收端通过解调OFDM信号,将其转换为数字数据,并计算误码率。
最后,使用Matlab绘制OFDM信号的时域和频域图像,分别显示发送信号和接收信号。时域图像显示了OFDM信号的波形,频域图像显示了OFDM信号在频域上的分布情况。