📄 ofdm.m
字号:
clear
clc
%--------------------------------------------------------------------------
% OFDM通信系统
%
% OFDM系统由以下模块构成:
% 1 产生二进制信源
% 2 4PSK调制
% 3 IFFT
% 4 插值
% 5 低通滤波
% 6 加高斯白噪声
% 7 低通滤波
% 8 采样
% 9 FFT
% 10 4PSK解调
%--------------------------------------------------------------------------
% BTW = zeros(1,21);
% SNR = 0;
% q=1;
% while SNR < 21
%--------------------------------------------------------------------------
%程序中用到的各参数的定义
Fd = 1; %Fd是信号本身的采样频率
Fs = 8; %Fs是经过滤波器后得到的序列的抽样频率
Time_Delay = 0; %表征采样的时间偏差
SNR = 10; %加高斯白噪声的信噪比
N = 64; %二进制序列的规模
DELAY = 3; %滤波器中的延迟
R = 0.5; %滤波器中的滚降
%--------------------------------------------------------------------------
%二进制信源的产生
Signal = randsrc(1,N)>0.5; %利用randsrc来得到0,1的随机序列
subplot(3,1,1); %这一部分是作图部分
stem(Signal);
title('二进制信源');
xlabel('n');
ylabel('Signal');
%--------------------------------------------------------------------------
%4PSK调制
Signal_PSK = PSK(Signal); %利用自己编的函数来进行4PSK调制
subplot(3,1,2); %把二进制序列和解调后的序列做到一张图中
stem(real(Signal_PSK));
title('4PSK调制的实部');
xlabel('n');
ylabel('Signal_PSK的实部');
subplot(3,1,3);
stem(imag(Signal_PSK));
title('4PSK调制的虚部');
xlabel('n');
ylabel('Signal_PSK的虚部');
scatterplot(Signal_PSK); %绘制借调后的星座图
title('4PSK调制后得到的星座图');
%--------------------------------------------------------------------------
%IFFT
Signal_IFFT = IFFT_self(Signal_PSK,N/2); %利用自己编的IFFT进行运算,把频域上数据变换到时域
figure(3);
subplot(2,1,1);
stem(real(Signal_IFFT));
title('IFFT的实部');
xlabel('n');
ylabel('Signal_IFFT的实部');
subplot(2,1,2);
stem(imag(Signal_IFFT));
title('IFFT的虚部');
xlabel('n');
ylabel('Signal_IFFT的虚部');
%--------------------------------------------------------------------------
%插值
Signal_upsmp_real = upsample(real(Signal_IFFT),Fs); %进行插值,加入保护间隔,这里插入分两路进行
Signal_upsmp_imag = upsample(imag(Signal_IFFT),Fs);
Signal_upsmp = Signal_upsmp_real + Signal_upsmp_imag*j; %两路再合并为一路
figure(4);
subplot(2,1,1);
stem(real(Signal_upsmp));
title('插值');
xlabel('n');
ylabel('Signal_upsmp的实部');
subplot(2,1,2);
stem(imag(Signal_upsmp));
xlabel('n');
ylabel('Signal_upsmp的虚部');
%--------------------------------------------------------------------------
%发射端低通滤波
filter=rcosine(Fd,Fs,'sqrt',R,DELAY); %下面两句是定义的升余弦滤波器,滤波也是分两路完成的
Signal_cos1_real = rcosflt(real(Signal_upsmp),Fd,Fs,'filter/Fs',filter,1,DELAY);
Signal_cos1_imag = rcosflt(imag(Signal_upsmp),Fd,Fs,'filter/Fs',filter,1,DELAY);
Signal_cos1 = Signal_cos1_real + Signal_cos1_imag*j;
figure(5);
subplot(2,1,1);
stem(real(Signal_cos1));
title('发射端低通滤波');
xlabel('n');
ylabel('Signal_cos1的实部');
subplot(2,1,2);
stem(imag(Signal_cos1));
xlabel('n');
ylabel('Signal_cos1的虚部');
%--------------------------------------------------------------------------
% for n = 1:length(Signal_cos1)
% Signal_influ(n) = Signal_cos1(n)*exp(j*2*pi*4.0e-5*n); %表征频偏的影响,这里如果不考虑频偏的影响的话,把这部分注释掉
% Signal_influ(n) = Signal_cos1(n)*exp(j*beta); %表征相偏的影响
% end
Signal_influ = Signal_cos1; %此句是为了不考虑频偏,相偏的影响,理想的情况下,
%要考虑上面的影响的话,把此句注释掉
%--------------------------------------------------------------------------
%加性高斯白噪声
Signal_awgn = awgn(Signal_influ',SNR,'measured'); %对信号加入高斯白噪声
%Signal_awgn = Signal_cos1'; %此句是表征不加噪声的理想的情况,
figure(6);
subplot(2,1,1);
stem(real(Signal_awgn));
title('高斯白噪声');
xlabel('n');
ylabel('Signal_awgn的实部');
subplot(2,1,2);
stem(imag(Signal_awgn));
xlabel('n');
ylabel('Signal_awgn的虚部');
%--------------------------------------------------------------------------
%接收端低通滤波
filter=rcosine(Fd,Fs,'sqrt',R,DELAY); %接收端滤波器的定义,在接收端再次进行低通滤波
Signal_cos2_real = rcosflt(real(Signal_awgn),Fd,Fs,'filter/Fs',filter,1,DELAY); %滤波也是采用两路进行的
Signal_cos2_imag = rcosflt(imag(Signal_awgn),Fd,Fs,'filter/Fs',filter,1,DELAY);
Signal_cos2 = Signal_cos2_real + Signal_cos2_imag*j;
figure(7);
subplot(2,1,1);
stem(real(Signal_cos2));
title('接收端低通滤波');
xlabel('n');
ylabel('Signal_cos2的实部');
subplot(2,1,2);
stem(imag(Signal_cos2));
xlabel('n');
ylabel('Signal_cos2的虚部');
%--------------------------------------------------------------------------
%由于经过两级滤波器的延迟,所以要截取后面一段序列,要去掉前面延迟部分
Signal_actual = (Signal_cos2(2*DELAY*Fs/Fd+1:2*DELAY*Fs/Fd+N*Fs/2))'; %截取的长度为N*Fs/2
%--------------------------------------------------------------------------
%采样
Signal_downsmp_real = downsample(real(Signal_actual),Fs,Time_Delay); %对信号进行采样,回复原来的信号
Signal_downsmp_imag = downsample(imag(Signal_actual),Fs,Time_Delay); %采样也是两路进行,采样频率和插值频率相同
Signal_downsmp = Signal_downsmp_real + j*Signal_downsmp_imag;
figure(8);
subplot(2,1,1);
stem(real(Signal_downsmp));
title('采样');
xlabel('n');
ylabel('Signal_downsmp的实部');
subplot(2,1,2);
stem(imag(Signal_downsmp));
xlabel('n');
ylabel('Signal_downsmp的虚部');
%--------------------------------------------------------------------------
%FFT
Signal_FFT = FFT_self(Signal_downsmp,N/2); %利用自己编的FFT进行运算,把时域上数据再变换回频域
figure(9);
subplot(2,1,1);
stem(real(Signal_FFT));
title('FFT');
xlabel('n');
ylabel('Signal_FFT的实部');
subplot(2,1,2);
stem(imag(Signal_FFT));
xlabel('n');
ylabel('Signal_FFT的虚部');
scatterplot(Signal_FFT); %绘制星座图
title('4PSK解调前的星座图');
%--------------------------------------------------------------------------
%4PSK解调
Signal_real = DEPSK(Signal_FFT); %利用自己编的解调函数进行4PSK解调
figure(11);
stem(Signal_real);
title('4PSK解调');
xlabel('n');
ylabel('Signal_real');
%--------------------------------------------------------------------------
if(Signal_real == Signal) %辨别有没有误码,如果没有则输出true,有误码则输出false
disp('true');
else
disp('false');
end
%--------------------------------------------------------------------------
%这一部分是对误码率的计算,采用循环寻找的办法,当然也可以用MATLAB自带的函数
l = 0;
i = 1;
while i <= N
if Signal_real(i) ~= Signal(i)
l = l+1;
end
i = i+1;
end
BTW(q) = l/N; %BTW表征误码率
% q = q + 1;
% SNR = SNR + 1;
% end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -