OFDM发射机与接收机的matlab实现

clear;
close all;

EbN0 = [0:2:20];          %Eb/N0
N_iter = 1e5;
Nframe = 3;
Nused = 64;
Nbps = 4; M = 2^Nbps;     %调制阶数 = 2/4/6; QPSK/16-QAM/64-QAM
Nfft = 64;
Nsym = 64;
norms = [1 sqrt(2) 0 sqrt(10) 0 sqrt(42)];  %BPSK 4-QAM 16-QAM
Target_neb = 500;    %积累了一定的错误自动停止循环
sigPow = 0;
for i = 0:length(EbN0)
    randn('state',0);rand('state',0);
%     初始化错误比特数和总比特数
    Neb = 0;
    Ntb = 0;
%     迭代设计
    for m = 1:N_iter
        X = randi([0,M-1],1,Nused*Nframe);   %bit:整数向量
        Xmod = qammod(X,M,'gray')/norms(Nbps);
        
        kk1 = [1:Nused/2];          %前半有效载波序号
        kk2 = [Nused/2 + 1:Nused];  %后半有效载波序号
        kk3 = 1:Nfft;               %载波序号
        kk4 = 1:Nsym;               %符号周期序号
        
        for k = 1:Nframe
            X_shift  = [Xmod(kk2) Xmod(kk1)];
%         IFFT 调制
            x = ifft(X_shift);
            x_GI(kk4) = x;
            kk1 = kk1 + Nused;
            kk2 = kk2 + Nused;
            kk3 = kk3 + Nfft;
            kk4 = kk4 + Nsym;
        end
        
        %     信道
         y = x_GI;
        if i == 0   %只测量信号功率
            y1 = y(1:Nframe*Nsym);
            sigPow = sigPow + y1*y1';
            continue;
        end
%     y1 = x_GI(1:Nframe*Nsym);
   
%     sigPow = y1*y1';
    snr = EbN0(i) + 10*log10(Nbps*(Nused/Nfft));  %(4.28)SNR vs.Eb/N0
%     noise_mag = 0;
    noise_mag = sqrt((10.^(-snr/10))*sigPow/2);
    
    y_GI = y + noise_mag * (randn(size(y))+1j*randn(size(y)));
%     Rx
    kk1 = 1:Nsym;
    kk2 = 1:Nfft;
    kk3 = 1:Nused;
    kk4 = Nused/2  + 1:Nfft;
    kk5 = [1:Nused/2];
    for k = 1:Nframe
%         FFT
    Y(kk2) = fft(y_GI(kk1));
    Y_shift = [Y(kk4) Y(kk5)];
    Xmod_r(kk3) = Y_shift;
    
    kk1 = kk1 + Nsym;
    kk2 = kk2 + Nfft;
    kk3 = kk3 + Nused;
    kk4 = kk4 + Nfft;
    kk5 = kk5 + Nfft;
    end
    X_r = qamdemod(Xmod_r*norms(Nbps),M,'gray');          %解调制
    Neb = Neb + sum(sum(de2bi(X_r,Nbps)~=de2bi(X,Nbps))); %计算误比特数
    Ntb = Ntb + Nused*Nframe * Nbps;                      %计算总比特数
    if Neb > Target_neb,break;end
    end
    
    if i == 0
        sigPow = sigPow/Nsym/Nframe/N_iter;
    else
        Ber = Neb/Ntb;
        fprintf('EbN0=%3d[dB],BER=%4d/%8d=%11.3e\n',EbN0(i),Neb,Ntb,Ber);
        Ber_buf(i) = Ber;
        if Ber < 1e-6 , break;end
    end
    
end
disp('Simulation finished')
EbN0dB = [0:1:20];
M = 2^Nbps;
ber_AWGN = ber_QAM(EbN0dB,M,'AWGN');
semilogy(EbN0dB,ber_AWGN,'r:'),hold on
semilogy(EbN0(1:i),Ber_buf,'b--s');
grid on;
axis([EbN0(1) EbN0(end) 1e-6 1])
legend('AWGN analytic','Simulation')
xlabel('EbN0[dB]'),ylabel('BER')
% plot(Ber_buf)
    
### 设计OFDM发射机接收机模块的MATLAB实现 #### 1. OFDM基本原理概述 正交频分复用(Orthogonal Frequency Division Multiplexing, OFDM)是一种高效的多载波调制技术,在无线通信领域广泛应用。通过将高速数据流分割成多个并行低速子数据流,并分配给不同的子载波传输,可以有效对抗频率选择性衰落。 #### 2. 发射端设计 在MATLAB中构建OFDM发射器涉及以下几个主要步骤: - **符号映射**:根据所选调制方式(如QPSK、16-QAM等),将输入比特序列转换为相应的星座图点。 - **IFFT变换**:为了创建时域信号,需要对这些经过映射后的符号执行逆快速傅里叶变换(Inverse Fast Fourier Transform),即将频域上的离散谱线变换成连续的时间函数[^1]。 ```matlab % 符号映射IFFT操作示例代码 modulated_symbols = qammod(data_bits, M); % 假设M=16表示采用16-QAM调制 ofdm_time_signal = ifft(modulated_symbols); ``` - **循环前缀添加**:为了避免ISI干扰以及简化同步过程,通常会在每个OFDM符号之前附加一段复制自该符号尾部的数据作为保护间隔——即所谓的循环前缀(CP)。 ```matlab cp_length = round(cyclic_prefix_ratio * length(ofdm_time_signal)); tx_waveform_with_cp = [ofdm_time_signal(end-cp_length+1:end); ofdm_time_signal]; ``` #### 3. 接收端处理流程 对于接收到的含有噪声和其他失真的RF信号而言,其解码工作主要包括如下几个方面: - **去除CP**:由于发送方已经加入了足够的冗余信息来抵消多径效应带来的影响,因此接收侧可以直接丢弃这部分重复的信息片段而不会造成误码率上升。 - **FFT运算**:利用快速傅立叶变换(Fast Fourier Transform)恢复原始的频域表达形式,从而便于后续进行信道估计及均衡化处理。 ```matlab rx_waveform_without_cp = rx_waveform(cp_length+1:end); demodulated_symbols = fft(rx_waveform_without_cp); ``` - **符号解调**:最后一步就是依据预先设定好的规则把得到的结果反向映射回二进制位串上完成整个链路闭环控制。 ```matlab received_data_bits = qamdemod(demodulated_symbols, M); ``` 以上便是基于MATLAB平台搭建简单版OFDM系统的全过程介绍。值得注意的是实际应用场景下还需要考虑更多因素比如帧结构定义、导频插入机制等等才能满足工业标准的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值