天天看點

ofdm

論文

程式

clear all; 
close all; 


%DVB傳送參數
Tu=224e-6; %可利用 OFDM 符号時間
T=Tu/2048; %原始基帶周期
G=0; %允許保護時間間隔選擇 1/4, 1/8, 1/16或1/32 
delta=G*Tu; %保護間隔持續時間
Ts=delta+Tu; % 整個OFDM 持續時間
Kmax=1705; %子載波數目
Kmin=0; 
FS=4096; %IFFT/FFT 長度
q=10; %載波周期與原始基帶周期比;即一個原始基帶周期中有10個載波周期
fc=q*1/T; %載波頻率;載波頻率是基帶周期的10倍,一個基帶周期中有10個載波周期
Rs=4*fc; %模拟周期;模拟信号頻率上的周期是載波頻率的4倍,一個基帶周期中有10個載波周期,40個模拟周期
t=0:1/Rs:Tu; %t表示橫坐标即時間,總時長為一個ofdm符号tu,按照Rs的頻率劃分點數



%資料産生程式 (A) 
M=Kmax+1; %M表示載波數量1705
rand('state',0); %rand函數中state表示以後生成的随機數與第一次生成的相同,0為标記,之後生成标記為0的随機數都與本次生成的随機數相同
a=-1+2*round(rand(M,1)).'+i*(-1+2*round(rand(M,1))).';%本語句實作QAM的功能,将二進制映射為複數,即映射到星座圖上, 
%round表示四舍五入,rand函數生成0到1之間的小數,兩個函數嵌套表示生成整數0與1,其中rand語句表示生成M行1列的随機數
A=length(a); %1706個複數,1個複數對應一個子載波。
info=zeros(FS,1); %生成4096個載波


%下面兩條語句的作用是:4096個子載波中我們隻使用其中的1705個,
%并将1705個複數的值配置設定到這1705個子載波上,
%注意後半部分的值在0載波右邊,前半部分的值分布在4096載波的左側
info(1:(A/2)) = [ a(1:(A/2)).']; %補充零;
info((FS-((A/2)-1)):FS) = [ a(((A/2)+1):A).']; 

%子載波産生程式 (B) 
carriers=FS.*ifft(info,FS); %對頻域info進行4096點的ifft變換,得到時域信号carriers,即一個ofdm符号
tt=0:T/2:Tu; %橫坐标tt共4097個點
figure(1); 
subplot(211); 
stem(tt(1:20),real(carriers(1:20))); %隻畫出了20個點
subplot(212); 
stem(tt(1:20),imag(carriers(1:20))); 
figure(2); 
f=(2/T)*(1:(FS))/(FS); %橫坐标,與時域相同共4096個點,第4096個對應的值為時域間隔的倒數2/T
subplot(211); 
plot(f,abs(fft(carriers,FS))/FS); 
subplot(212); 
pwelch(carriers,[],[],[],2/T); %carriers為要處理的信号,2/T為采樣頻率


% D/A 轉換模拟
L = length(carriers); %ofdm符号(時域),共4096個點
chips = [ carriers.';zeros((2*q)-1,L)]; 
p=1/Rs:1/Rs:T/2; 
g=ones(length(p),1); %脈沖形成
figure(3); 
stem(p,g); 
dummy=conv(g,chips(:)); 
u=[dummy(1:length(t))]; % (C) 
figure(4); 
subplot(211); 
plot(t(1:400),real(u(1:400))); 
subplot(212); 
plot(t(1:400),imag(u(1:400))); 
figure(5); 
ff=(Rs)*(1:(q*FS))/(q*FS); 
subplot(211); 
plot(ff,abs(fft(u,q*FS))/FS); 
subplot(212); 
pwelch(u,[],[],[],Rs); 

[b,a] = butter(13,1/20); %重構濾波器
[H,F] = freqz(b,a,FS,Rs); 
figure(6); 
plot(F,20*log10(abs(H))); 
uoft = filter(b,a,u); %基帶信号 (D) 
figure(7); 
subplot(211); 
plot(t(80:480),real(uoft(80:480))); 
subplot(212); 
plot(t(80:480),imag(uoft(80:480))); 
figure(8); 
subplot(211); 
plot(ff,abs(fft(uoft,q*FS))/FS); 
subplot(212); 
pwelch(uoft,[],[],[],Rs); 
%Upconverter 
s_tilde=(uoft.').*exp(1i*2*pi*fc*t); 
s=real(s_tilde); %通頻帶信号 (E) 
figure(9); 
plot(t(80:480),s(80:480)); 
figure(10); 
subplot(211); 
%plot(ff,abs(fft(((real(uoft).').*cos(2*pi*fc*t)),q*FS))/FS); 
%plot(ff,abs(fft(((imag(uoft).').*sin(2*pi*fc*t)),q*FS))/FS); 
plot(ff,abs(fft(s,q*FS))/FS); 
subplot(212); 
%pwelch(((real(uoft).').*cos(2*pi*fc*t)),[],[],[],Rs); 
%pwelch(((imag(uoft).').*sin(2*pi*fc*t)),[],[],[],Rs); 
pwelch(s,[],[],[],Rs);