📄 ofdm1.m
字号:
echo off
clear
clc
fprintf('OFDM_ADSL仿真\n');
%参数定义
fft_size=512;
num_carriers=256; %子载波数 导频号64 如何利用导频进行信道估计???
num_cp=32; %循环前缀长度 1/16*T
symbols_per_carrier=1000; %符号数/子载波
bits_per_symbol=4; %比特数/符号 采用16QAM调制解调
sync_delay=0; %接收端处于理想同步状态
d=1; %控制QAM调制时星座点间的最小距离
snr=input('snr='); %输入信噪比
%信号发射
baseband_out_length=num_carriers*symbols_per_carrier*bits_per_symbol;%发送的二进制序列的长度
baseband_out=randint(1,baseband_out_length);
%16QAM调制
symbol_qam=qam_modulation(baseband_out,bits_per_symbol,d);
%IFFT变换
%symbol_ifft=zeros(fft_size,symbols_per_carrier);
symbol_ifft_tem1=reshape(symbol_qam,num_carriers,symbols_per_carrier); %串并变换
symbol_ifft_tem2=zeros(fft_size,symbols_per_carrier);
%构造共轭对称矩阵
symbol_ifft_tem2(1,:)=real(symbol_ifft_tem1(1,:));
symbol_ifft_tem2(num_carriers+1,:)=imag(symbol_ifft_tem1(1,:));
symbol_ifft_tem2(2:num_carriers,:)=symbol_ifft_tem1(2:num_carriers,:);
symbol_ifft_tem2(num_carriers+2:fft_size,:)=flipdim(conj(symbol_ifft_tem1(2:num_carriers,:)),1);
symbol_ifft=ifft(symbol_ifft_tem2,fft_size,1);
%添加循环前缀
num_add_cp=fft_size+num_cp;
row_of_prefix=(fft_size-num_cp+1):fft_size;
symbols_add_cp=[symbol_ifft(row_of_prefix,:);symbol_ifft];
%通过信道(多径+awgn)
%symbol_channel=zeros(1,num_add_cp*symbols_per_carrier);
symbol_channel_tem1=symbols_add_cp(:).'; %并串变换
%channel=[1 0 0 0 1/2 0 0 0 1/3];
channel=[1 0 0 0 0 0 0 0 0]; %理想信道
%channel=[1 1/2 1/3];
symbol_channel_tem2=filter(channel,1,symbol_channel_tem1);
symbol_channel=awgn(symbol_channel_tem2,snr,'measured'); %添加高斯白噪声
%symbol_channel=symbol_channel_tem2;%不加噪
%去除循环前缀
%symbol_de_cp=zeros(fft_size,symbols_per_carrier);
symbol_de_cp_tem=reshape(symbol_channel,num_add_cp,symbols_per_carrier);
symbol_de_cp=symbol_de_cp_tem((num_cp+1+sync_delay):num_add_cp+sync_delay,:); %理想同步
%FFT变换
symbol_fft=fft(symbol_de_cp,fft_size,1);
%星座映射数据恢复
symbol_qam_ch(1,:)=symbol_fft(1,:)+j*symbol_fft(num_carriers+1,:);
symbol_qam_ch(2:num_carriers,:)=symbol_fft(2:num_carriers,:);
symbol_qam_ch=symbol_qam_ch(:).';
%16QAM解调
bits_deqam=qam_demodulation(symbol_qam_ch,bits_per_symbol,d);
%求误码率
[num,ber]=symerr(baseband_out,bits_deqam)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -