✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。
🍎个人主页:海神之光
🏆代码获取方式:
海神之光Matlab王者学习之路—代码获取方式
⛳️座右铭:行百里者,半于九十。
更多Matlab仿真内容点击👇
Matlab图像处理(进阶版)
路径规划(Matlab)
神经网络预测与分类(Matlab)
优化求解(Matlab)
语音处理(Matlab)
信号处理(Matlab)
车间调度(Matlab)
⛄一、最小二乘法LS+最小均方误差MMSE+线性最小均方误差法LMMSE OFDM信道估计
1 最小二乘法LS
最小二乘法(Least Squares, LS)是一种常用的参数估计方法,用于拟合数据点与理论模型之间的差异。最小二乘法的基本思想是通过最小化误差平方和来确定模型参数的最佳估计。具体而言,对于给定的一组数据点,我们假设它们之间存在某种线性或非线性关系。然后,通过调整模型参数,使得模型预测值与实际观测值之间的误差平方和最小化。
在最小二乘法中,我们通常使用线性回归模型来拟合数据。对于线性回归,我们假设数据点之间存在一个线性关系,即 y = mx + b,其中 y 是因变量,x 是自变量,m 和 b 是待估计的参数。通过最小二乘法,我们可以找到最佳的 m 和 b 值,使得拟合直线与数据点之间的误差平方和最小。
除了线性回归,最小二乘法还可以用于拟合其他类型的函数模型,如多项式回归、指数函数拟合等。无论是线性还是非线性模型,最小二乘法都可以提供一个可靠的参数估计方法。
在信道估计中,LS方法可以用于估计信道的参数,如信道增益和相位。
2 最小均方误差MMSE
最小均方误差(Minimum Mean Square Error, MMSE)是一种优化准则,用于在已知观测数据和信道模型的情况下,估计信号的最优解。在信道估计中,MMSE方法可以通过最小化估计误差的均方误差来获得更准确的信道估计结果。
最小均方误差法(Least Mean Square, LMS)是一种常用的自适应滤波算法,用于估计未知系统的参数或者进行信号处理。它的目标是通过最小化均方误差来调整滤波器的权值,使得输出信号与期望信号之间的误差最小化。
LMS算法的基本原理是通过不断调整滤波器的权值,使得滤波器的输出与期望信号之间的均方误差最小。具体来说,LMS算法根据当前输入信号和期望输出信号的差异来更新滤波器的权值,使得误差逐渐减小。这个过程是一个迭代的过程,通过不断迭代更新权值,最终达到最小化均方误差的目标。
LMS算法的更新规则如下:
w(n+1) = w(n) + μ * e(n) * x(n)
其中,w(n)表示第n次迭代时滤波器的权值,μ是步长参数,e(n)表示当前时刻的误差,x(n)表示当前时刻的输入信号。
LMS算法具有简单、易于实现的特点,广泛应用于自适应滤波、信号处理、系统辨识等领域。
3 线性最小均方误差法LMMSE
线性最小均方误差法(Linear Minimum Mean Square Error, LMMSE)是一种基于线性滤波器的信道估计方法。它通过将接收到的信号与滤波器系数进行线性组合,以最小化估计误差的均方误差。LMMSE方法在OFDM(正交频分复用)系统中广泛应用于信道估计,用于提高信号的可靠性和性能。
在OFDM信道估计中,LS、MMSE和LMMSE方法都可以用于估计信道的参数,以便在接收端对接收到的信号进行解调和恢复原始数据。OFDM信道估计原理是通过发送已知的训练序列,在接收端接收到经过信道传输后的序列,并利用最小二乘法、最小均方误差法或线性最小均方误差法等方法,对信道的频率响应进行估计。这样可以得到一个近似的信道模型,从而在接收端进行信号解调和恢复时,对信道引起的失真进行补偿,提高系统的性能和可靠性。
⛄二、部分源代码
%測量不作估計時和采用LS估计算法時的誤碼性能
clear all;
close all;
%定義
pilot_inter=5; %导頻間隔
pilot_symbol_bit=[0 0 0 1]; %导頻符號
carrier_count=128; %子載波數
bits_per_symbol_16QAM=4; %采用該調制时一符號占位數
cp_length=16; %cp長度
SNR_dB=[0 2 4 6 8 10 12 14 16]; %不同的SNR
ls_err_ber=zeros(1,length(SNR_dB));
no_est_error_ber=zeros(1,length(SNR_dB));
for i=1:length(SNR_dB) %每个SNR点上仿真若干次
ls_error_bit=0;
no_est_error_bit=0;
total_bit_num=0;
symbols_per_carrier=50; %%%%%%%%%%%%每个timeslot中每个子载波的ofdm符号数
baseband_out_num=carrier_count*(symbols_per_carrier+pilot_inter)bits_per_symbol_16QAM;
baseband_out=round(rand(1, baseband_out_num));
%二进制数据映射为16进制数
convert_matrix=reshape(baseband_out, bits_per_symbol_16QAMcarrier_count,…
length(baseband_out)/ (bits_per_symbol_16QAMcarrier_count));
%其中length(baseband_out)/(bits_per_symbol_16QAMcarrier_count)就是(symbols_per_carrier+pilot_inter)
total_bit_num=baseband_out_num;
%影射
map_out=map_16_QAM(convert_matrix);
%插入导頻
[insert_pilot_out,pilot_num,pilot_code]=insert_pilot(pilot_inter,pilot_symbol_bit,map_out);
%FFT變換
ofdm_mode_out=ifft(insert_pilot_out,128);
%插入循环前缀
ofdm_cp_out=insert_cp(ofdm_mode_out,cp_length);
[ofdm_cp_out_m,ofdm_cp_out_n]=size(ofdm_cp_out);
%送出
ofdm_modulation=reshape(ofdm_cp_out,1,ofdm_cp_out_mofdm_cp_out_n);
Tx_data=ofdm_modulation;
%静态信道(多径)
multipath_signal=multi_chan(Tx_data,ofdm_cp_out_m,ofdm_cp_out_n);
passchan_ofdm_symbol=reshape(multipath_signal,ofdm_cp_out_m,ofdm_cp_out_n);
%加噪聲
snr=10^(SNR_dB(i)/10);
[nnl1,mml1]=size(passchan_ofdm_symbol);
spow=0;
for k=1:nnl1
for b=1:mml1
spow=spow+real(passchan_ofdm_symbol(k,b))2+imag(passchan_ofdm_symbol(k,b))2;
end
end
spow1=spow/(nnl1mml1);
sgma=sqrt(spow1/(2*snr));%sgma计算方式,与当前SNR和信号平均能量有关系
receive_ofdm_symbol=add_noise(sgma,passchan_ofdm_symbol);
%加入随机高斯白噪声,receive_ofdm_symbol为最终接收机收到的ofdm符号块
%去循環前綴
cut_cp_symbol=del_cp(receive_ofdm_symbol,cp_length);
%FFT
ofdm_demodulation_out=fft(cut_cp_symbol,128);%作128点FFT运算,完成ofdm解调
%估計
ls_zf_detect_sig=ls_estimation(ofdm_demodulation_out,pilot_inter,pilot_code,pilot_num);%采用LS估计算法测得到的接收信号
no_detect_sig=de_p(ofdm_demodulation_out,pilot_inter,pilot_code,pilot_num);%不作估計時测得到的接收信号,直接把导頻删去
%解映射
ls_receive_bit_sig=de_map(ls_zf_detect_sig);%16QAM解映射
no_est_receive_bit_sig=de_map(no_detect_sig);%16QAM解映射
%以下过程统计各种估计算法得到的接收信号中的错误比特数
ls_err_num=error_count(convert_matrix,ls_receive_bit_sig);
no_est_err_num=error_count(convert_matrix,no_est_receive_bit_sig);
ls_error_bit=ls_error_bit+ls_err_num;
no_est_error_bit=no_est_error_bit+no_est_err_num;
%计算各种估计算法的误比特率
ls_err_ber(i)=ls_error_bit/total_bit_num;
no_est_error_ber(i)=no_est_error_bit/total_bit_num;
end
plot(SNR_dB,no_est_error_ber,'b-',SNR_dB,ls_err_ber,‘r-o’)
title(‘多径情况下插入导频,训练符号及不作估计方式比较’)
xlabel(‘SNR’)
ylabel(‘BER’)
grid on
hold on
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Ofdm系統仿真程序 訓練序列 有估計 16qam 有多徑
%定義
%pilot_inter=5;
%pilot_symbol_bit=[0 0 0 1];
carrier_count=128;
bits_per_symbol_16QAM=4;
cp_length=16;
SNR_dB=[0 2 4 6 8 10 12 14 16];
training_err_ber=zeros(1,length(SNR_dB));
for i=1:length(SNR_dB) %每个SNR点上仿真若干次
training_err_bit=0;
total_bit_num=0;
symbols_per_carrier=50;
baseband_out_num=carrier_count(symbols_per_carrier)bits_per_symbol_16QAM;
baseband_out=round(rand(1, baseband_out_num));
%二进制数据映射为16进制数
convert_matrix=reshape(baseband_out, bits_per_symbol_16QAMcarrier_count,length(baseband_out)/ (bits_per_symbol_16QAMcarrier_count));
total_bit_num=baseband_out_num;
%影射
map_out=map_16_QAM(convert_matrix);
%不插入导頻
%[insert_pilot_out,pilot_num,pilot_code]=insert_pilot(pilot_inter,pilot_symbol_bit,map_out);
%插入訓練序列
training_symbols=[1+j;1-j;-1+j;-1-j;3+j;1+3j;3-j;1-3j;-1+3j;-3+j;-3-j;-1-3j;3+3j;-3+3j;-3-3j;3-3j];
training_symbols=[training_symbols;training_symbols];
training_symbols=[training_symbols;training_symbols];
training_symbols=[training_symbols;training_symbols];
training_symbols=[training_symbols,training_symbols];
training_symbols=[training_symbols,training_symbols]; %造出一個1284的訓練符號矩陣
insert_training_out=[training_symbols,map_out]; %合井到要傳的數据上
train_length=size(training_symbols,2);
total_length=size(insert_training_out,2);
%FFT變換
ofdm_mode_out=ifft(insert_training_out,128);
%插入循环前缀
ofdm_cp_out=insert_cp(ofdm_mode_out,cp_length);
[ofdm_cp_out_m,ofdm_cp_out_n]=size(ofdm_cp_out);
%送出
ofdm_modulation=reshape(ofdm_cp_out,1,ofdm_cp_out_mofdm_cp_out_n);
Tx_data=ofdm_modulation;
%静态信道(多径)
multipath_signal=multi_chan(Tx_data,ofdm_cp_out_m,ofdm_cp_out_n);
passchan_ofdm_symbol=reshape(multipath_signal,ofdm_cp_out_m,ofdm_cp_out_n);
%加噪聲
snr=10^(SNR_dB(i)/10);
[nnl1,mml1]=size(passchan_ofdm_symbol);
spow=0;
for k=1:nnl1
for b=1:mml1
spow=spow+real(passchan_ofdm_symbol(k,b))2+imag(passchan_ofdm_symbol(k,b))2;
end
end
spow1=spow/(nnl1mml1);
sgma=sqrt(spow1/(2*snr));%sgma计算方式,与当前SNR和信号平均能量有关系
receive_ofdm_symbol=add_noise(sgma,passchan_ofdm_symbol);%加入随机高斯白噪声,receive_ofdm_symbol为最终接收机收到的ofdm符号块
%去循環前綴
cut_cp_symbol=del_cp(receive_ofdm_symbol,cp_length);
%FFT
ofdm_demodulation_out=fft(cut_cp_symbol,128);%作128点FFT运算,完成ofdm解调
Rx_carriers = ofdm_demodulation_out(:,(train_length+1):total_length );
Rx_training_symbols = ofdm_demodulation_out(:,(1: train_length) );
Rx_training_symbols1=Rx_training_symbols;
%信道估计
Rx_training_symbols = Rx_training_symbols./ training_symbols;
Rx_training_symbols_deno = Rx_training_symbols.^2;
Rx_training_symbols_deno = Rx_training_symbols_deno(:,1)+Rx_training_symbols_deno(:,2)+Rx_training_symbols_deno(:,3)+Rx_training_symbols_deno(:,4) ;
Rx_training_symbols_nume = Rx_training_symbols(:,1) +Rx_training_symbols(:,2) + Rx_training_symbols(:,3) +Rx_training_symbols(:,4) ;
Rx_training_symbols_nume = conj(Rx_training_symbols_nume) ;
% 取4个向量的导频符号是为了进行平均优化
% 都是针对 “行向量”即单个的OFDM符号 进行操作
% 原理:寻求1/H,对FFT之后的数据进行频域补偿
% 1/H = conj(H)/H^2 because H^2 = H * conj(H)
Rx_training_symbols = Rx_training_symbols_nume./Rx_training_symbols_deno;
Rx_training_symbols_2 =[Rx_training_symbols,Rx_training_symbols];
Rx_training_symbols_4 =[Rx_training_symbols_2,Rx_training_symbols_2];
Rx_training_symbols_8 =[Rx_training_symbols_4,Rx_training_symbols_4];
Rx_training_symbols_16 =[Rx_training_symbols_8,Rx_training_symbols_8];
Rx_training_symbols_32 =[Rx_training_symbols_16,Rx_training_symbols_16];
Rx_training_symbols_48 =[Rx_training_symbols_32,Rx_training_symbols_16];
Rx_training_symbols_50 =[Rx_training_symbols_48,Rx_training_symbols_2];
Rx_carriers = Rx_training_symbols_50.*Rx_carriers;
%解映射
receive_bit_sig=de_map(Rx_carriers);
%以下过程统计各种估计算法得到的接收信号中的错误比特数
err_num=error_count(convert_matrix,receive_bit_sig);
trainning_error_bit=training_err_bit+err_num;
%计算各种估计算法的误比特率
trainning_err_ber(i)=trainning_error_bit/total_bit_num;
end
plot(SNR_dB,trainning_err_ber,‘g-+’)
legend(‘不作估计’,‘插入导频(ls准测)估计’,‘利用训练符号的估计’)
grid on
hold on
⛄三、运行结果
⛄四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1]尹向兵,吴良超.基于周期果蝇算法的无线传感网覆盖优化[J].赤峰学院学报(自然科学版). 2017,33(16)
[2]王欣阳,王瑞阳,魏云冰.基于算术优化算法的低压配电网故障区段定位方法[J].电子科技.
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除
🍅 仿真咨询
1 各类智能优化算法改进及应用
生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化
2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断
3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知
4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化
5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配
6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化
7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化
8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置
9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长
10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合