OFDM调制matlab仿真详细代码

OFDM调制matlab仿真详细代码MATLAB仿真代码%==================================================%作者:肆拾伍%时间:11/302019%版本:V3%=================OFDM仿真参数说明:================%%子载波数carrier_count—200%总符号数symbol_count…

大家好,又见面了,我是你们的朋友全栈君。

MATLAB仿真代码

% ==================================================
% 作者: 肆拾伍
% 时间:11/30 2019
% 版本:V3
% =================OFDM仿真参数说明:================
% 
% 子载波数 carrier_count     ---200
% 总符号数 symbol_count      ---100
% IFFT长度 ifft_length       ---512
% 循环前缀 CP_length         ---512/4=128
% 循环后缀 CS_length         ---20
% 升余弦窗系数 alpha         ---7/32
% 调制方式                   QAM16、QPSK 可选
% 多径幅度 mult_path_am      ---[1 0.2 0.1] 
% 多径时延 mutt_path_time    ---[0 20 50]
% ====================仿真过程=======================
% 产生0-1随机序列 => 串并转换 => 映射 => 取共轭、过采样
% => IFFT => 加循环前缀和后缀 => 加窗 => 并串转换 => 
% 多径信道 =>  加AWGN => 串并转换 => 去前缀 => FFT =>
% 下采样 =>  解映射 => 求误码率 
% ==================================================
clear all;
close all;
carrier_count = 200; % 子载波数
symbol_count = 100;
ifft_length = 512;
CP_length = 128;
CS_length = 20;
rate = [];
SNR =20;
bit_per_symbol = 4; % 调制方式决定
alpha = 1.5/32;
% ================产生随机序列=======================
bit_length = carrier_count*symbol_count*bit_per_symbol;
bit_sequence = round(rand(1,bit_length))'; % 列向量
% ================子载波调制方式1========================
% 1-28置零 29-228有效 229-285置零 286-485共轭 486-512置零
carrier_position = 29:228;
conj_position = 485:-1:286;
bit_moded = qammod(bit_sequence,16,'InputType','bit');
figure('position',[0 0 400 400],'menubar','none');
scatter(real(bit_moded),imag(bit_moded));
title('调制后的散点图');
grid on;
% ===================IFFT===========================
% =================串并转换==========================
ifft_position = zeros(ifft_length,symbol_count);
bit_moded = reshape(bit_moded,carrier_count,symbol_count);
figure('position',[400 0 400 400],'menubar','none');
stem(abs(bit_moded(:,1)));
grid on;
ifft_position(carrier_position,:)=bit_moded(:,:);
ifft_position(conj_position,:)=conj(bit_moded(:,:));
signal_time = ifft(ifft_position,ifft_length);
figure('position',[0 400 400 400],'menubar','none');
subplot(3,1,1)
plot(signal_time(:,1),'b');
title('原始单个OFDM符号');
xlabel('Time');
ylabel('Amplitude');
% ==================加循环前缀和后缀==================
signal_time_C = [signal_time(end-CP_length+1:end,:);signal_time];
signal_time_C = [signal_time_C; signal_time_C(1:CS_length,:)];
subplot(3,1,2); % 单个完整符号为512+128+20=660
plot(signal_time_C(:,1));
xlabel('Time');
ylabel('Amplitude');
title('加CP和CS的单个OFDM符号');
% =======================加窗========================
signal_window = zeros(size(signal_time_C));
% 通过矩阵点乘
signal_window = signal_time_C.*repmat(rcoswindow(alpha,size(signal_time_C,1)),1,symbol_count);
subplot(3,1,3)
plot(signal_window(:,1))
title('加窗后的单个OFDM符号')
xlabel('Time');
ylabel('Amplitude');
% ===================发送信号,多径信道====================
signal_Tx = reshape(signal_window,1,[]); % 变成时域一个完整信号,待传输
signal_origin = reshape(signal_time_C,1,[]); % 未加窗完整信号
mult_path_am = [1 0.2 0.1]; %  多径幅度
mutt_path_time = [0 20 50]; % 多径时延
windowed_Tx = zeros(size(signal_Tx));
path2 = 0.2*[zeros(1,20) signal_Tx(1:end-20) ];
path3 = 0.1*[zeros(1,50) signal_Tx(1:end-50) ];
signal_Tx_mult = signal_Tx + path2 + path3; % 多径信号
figure('menubar','none')
subplot(2,1,1)
plot(signal_Tx_mult)
title('多径下OFDM信号')
xlabel('Time/samples')
ylabel('Amplitude')
subplot(2,1,2)
plot(signal_Tx)
title('单径下OFDM信号')
xlabel('Time/samples')
ylabel('Amplitude')
% =====================发送信号频谱========================
% ====================未加窗信号频谱=======================
% 每个符号求频谱再平均,功率取对数
figure % 归一化
orgin_aver_power = 20*log10(mean(abs(fft(signal_time_C'))));
subplot(2,1,1)
plot((1:length(orgin_aver_power))/length(orgin_aver_power),orgin_aver_power)
hold on
plot(0:1/length(orgin_aver_power):1 ,-35,'rd')
hold off
axis([0 1 -40 max(orgin_aver_power)])
grid on
title('未加窗信号频谱')
% ====================加窗信号频谱=========================
orgin_aver_power = 20*log10(mean(abs(fft(signal_window'))));
subplot(2,1,2)
plot((1:length(orgin_aver_power))/length(orgin_aver_power),orgin_aver_power)
hold on
plot(0:1/length(orgin_aver_power):1 ,-35,'rd')
hold off
axis([0 1 -40 max(orgin_aver_power)])
grid on
title('加窗信号频谱')
% ========================加AWGN==========================
signal_power_sig = var(signal_Tx); % 单径发送信号功率
signal_power_mut = var(signal_Tx_mult); % 多径发送信号功率
SNR_linear = 10^(SNR/10);
noise_power_mut = signal_power_mut/SNR_linear;
noise_power_sig = signal_power_sig/SNR_linear;
noise_sig = randn(size(signal_Tx))*sqrt(noise_power_sig);
noise_mut = randn(size(signal_Tx_mult))*sqrt(noise_power_mut);
% noise_sig=0;
% noise_mut=0;
Rx_data_sig = signal_Tx+noise_sig;
Rx_data_mut = signal_Tx_mult+noise_mut;
% =======================串并转换==========================
Rx_data_mut = reshape(Rx_data_mut,ifft_length+CS_length+CP_length,[]);
Rx_data_sig = reshape(Rx_data_sig,ifft_length+CS_length+CP_length,[]);
% ====================去循环前缀和后缀======================
Rx_data_sig(1:CP_length,:) = [];
Rx_data_sig(end-CS_length+1:end,:) = [];
Rx_data_mut(1:CP_length,:) = [];
Rx_data_mut(end-CS_length+1:end,:) = [];
% =========================FFT=============================
fft_sig = fft(Rx_data_sig);
fft_mut = fft(Rx_data_mut);
% =========================降采样===========================
data_sig = fft_sig(carrier_position,:);
data_mut = fft_mut(carrier_position,:);
figure
scatter(real(reshape(data_sig,1,[])),imag(reshape(data_sig,1,[])),'.')
grid on;
figure
scatter(real(reshape(data_mut,1,[])),imag(reshape(data_mut,1,[])),'.')
grid on;
% =========================逆映射===========================
bit_demod_sig = reshape(qamdemod(data_sig,16,'OutputType','bit'),[],1);
bit_demod_mut = reshape(qamdemod(data_mut,16,'OutputType','bit'),[],1);
% =========================误码率===========================
error_bit_sig = sum(bit_demod_sig~=bit_sequence);
error_bit_mut = sum(bit_demod_mut~=bit_sequence);
error_rate_sig = error_bit_sig/bit_length;
error_rate_mut = error_bit_mut/bit_length;
rate = [rate; error_rate_sig error_rate_mut]
% ==========================================================
% ==========================================================
function window=rcoswindow(alpha,bit_length)
    warning off;
    window = zeros(1,bit_length/2);
    t = 1:bit_length/2;
    T = bit_length/(2*(1+alpha));
    window(t) = 0.5*(1 - sin(pi/(2*alpha*T)*(t-T)));
    window(1:(1-alpha)*T) = 1;
    window=[fliplr(window) window]';
end

直接运行代码可以得到下面的结果
在这里插入图片描述

自己加个循环就可以得到误码率和信噪比的曲线了
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/136027.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 卷积核(kernels)与滤波器(filters)的关系「建议收藏」

    卷积核(kernels)与滤波器(filters)的关系「建议收藏」简单理解:卷积核:二维的矩阵滤波器:多个卷积核组成的三维矩阵,多出的一维是通道。先介绍一些术语:layers(层)、channels(通道)、featuremaps(特征图),filters(滤波器),kernels(卷积核)。从层次结构的角度来看,层和滤波器的概念处于同一水平,而通道和卷积核在下一级结构中。通道和特征图是同一个事情。一层可以有多个通道(或者说特征图)。如果输入的是一个R…

  • 手把手教你搭建第一个Spring Batch项目

    手把手教你搭建第一个Spring Batch项目写在前面:我是「沸羊羊_」,昵称来自于姓名的缩写fyy,之前呕心沥血经营的博客因手残意外注销,现经营此账号。本人是个小菜,正向着全栈工程师的方向努力着,文章可能并不高产,也很基础,但每写一篇都在用心总结,请大佬勿喷。如果您对编程有兴趣,请关注我的动态,一起学习研究。感谢每位读者!文章目录一、概述二、实例1、新建springboot项目2、springboot项目配置一、概述SpringBatch是一个轻量级,全面的批处理框架。一个典型的批处理过程可能是:从数据库,文件或.

  • Centos安装redis

    Centos安装redis

  • 指针初始化

    指针初始化引用:https://blog.csdn.net/qq_43574794/article/details/84864349https://baike.baidu.com/item/%E6%8C%8

  • c语言:位运算符「建议收藏」

    c语言:位运算符「建议收藏」简介位运算符用来对二进制位进行操作,Java中提供了如下表所示的位运算符:位运算符中,除~以外,其余均为二元运算符。操作数只能为整型和字符型数据。C语言中六种位运算符:&按位与|按位或^按位异或~取反>>右移<<左移运算方法按位与运算按位与运算符”&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。位运算.

  • 解决博客群发问题的实用Seo工具

    解决博客群发问题的实用Seo工具一直以来,博客群发对于中文seo来说都是很多人在追求的方式。现在,英文seo也可以在一定程度上实现博客群发的功能,而仅仅只需要一个博客群发工具——ZoundryRaven。ZoundryRaven博客群发工具是基于国外主流博客程序wordpress以及其他如blogger、windowslivespace等大型社区开发而成,可以在不用多次手动输入账号密码等直接将文章发布到多个免费博客或

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号