clear all;
close all;
carrier_count=4;%子载波数
symbols_per_carrier=2;%每子载波含符号数
bits_per_symbol=4;%每符号含比特数,16QAM调制
IFFT_bin_length=512;%FFT点数
PrefixRatio=0;%保护间隔与OFDM数据的比例 1/6~1/4
GI=PrefixRatio*IFFT_bin_length ;%每一个OFDM符号添加的循环前缀长度为1/4*IFFT_bin_length 即保护间隔长度为128
beta=1/512;%窗函数滚降系数
GIP=beta*(IFFT_bin_length+GI);%循环后缀的长度20
SNR=15; %信噪比dB
%==================================================
%================信号产生===================================
baseband_out_length = carrier_count * symbols_per_carrier * bits_per_symbol;%所输入的比特数目
carriers = (1:carrier_count) + (floor(IFFT_bin_length/4) - floor(carrier_count/2));%共轭对称子载波映射 复数数据对应的IFFT点坐标
conjugate_carriers = IFFT_bin_length - carriers + 2;%共轭对称子载波映射 共轭复数对应的IFFT点坐标
baseband_out=round(rand(1,baseband_out_length));%输出待调制的二进制比特流
%==============16QAM调制====================================
complex_carrier_matrix=qam16(baseband_out);%列向量
complex_carrier_matrix=reshape(complex_carrier_matrix',carrier_count,symbols_per_carrier)';%symbols_per_carrier*carrier_count 矩阵
figure(1);
plot(complex_carrier_matrix,'*r');%16QAM调制后星座图
title('16QAM调制后星座图')
axis([-4, 4, -4, 4]);
grid on
%=================IFFT===========================
IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);%添0组成IFFT_bin_length IFFT 运算
IFFT_modulation(:,carriers ) = complex_carrier_matrix ;%未添加导频信号 ,子载波映射在此处
IFFT_modulation(:,conjugate_carriers ) = conj(complex_carrier_matrix);%共轭复数映射
%=================================================================
signal_after_IFFT=ifft(IFFT_modulation,IFFT_bin_length,2);%OFDM调制 即IFFT变换
time_wave_matrix =signal_after_IFFT;%时域波形矩阵,行为每载波所含符号数,列ITTF点数,N个子载波映射在其内,每一行即为一个OFDM符号
%===========================================================
%=====================添加循环前缀与后缀====================================
XX=zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP);
for k=1:symbols_per_carrier;
for i=1:IFFT_bin_length;
XX(k,i+GI)=signal_after_IFFT(k,i);
end
for i=1:GI;
XX(k,i)=signal_after_IFFT(k,i+IFFT_bin_length-GI);%添加循环前缀
end
for j=1:GIP;
XX(k,IFFT_bin_length+GI+j)=signal_after_IFFT(k,j);%添加循环后缀
end
end
time_wave_matrix_cp=XX;%添加了循环前缀与后缀的时域信号矩阵,此时一个OFDM符号长度为IFFT_bin_length+GI+GIP=660
%==============OFDM符号加窗==========================================
windowed_time_wave_matrix_cp=zeros(1,IFFT_bin_length+GI+GIP);
for i = 1:symbols_per_carrier
windowed_time_wave_matrix_cp(i,:) = real(time_wave_matrix_cp(i,:)).*rcoswindow(beta,IFFT_bin_length+GI)';%加窗 升余弦窗
end
%========================生成发送信号,并串变换==================================================
windowed_Tx_data=zeros(1,symbols_per_carrier*(IFFT_bin_length+GI)+GIP);
windowed_Tx_data(1:IFFT_bin_length+GI+GIP)=windowed_time_wave_matrix_cp(1,:);
for i = 1:symbols_per_carrier-1 ;
windowed_Tx_data((IFFT_bin_length+GI)*i+1:(IFFT_bin_length+GI)*(i+1)+GIP)=windowed_time_wave_matrix_cp(i+1,:);%并串转换,循环后缀与循环前缀相叠加
end
%=======================================================
Tx_data=reshape(windowed_time_wave_matrix_cp',(symbols_per_carrier)*(IFFT_bin_length+GI+GIP),1)';%加窗后 循环前缀与后缀不叠加 的串行信号
%=================================================================
temp_time1 = (symbols_per_carrier)*(IFFT_bin_length+GI+GIP);%加窗后 循环前缀与后缀不叠加 发送总位数
figure (2)
subplot(2,1,1);
plot(0:temp_time1-1,Tx_data );%循环前缀与后缀不叠加 发送的信号波形
grid on
ylabel('Amplitude (volts)')
xlabel('Time (samples)')
title('循环前后缀不叠加的OFDM Time Signal')
temp_time2 =symbols_per_carrier*(IFFT_bin_length+GI)+GIP;
subplot(2,1,2);
plot(0:temp_time2-1,windowed_Tx_data);%循环后缀与循环前缀相叠加 发送信号波形
grid on
ylabel('Amplitude (volts)')
xlabel('Time (samples)')
title('循环前后缀叠加的OFDM Time Signal')
%===============加窗的发送信号频谱=================================
symbols_per_average = ceil(symbols_per_carrier/5);%符号数的1/5,10行
avg_temp_time = (IFFT_bin_length+GI+GIP)*symbols_per_average;%点数,10行数据,10个符号
averages = floor(temp_time1/avg_temp_time);
average_fft(1:avg_temp_time) = 0;%分成5段
for a = 0:(averages-1)
subset_ofdm = Tx_data(((a*avg_temp_time)+1):((a+1)*avg_temp_time));%利用循环前缀后缀未叠加的串行加窗信号计算频谱
subset_ofdm_f = abs(fft(subset_ofdm));%分段求频谱
average_fft = average_fft + (subset_ofdm_f/averages);%总共的数据分为5段,分段进行FFT,平均相加
end
average_fft_log = 20*log10(average_fft);
figure (3)
subplot(2,1,2)
plot((0:(avg_temp_time-1))/avg_temp_time, average_fft_log)%归一化 0/avg_temp_time : (avg_temp_time-1)/avg_temp_time
hold on
plot(0:1/IFFT_bin_length:1, -35, 'rd')
grid on
axis([0 0.5 -40 max(average_fft_log)])
ylabel('Magnitude (dB)')
xlabel('Normalized Frequency (0.5 = fs/2)')
title('加窗的发送信号频谱')
%====================添加噪声=================================
Tx_signal_power = var(windowed_Tx_data);%发送信号功率
linear_SNR=10^(SNR/10);%线性信噪比
noise_sigma=Tx_signal_power/linear_SNR;
noise_scale_factor = sqrt(noise_sigma);%标准差sigma
noise=randn(1,((symbols_per_carrier)*(IFFT_bin_length+GI))+GIP)*noise_scale_factor;%产生正态分布噪声序列
Rx_data=windowed_Tx_data +noise;%接收到的信号加噪声
N1=length(Rx_data);
M=15;
L=N1;
tx=1:1:N1;
signal_r=Rx_data;
signal_reconstruct=zeros(1,L);
signal_reconstruct01=zeros(M,L);
atomic01=zeros(M,L);
yabs01=zeros(M,1);
gabor01=zeros(M,L);
yabs01=zeros(M,1);
for ii=1:M
ii
proj=0;
dic=0;
a_base=2;
j_min=1;
j_max=ceil(log2(N1));
u_base=1/2;
p_min=0;
v_base=pi;
k_min=0;
w_base=pi/6;
i_min=0;
i_max=12;
%signal_original=signal_original;((j_max)/5)
proj_trans=0;
proj=0;
size_dic=0;
for k1=1:1:10;
s=N1/(1*k1);
for k2=1:k1;
for k3=0.2:(1/(s)):2
% for k4=i_min:i_max
size_dic=size_dic+1;
% s=N1/(1*k1);
u=s.*(k2-1/2);
v=v_base*k3*2;
% w=w_base*k4;
% t=1:N;
% t=((t-u)/s);
% g1=(1/sqrt(s))*exp(-pi*((tx-u)/s).*((tx-u)/s)).*cos(v*tx);
% g1=g1./sqrt(sum(g1.*g1));
% g2=(1/sqrt(s))*exp(-pi*((tx-u)/s).*((tx-u)/s)).*sin(v*tx);
% g2=g2./sqrt(sum(g2.*g2));
%window=0*((u-s/2)>tx)+1*(((u-s/2)<tx<(u+s/2)))+0*(tx>(u+s/2));
window=rectpuls((tx-u),s);
g1=window.*cos(v*tx);
g1=g1./sqrt(sum(g1.*g1));
g2=window.*sin(v*tx);
g2=g2./sqrt(sum(g2.*g2));
proj_trans1=sum(signal_r.*g1);
proj_trans2=sum(signal_r.*g2);
proj_trans=sqrt(proj_trans1.*proj_trans1+proj_trans2.*proj_trans2);
if abs(proj_trans)>abs(proj)
proj=proj_trans;
scale=s;
translation=u;
freq=v;
phase=atan(-1*proj_trans2/proj_trans1);
%end
end
end
end
end
%window=0*((u-s/2)>tx)+1*(((u-s/2)<tx<(u+s/2)))+0*(tx>(u+s/2));
window=rectpuls((tx-translation),scale);
g=window.*cos(freq*tx+phase);
g=g/sqrt(sum(g.*g));
proj_3=sum(signal_r.*g);
yabs01(ii)=(proj_3);%保存系数
yabs02(ii)=(freq);%保存系数
yabs03(ii)=(scale);%保存系数
yabs04(ii)=(translation);%保存系数
yabs05(ii)=(phase);%保存系数
signal_reconstruct=signal_reconstruct+proj_3.*g;
signal_r=signal_r-proj_3.*g;
gabor=proj_3.*g;
signal_reconstruct01(ii,:)=signal_reconstruct;
gabor01(ii,:)=g
OFDM.zip_OFDM信号_OFDM载波_QAM信号_ofdm子载波_qam-ofdm
版权申诉
30 浏览量
2022-09-20
21:33:07
上传
评论
收藏 5KB ZIP 举报
钱亚锋
- 粉丝: 86
- 资源: 1万+
最新资源
- 使用 C 语言实现的计算非负整数的阶乘
- 2011-2021最新版本北京大学数字普惠金融指数(PKU-DFIIC).xlsx
- 县域数字乡村指数2018-2020(1).xlsx
- Docker容器配置进阶
- tensorflow-gpu-2.7.4-cp37-cp37m-manylinux2010-x86-64.whl
- 多段线、 圆、弧转多段线(仅我可见)
- tensorflow-2.7.2-cp38-cp38-manylinux2010-x86-64.whl
- 李慧琴C语言基础部分.zip
- yeyue-p8Yi4-ve4a83792.apk
- tensorflow-gpu-2.7.3-cp38-cp38-manylinux2010-x86-64.whl
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈