HE/PSD_plot.m
2024-03-30 16:35:40 +08:00

126 lines
4.6 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

%% PSD Comparison of ADMM1, ADMM2, CFR and seperated OICF
%%% 经过SSPA后的性能比较
clc;clear;
%% System Parameter
% load system_parameter.mat K1 K2 deltaK2 B N1 N2 G L Finv1 Finv2 F1 F2
global X1 X2 x_mixed
% load Index4CCDF_Comparison.mat Index X1 X2 x_mixed
M = 4;
modu = [0 0 1 1; 0 1 0 1];
% load CCDF_Comparison_ADMM_P5_5000.mat zmixed_m_A1 zmixed_m_A2
% load CCDF_Comparison_OICF_P5_5000.mat zmixed_m_O
% load CCDF_Comparison_ICF_P5_5000.mat zmixed_m_R
% save PSD_comparison.mat...
% x_mixed zmixed_m_A1 zmixed_m_A2 zmixed_m_R zmixed_m_O
% load PSD_comparison.mat...
% x_mixed zmixed_m_A1 zmixed_m_A2 zmixed_m_R zmixed_m_O
load(['TXPackets\rx_for_User' num2str(1) '.mat'],'rx'); % 加载用户数据
x_mixed = rx;
symNum = length(x_mixed);
%% 取出PAPR最大的100个数据
[PAPR_dex,MeanPower_Orignal] = calculate_PAPR(x_mixed);
symNum = 1000;
for i = 1:symNum
[a(i),b(i)] = max(PAPR_dex);
PAPR_dex(b(i)) = 0;
end
% b = randi([1 5000],1,symNum);
x_mixed = x_mixed(:,b);[PAPR_dex,~] = calculate_PAPR(x_mixed);10*log10(mean(PAPR_dex));
% zmixed_m_A1=zmixed_m_A1(:,b);[PAPR_dex,~] = calculate_PAPR(zmixed_m_A1);10*log10(mean(PAPR_dex))
% zmixed_m_A2=zmixed_m_A2(:,b);[PAPR_dex,~] = calculate_PAPR(zmixed_m_A2);10*log10(mean(PAPR_dex))
% zmixed_m_R=zmixed_m_R(:,b); [PAPR_dex,~] = calculate_PAPR(zmixed_m_R);10*log10(mean(PAPR_dex))
% zmixed_m_O=zmixed_m_O(:,b); [PAPR_dex,~] = calculate_PAPR(zmixed_m_O);10*log10(mean(PAPR_dex))
%% SSPA Model
p = 3;IBO = 5;L=4;
% Original symbol with SSPA
x_origin_out = SSPA_model(p,IBO,x_mixed);
[~,MeanPower] = calculate_PAPR(x_origin_out);
x_origin_out = x_origin_out./sqrt(MeanPower*L);
% % ADMM1 symbol with SSPA
% x_A1_out = SSPA_model(p,IBO,zmixed_m_A1);
% [~,MeanPower] = calculate_PAPR(x_A1_out);
% x_A1_out = x_A1_out./sqrt(MeanPower*L);
% % ADMM2 symbol with SSPA
% x_A2_out = SSPA_model(p,IBO,zmixed_m_A2);
% [~,MeanPower] = calculate_PAPR(x_A2_out);
% x_A2_out = x_A2_out./sqrt(MeanPower*L);
% % CFR symbol with SSPA
% x_R_out = SSPA_model(p,IBO,zmixed_m_R);
% [~,MeanPower] = calculate_PAPR(x_R_out);
% x_R_out = x_R_out./sqrt(MeanPower*L);
% % OICF symbol with SSPA
% x_O_out = SSPA_model(p,IBO,zmixed_m_O);
% [~,MeanPower] = calculate_PAPR(x_O_out);
% x_O_out = x_O_out./sqrt(MeanPower*L);
%% PSD plot
mode = 1; % 1.周期图法periodogram 2.周期图法加汉明窗 2.文氏窗法pwelch
N = (512+36)*2;shift = -N/8;
[pxx,freq] = sprectrum(x_origin_out,mode,N);
pxx = circshift(pxx,shift);
plot(freq/pi,10*log10(pxx),'k','LineWidth',1);hold on;grid on
% [pxx,freq] = sprectrum(x_A1_out,mode,N);
% pxx = circshift(pxx,shift);
% plot(freq/pi,10*log10(pxx),'r','LineWidth',1);
%
% [pxx,freq] = sprectrum(x_A2_out,mode,N);
% pxx = circshift(pxx,shift);
% plot(freq/pi,10*log10(pxx),'b','LineWidth',1);
%
% [pxx,freq] = sprectrum(x_R_out,mode,N);
% pxx = circshift(pxx,shift);
% plot(freq/pi,10*log10(pxx),'.-r','LineWidth',1);
%
% [pxx,freq] = sprectrum(x_O_out,mode,N);
% pxx = circshift(pxx,shift);
% plot(freq/pi,10*log10(pxx),'g','LineWidth',1);
%
% xlim([-1 1]);ylim([-38 0.5])
% legend('Origin','ADMM1','ADMM2','CFR','OICF')
% xlabel('Normalized Frequency')
% ylabel('PSD (dB)')
%% APPENDIX FUNCTIONS
function [x_out] = SSPA_model(p,IBO,x)
[~,Mean_Power] = calculate_PAPR(x);
% PAPR_out_O = 10*log10(PAPR_dex);
C = sqrt(Mean_Power)*10^(IBO/20);
x_out = x./ (1+(abs(x)./C).^(2*p)).^(1/(2*p));
end
function [pxx,freq] = sprectrum(x,mode,N)
switch mode
case 1
[pxx,freq] = periodogram(x *sqrt(2*pi),[],N,'centered');
case 2
[pxx,freq] = periodogram(x *sqrt(2*pi),hamming(length(x(:,1))),N,'centered');
case 3
[pxx,freq] = pwelch(x *sqrt(2*pi),[],[],N,'centered');
end
pxx = mean(pxx,2);
end
function [PAPR_dex,Mean_Power] = calculate_PAPR(x)
% PAPR_dex 计算得到所有符号各自的PAPR
% Mean_Power 符号的平均功率
Signal_Power = abs(x).^2;
Peak_Power = max(Signal_Power,[],1); % norm(x,Inf)^2
Mean_Power = mean(Signal_Power,1); % norm(x,2)^2/(K*IF)
PAPR_dex = Peak_Power./Mean_Power;
end
function [EVM1,EVM2,EVM3,EVM_sum] = calculate_EVM(s1,s2,s3,symNum)
% 计算得到所有符号各自的EVM
global X1 X2_1 X2_2
EVM1=zeros(1,symNum);EVM2=zeros(1,symNum);EVM3=zeros(1,symNum);EVM_sum=zeros(1,symNum);
for i = 1:symNum
EVM1(i) = norm(X1(:,i)-s1(:,i),2)/norm(X1(:,i),2);
EVM2(i) = norm(X2_1(:,i)-s2(:,i),2)/norm(X2_1(:,i),2);
EVM3(i) = norm(X2_2(:,i)-s3(:,i),2)/norm(X2_2(:,i),2);
EVM_sum(i) = EVM1(i) + EVM2(i) + EVM3(i);
end
end