⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ofdm.m

📁 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 + -