初识OFDM(八):OFDM中的PAPR计算和通频带仿真
文章目錄
- 初識(shí)OFDM(八):OFDM中的PAPR計(jì)算和通頻帶仿真
- 零.代碼地址
- 一. OFDM信號(hào)CF的CCFD
- 1. 代碼展示
- 2.代碼分析
- 為什么ifft后×sqrt(Nfft)?
- σ\sigmaσ是如何計(jì)算的?
- 不同變量的dB
- 二.OFDM信號(hào)的PDF
- 1.代碼展示
- 2.代碼分析
- 如何展現(xiàn)OFDM符號(hào)的合成過程
- OFDM信號(hào)具體是個(gè)啥分布啊
- 三. 量化的OFDM信號(hào)
- 1.代碼展示
- 2. 代碼分析
- 四.OFDM的通頻帶仿真
- 1.代碼展示
- 2.代碼分析
- 過采樣是怎么完成的
- 各個(gè)輸出的頻域圖像
- 五. 剩下的一些疑問
初識(shí)OFDM(八):OFDM中的PAPR計(jì)算和通頻帶仿真
零.代碼地址
https://github.com/liu-zongxi/OFDM_simulation
代碼參考了https://zhuanlan.zhihu.com/p/385096476陳老濕的仿真,但各個(gè)函數(shù)我都有重新實(shí)現(xiàn),希望寫的更規(guī)范一些
一. OFDM信號(hào)CF的CCFD
1. 代碼展示
%-----------------------OFDM信號(hào)的PAPR的CCFD----------------% %-----------------------author:lzx-------------------------% %-----------------------date:2022年3月31日-----------------%%% clear; clc; Nffts = 2.^[6:10]; % IFFT點(diǎn)數(shù),這是本仿真的變量 Npsk = 2; % 調(diào)制對(duì)應(yīng)比特?cái)?shù) M= 2^Npsk; % 調(diào)制階數(shù) Nblk = 1e3; % ? Z_dBs = 4:0.1:10; % IFFT后時(shí)域信號(hào)的能量大小 N_Z_dBs = length(Z_dBs); % ? CCDF_formula = @(N, sigma2, z) 1-((1-exp(-z.^2/(2*sigma2))).^N); % CCFD計(jì)算公式%% 主函數(shù) for kk = 1:length(Nffts) % 對(duì)于每一個(gè)不同的NfftNfft = Nffts(kk);x = zeros(Nfft, Nblk);x_CF = zeros(1, Nblk);CCDF_simulated = zeros(1,N_Z_dBs);for ii = 1:NblkX_mod = ModSymbolGenerator(Npsk, Nfft);x(:, ii) = ifft(ifftshift(X_mod), Nfft) .*sqrt(Nfft);x_CF(ii) = PAPR_dB(x(:,ii));endsigma2 = mean(mean(abs(x)))^2/(pi/2); % E(Z^2) = 2sigma^2CCDF_theoretical = CCDF_formula(Nfft, sigma2, 10.^(Z_dBs/20));for jj = 1:N_Z_dBsCCDF_simulated(jj) = sum(x_CF>Z_dBs(jj))/Nblk;endsemilogy(Z_dBs,CCDF_theoretical,'-'); hold on; grid on;semilogy(Z_dBs,CCDF_simulated,':*'); end title('OFDM system with N-point FFT'); xlabel('PAPR0[dB]'); ylabel('CCDF=Probability(PAPR>PAPR0)'); legend('Theoretical','Simulated');2.代碼分析
代碼有這么幾點(diǎn)是值得注意的
為什么ifft后×sqrt(Nfft)?
x(:, ii) = ifft(ifftshift(X_mod), Nfft) .*sqrt(Nfft);這是為了保證信號(hào)的能量不變,之前已經(jīng)提過這個(gè)問題了
σ\sigmaσ是如何計(jì)算的?
這是瑞利分布的特性
由此可以求出σ2\sigma^2σ2
不同變量的dB
我們注意到代碼
CCDF_theoretical = CCDF_formula(Nfft, sigma2, 10.^(Z_dBs/20));也就是說Z的這個(gè)dB表示實(shí)際上是20log10(Z)20log_{10}(Z)20log10?(Z),而能量的dB一般是10log10(P)10log_{10}(P)10log10?(P),這是啥原因呢?不知道有沒有大佬能給我解答一下
二.OFDM信號(hào)的PDF
1.代碼展示
%--------------------------OFDM信道的PDF--------------------% %-----------------------author:lzx-------------------------% %-----------------------date:2022年3月31日-----------------%%% 參數(shù)設(shè)置 clear; clc; N = 32; % 生成的調(diào)制符號(hào)的個(gè)數(shù) Npsk = 2; % 調(diào)制的比特 M = 2^Npsk; % 階數(shù) Nos = 16; % 過采樣倍數(shù) Nfft = N*Nos; % fft采樣點(diǎn) Ts = 1/Nfft; % 采樣周期 ts = 0:Ts:1-Ts; % 采樣時(shí)間 Nhist = 1e3; % 統(tǒng)計(jì)重復(fù)次數(shù) Nbin = 30; % 畫直方圖時(shí)被分成多少類 %% 主程序 for jj = 1:NhistX_mod = ModSymbolGenerator(Npsk, N);X(1) = 0+1j*0;xI = zeros(Nfft, N);xQ = zeros(Nfft, N);for ii = 1:N% 這是在做什么?計(jì)算一下就知道啦% 為了作圖,每個(gè)FFT只使用一個(gè)子載波% 用那些呢?最左邊的和最右邊的% 為什么?虛擬子載波吧?不太清楚if ii<=N/2 x = ifft([zeros(1,ii-1) X_mod(ii) zeros(1,Nfft-ii+1)],Nfft);else x = ifft([zeros(1,Nfft-N+ii-1) X_mod(ii) zeros(1,N-ii)],Nfft);endxI(:, ii) = real(x); xQ(:, ii) = imag(x);endHistI((Nfft*(jj-1)+1):(Nfft*jj)) = sum(xI,2);HistQ((Nfft*(jj-1)+1):(Nfft*jj)) = sum(xQ,2); end sum_xI = sum(xI,2); sum_xQ = sum(xQ,2); % 這組合出來的就是OFDM符號(hào)啦 figure(1), clf, subplot(311); plot(ts,xI,'k:','linewidth',1), hold on, plot(ts,sum_xI,'b','linewidth',2); subplot(312) plot(ts,xQ,'k:','linewidth',1); hold on, plot(ts,sum_xQ,'b','linewidth',2); subplot(313), plot(ts,abs(sum_xI+1j*sum_xQ),'b','linewidth',2); hold on; figure(2), clf, subplot(311) sqrt(var(HistI)) h_xI = histogram(HistI,Nbin); subplot(312) h_xQ = histogram(HistQ,Nbin); subplot(313) sqrt(var(HistQ)) sqrt(1/(2*N))/Nos h_x = histogram(abs(HistI+1j*HistI),Nbin);2.代碼分析
這其實(shí)是一個(gè)很基礎(chǔ)的仿真,不過做了這么久的OFDM,怎么能連他的基本的概率特性都不知道呢!所以這個(gè)還是很有意義的
如何展現(xiàn)OFDM符號(hào)的合成過程
for ii = 1:N% 這是在做什么?計(jì)算一下就知道啦% 為了作圖,每個(gè)FFT只使用一個(gè)子載波% 用那些呢?最左邊的和最右邊的% 為什么?虛擬子載波吧?不太清楚if ii<=N/2 x = ifft([zeros(1,ii-1) X_mod(ii) zeros(1,Nfft-ii+1)],Nfft);else x = ifft([zeros(1,Nfft-N+ii-1) X_mod(ii) zeros(1,N-ii)],Nfft);endxI(:, ii) = real(x); xQ(:, ii) = imag(x);end這段代碼非常適合放在我的第一篇帖子里,他詳細(xì)的展示了OFDM信號(hào)是如何合成的。
此外,為什么要使用兩側(cè)的子載波呢?
這也是之前講過的一個(gè)問題了,也就是ifftshift
不過我現(xiàn)在有了一些新的理解
這個(gè)循環(huán)位移左移動(dòng)N/2N/2N/2,指的是數(shù)據(jù)的本身長(zhǎng)度,而不是補(bǔ)0后的長(zhǎng)度,想一想,按這個(gè)思路移動(dòng)后的結(jié)果是不是就是中間插0的結(jié)果
這個(gè)仿真來源于書,他沒有前后倒置,顯然是錯(cuò)誤的,這部分具體可以看我后面的實(shí)現(xiàn)
OFDM信號(hào)具體是個(gè)啥分布啊
這似乎是一個(gè)老生常談的問題,OFDM信號(hào)的實(shí)部和虛部分別是高斯分布,幅度則是一個(gè)瑞利分布
不過,他高斯分布的具體參數(shù)是啥呢?這個(gè)問題似乎沒人說
首先,中心μ\muμ肯定是0啦,因?yàn)樗莄os或者是sin函數(shù)的中心極限定理帶來的高斯分布
那么方差呢,我數(shù)學(xué)很差,不過我會(huì)仿真啊!結(jié)果是σ=12N/Nos\sigma = \sqrt{\frac{1}{2N}}/Nosσ=2N1??/Nos
這個(gè)咋理解呢,這實(shí)際上是能量開根號(hào)啊!然后實(shí)部虛部各占一半,不過過采樣這個(gè)Nos是如何影響的,我目前還沒有想清楚
三. 量化的OFDM信號(hào)
1.代碼展示
%-----------------------OFDM中SNQR的計(jì)算-------------------% %-----------------------author:lzx-------------------------% %-----------------------date:2022年3月31日-----------------%%% clear, clf, clc; Nfft = 64; Nk = 64; % 這三個(gè)參數(shù)不重復(fù)說明啦 Npsk = 6; M = 2^Npsk; MaxIter=1000; % 迭代次數(shù) Quantbits = [6:9]; % 量化比特?cái)?shù) V_cutoffs = [2:0.2:8]; % 限幅電平 gss=['ko-';'ks-';'k^-';'kd-']; SQNRdB = zeros(length(Quantbits), length(V_cutoffs)); %% for ii = 1:length(Quantbits)Quantbit = Quantbits(ii);Quantbit_fractional = Quantbit -1;for jj = 1:length(V_cutoffs)V_cutoff = V_cutoffs(jj);Tx = 0; Te = 0;for kk = 1:MaxIterX_mod = ModSymbolGenerator(Npsk, Nk);x = ifft(X_mod, Nfft);x = x/sqrt(1/(2*Nk))/V_cutoff; % 實(shí)部或者虛部的方差是(1/(2*Nk))% x(:) = (real(x(:))>V_cutoff).*V_cutoff; % for kkk= 1:length(x) % if real(x(kkk))>V_cutoff % x(kkk) = V_cutoff + 1j*imag(x(kkk)); % end % if imag(x(kkk))>V_cutoff % x(kkk) = real(x(kkk)) + 1j*V_cutoff; % end % endxq=fi(x,1,Quantbit,Quantbit_fractional);xq=double(xq); Px = sum(abs(x).^2); e = x-xq; Pe = sum(abs(e).^2);Tx = Tx + Px; Te = Te + Pe;endSQNRdB(ii,jj) = 10*log10(Tx/Te)end end %% [SQNRdBmax,imax] = max(SQNRdB'); % To find the maximum elements in each row of SQNRdB for i=1:size(gss,1), plot(V_cutoffs,SQNRdB(i,:),gss(i,:)), hold on; end for i=1:size(gss,1)str(i,:)=[num2str(Quantbits(i)) 'bit quantization'];plot(V_cutoffs(imax(i)),SQNRdBmax(i),gss(i,1:2),'markerfacecolor','r') end xlabel('mus(clipping level normalized to \sigma)'); ylabel('SQNR[dB]'); legend(str(1,:),str(2,:),str(3,:),str(4,:)); grid on2. 代碼分析
其實(shí)已經(jīng)沒啥分析的了,現(xiàn)在回頭看看這個(gè)仿真意義不大
不過需要注意的是,他這里的限幅居然不是所謂的cutoff,而是放縮!這真的卡了我很久
四.OFDM的通頻帶仿真
1.代碼展示
%--------------------------OFDM通頻帶仿真--------------------% %-----------------------author:lzx-------------------------% %-----------------------date:2022年4月3日------------------% %% 設(shè)置參數(shù) clear; clf; clc; % 信噪比 SNRdBs=[0:10]; N_SNR=length(SNRdBs); % OFDM相關(guān) Maxiter = 1000; % 信噪比迭代次數(shù) CRs=[0.8:0.2:1.6]; % 限幅系數(shù),他會(huì)被用于RMS的相乘限幅 N_CR=length(CRs); gss='*^<sd>v'; Nmod = 2; % 映射 M = 2^Nmod; % 調(diào)制階數(shù) Nk = 128; % 子載波次數(shù),一般Nk=Nfft Nfft = 128; NGI = 32; % GI長(zhǎng)度 Nframe = 6; % 一幀6個(gè)符號(hào) Nsym = Nfft + NGI; % 系統(tǒng)長(zhǎng)度 % 采樣 fs = 1e6; % 采樣次數(shù),也就是兩個(gè)點(diǎn)直接距離 Nos = 8; % 過采樣倍數(shù) Tsym = 1/(fs/Nsym); % Nsym占了多長(zhǎng)時(shí)間? Ts = 1/(fs*Nos); % 采樣周期 ts = [0:Ts:Nframe*Tsym-Ts].'; % 載波 fc = 2e6; % 上變頻載波頻率 wc = 2*pi*fc; % 角頻率 % 濾波器 Fs=8; Norder=104; dens=20; FF=[0 1.4 1.5 2.5 2.6 Fs/2]; WW=[10 1 10]; h = firpm(Norder,FF/(Fs/2),[0 0 1 1 0 0],WW,{dens}); % 初始化一些儲(chǔ)存數(shù)組 CF = zeros(1, Maxiter); % 一些位置 bers = zeros(N_CR, N_SNR); % Z相關(guān) Z_dBs = [2:0.1:16]; N_Z = length(Z_dBs); CCDF = zeros(1, N_Z); CCDF_CR = zeros(N_CR, N_Z); %% 主函數(shù) for ii = 1:N_SNRSNR = SNRdBs(ii);for kk = 1:N_CRCR = CRs(kk);nobe = 0;for jj = 1:Maxiter% 生成一幀數(shù)據(jù),串并轉(zhuǎn)換,并QPSK,生成一幀F(xiàn)rame_FDserial = rand(1,Nk*Nframe*Nmod) > 0.5; % 發(fā)送的是bitFrame_FDparallel = reshape(Frame_FDserial,Nk,Nframe*Nmod);% 串并轉(zhuǎn)換Frame_mod = QPSKMod(Frame_FDparallel,Nk,Nframe); %調(diào)制% 做過采樣ifft% https://blog.csdn.net/sinat_38151275/article/details/85268026Frame_oversampling = [zeros(1, Nframe); Frame_mod(Nk/2+1:Nk,:); zeros(Nk*(Nos-1)-1,Nframe); Frame_mod(1:Nk/2,:)];frame = ifft(Frame_oversampling, Nfft*Nos); % Frame_mod(1,:) = 0+1j*0; % 沒有直流分量 % frame = IFFTOversampling(Frame_mod, Nk, Nos); % 過采樣IFFTframe_GI = AddGI(frame, Nfft*Nos, NGI*Nos, Nframe, "CP"); % 添加保護(hù)間隔frame_serial = reshape(frame_GI, Nframe*Nsym*Nos, 1); % 程序?qū)懙挠悬c(diǎn)問題,只能都按列來了% frame_padding = [zeros((Nfft/2-NGI)*Nos, Nframe); frame_GI; zeros(Nfft*Nos/2, Nframe)];frame_passband = sqrt(2) .* real(frame_serial.*exp(1j*wc*ts));% frame_clipped = frame_passband;frame_clipped = Clipping(frame_passband, CR);% frame_filter = frame_clipped;frame_filter = ifft(abs(fft(h.',size(frame_clipped, 1))).*fft(frame_clipped)); % 濾波原理if ii == N_SNRCF(1,jj) = PAPR_dB(frame_filter);end% 加噪聲% frame_noise = frame_filter;frame_noise = awgn(frame_filter,SNR,'measured'); % add Noise(AWGN)frame_baseband = sqrt(2) .* frame_noise.*exp(-1j*wc*ts);% frame_sample = frame_baseband(1+[0:Nos:Nsym*Nos*Nframe-1],1);frame_parallel = reshape(frame_baseband, Nsym*Nos, Nframe);frame_noGI = RemoveGI(frame_parallel, Nfft*Nos, NGI*Nos);Frame_os = fft(frame_noGI, Nfft*Nos);Frame = [Frame_os(Nfft/2+Nfft*(Nos-1)+1:Nfft*Nos, :); Frame_os(2:Nfft/2+1, :)];% Frame = fft(frame_parallel, Nfft); % for kkk = 1: Nframe % Frame(:,kkk) = fftshift(Frame(:,kkk)); % endFrame_demod = QPSKDemod(Frame, Nfft, Nframe);nobe = nobe + biterr(Frame_FDparallel(2:end,:),Frame_demod(2:end,:));% nobe = nobe + biterr(Frame_FDparallel(2:end,:),Frame_demod(2:end,:)); endbers(kk, ii) = nobe/Maxiter/Nmod/Nkif ii == N_SNRfor jjj = 1:N_ZCCDF(jjj) = sum(CF>Z_dBs(jjj))/Maxiter;endCCDF_CR(kk, :) = CCDF;endend end %% 畫圖 % figure(1) % plot(abs(fft(frame_clipped))); % figure(2) % plot(abs(fft(frame_filter))); hold off for kk = 1:N_CRgs = gss(kk);subplot(211), semilogy(Z_dBs,CCDF_CR(kk,:),[gs '-']), hold onsubplot(212), semilogy(SNRdBs,bers(kk,:),[gs '-']), hold on end2.代碼分析
PAPR就是通頻帶上的概念,所以當(dāng)然要涉及到通頻帶啦!我也就是為了這個(gè)寫了這篇文章,可以說是為了這碗醋才包的這頓餃子
過采樣是怎么完成的
我覺得本質(zhì)上還是虛擬子載波,就像上面說的,原書中的仿真我也沒有完全弄明白,我也是按照虛擬子載波的思路來處理的
各個(gè)輸出的頻域圖像
因?yàn)槲覜]有明白上載波的過程,所以我們畫出來看看
如果我們無視所謂的fftshift呢
這里我取消了濾波,因?yàn)闉V波了由于中心頻率不對(duì)就已經(jīng)錯(cuò)了
現(xiàn)在我們能明白fftshift的作用了嗎!記得之前文章我們說過的嗎,在fft中,所有的東西都是循環(huán)的,比如線性卷積變換為循環(huán)卷積。因此,想象一下我們正常的基帶信號(hào)應(yīng)該是正負(fù)半軸各一半,到了fft里負(fù)的一般自動(dòng)循環(huán)位移到后面去啦。如果沒有這一步,可以看到在通頻帶上信號(hào)的位置就錯(cuò)誤了。
而如何從基帶到通頻帶呢?這實(shí)際上就是把復(fù)包絡(luò)變換到通帶信號(hào)的變換
如何從通頻帶變換到基帶呢?平移回來后濾波就好。
五. 剩下的一些疑問
總結(jié)
以上是生活随笔為你收集整理的初识OFDM(八):OFDM中的PAPR计算和通频带仿真的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《你一学就会的-思维大图》读书笔记
- 下一篇: 安卓-橡皮擦擦线完整实现