用matlab viterbi算法怎么求传输

用matlab viterbi算法怎么求传输,第1张

[mlse_Eq.zip] - 含有已知信道下BPSK,QPSK,8PSK,16QAM的mlse均衡,MMSE(频域)均衡SER,BER性能的对比。

[wanzhengchengxu.rar] - 信号在信道进行传输时,经常会出现串扰,采用基于最大似然序列估计(mlse)的电子色散均衡器的方法,克服光纤通信中的由各种色散引起的码间干扰。 研究基于最大似然序列估计(MLSE)的均衡器,采用维特比算法实现,用matlab仿真出采用MLSE后的性能指标(眼图和误码率)的提升。

[TCMchengxu.rar] - matlab实现8PSK TCM网格编码调制,包含维特比译码和与未编码的QPSK误码性能比较

[OFDM_code.rar] - 本代码是关于OFDM通信系统的仿真源程序,其中信道编码,QPSK调制,QPSK解调,FFT,IFFT,viterbi编译码,误比特统计,滤波等模块。

clear all

clc

N_ofdm=2048 %OFDM的点数为2048

f_delta=15e3 %子载波间隔为15k,此参数在代码中实际上没有使用

N_block=1000 %最大仿真量

N_subcarrier=1320 %可用子载波数

N_CP=144 %CP长度

Symbol_number=14 %每次传输的OFDM符号个数

conv_poly=[23,35] %卷积码生成多项式

K=5 %卷积码约束长度

trel=poly2trellis(K,conv_poly) %产生卷积码格图

tail=zeros(1,K-1) %为了是卷积码编码器回零而添加的尾比特

mod_degree=4 %16QAM调制

code_rate=0.5 %码率

tb_len=50 %Viterbi译码器回溯长度

bit_length=mod_degree*code_rate*N_subcarrier*Symbol_number-K+1%根据以上参数配置可以得到在一个数据块中所能承载的信息比特总数

SNR_db=0:1:10 %设置仿真的信噪比范围

SNR=10.^(SNR_db/10) %将信噪比转换为自然数值

ber=zeros(1,length(SNR)) %初始化误码率存储空间

bler=zeros(1,length(SNR)) %初始化误码率存储空间

h1=modem.qammod('M',2^mod_degree,'InputType','bit','SymoblOrder','gray') %产生QAM调制对象,输入类型为比特输入,符号顺序为格雷映射

h2=modem.qamdemod(h1,'OutputType','bit','DecisionType','approximatellr',...'NoiseVariance',1) %产生QAM解调对象,选择软判决解调形式。由于此时噪声方差位置,暂设为1

for loop_snr=1:length(SNR)

err=0

err_blk=0

sigma=sqrt(1/SNR(loop_snr)/2)

for loop_block=1:N_block%此处省略的代码为每个数据帧的处理过程,将在下面详细介绍

end

ber(loop_snr)=err/(bit_length*loop_block)

bler(loop_snr)=err_blk/loop_block

end

for loop_block=1:N_block

source=randsrc(1,bit_length,[0,1]) %产生信源

code=convenc([source,tail],trel) %卷积编码,状态归零

symbol=modulate(h1,code') %用调制对象h1调制code序列

symbol=symbol/3.1622 %子载波符号能量归一化

transmit_data=zeros(1,Symbol_number*(N_CP+N_ofdm)) %发送时域样本初始化

for loop_symbol=1:Symbol_number%OFDM符号循环,每次循环产生一个OFDM符号的所有时域样本

freq_domain=zeros(1,N_ofdm) %频域数据初始化

freq_domain((N_ofdm-N_subcarrier)/2+1:(N_ofdm-Nsubcarrier)/2+N_subcarrier)=symbol((loop_symbol-1)*N_subcarrier+1:loop_symbol*N_subcarrier) %子载波映射,映射在中间的N_subcarrier个子载波上

time_domain=ifft(freq_domain)*sqrt(N_ofdm) %IFFT是实现OFDM调制,注意能量归一化

transmit_data((loop_symbol-1)*(N_CP+N_ofdm)+1:loop_symbol*(N_CP+N_ofdm))=[time_domain(N_ofdm-N_CP+1:N_ofdm),time_domain] %加CP

end

received_data=transmit_data+(randn(1,length(transmit-data))+j*randn(1,length(transmit_data)))*sigma %加噪声,得到接受信号

for loop_symbol=1:Symbol_number

de_CP=received_data((loop_symbol-1)*(N_CP+N_ofdm)+N_CP+1:loop_symbol*(N_CP+N_ofdm)) %去掉CP

fft_data=fft(de_CP)/sqrt(N_ofdm) %FFT,能量归一化

demapp_data((loop_symbol-1)*N_subcarrier+1:loop_symbol*N_subcarrier)=fft_data((N_ofdm-N_subcarrier)/2+1:(N_ofdm-N_subcarrier)/2+N_subcarrier) %解映射

end

h2.NoiseVariance=sigma*sigma*3.1622*3.1622 %重新设置解调对象的噪声方差参数

data_demodulated=demdulate(h2,demapp_data*3.1622) %软解调,注意在解调前需要根据解调对象的要求将信号重新变回到原来的星座上

temp1=size(data_demodulated)

data_demodulated=reshape(data_demudulated,1,templ(1)*templ(2)) %将软解调输入的矩阵整理成一个行向量

decision=vitdex(data_demodulated,trel,tb_len,'term','unquant') %去穷量化维特比译码

decision=decision(1:length(source)) %去尾比特

err=err+sum(decision~=source) %统计误码数

if(sum(decision~=source)~=0)%统计误码块数

err_blk+err_blk+1

end

if(err_blk>=10)%错10个块停止该信噪比下的仿真

break

end

end

semilogy(SNR_dB,ber,'-^')

grid on

xlabel('SNR(dB)')

ylable('BER')

%一个是硬判决,一个是软判决的函数,各自存了,然后再调用,注意是两个函数,别弄混了 function decoder_output=viterbi_hard(y,L) global Gn=size(G,1)K=size(G,2)number_of_states=2^(K-1)%------------------------------------------------ %-------------生成各分支的输出-------------------- %------------------------------------------------ for j=0:number_of_states-1 for t=0:1 [next_state,memory_contents]=next_state_fun(j,t,K)input(j+1,next_state+1)=tbranch_output=rem(memory_contents*G',2)nextstate(j+1,t+1)=next_stateoutput(j+1,t+1)=bin2deci(branch_output)end end %------------------------------------------------ metric_of_states=zeros(1,number_of_states)%各状态的度量metric metric_of_states_c=zeros(number_of_states,2)%各状态两个输入的度量 length_seq=length(y)/n%符号个数 decoder_output=zeros(1,length_seq-K+1)%解码输出 channel_output_matrix=reshape(y,n,length_seq)%将解调输出的比特按符号排列 survivor_state=zeros(number_of_states,length_seq+1)%留存路径 input_of_state=zeros(number_of_states,length_seq+1,2)%汇聚到各状态的分支对应的输入 state_sequence=zeros(1,length_seq+1)count=zeros(1,number_of_states)for i=1:length_seq-K+1 %------------------------------------------------ for j=0:number_of_states-1 for t=0:1 binary_output=deci2bin(output(j+1,t+1),n)%将各分支的输出转换为2进制 branch_metric=Hamming_dis(channel_output_matrix(:,i)',binary_output)%计算分支度量 count(nextstate(j+1,t+1)+1)=count(nextstate(j+1,t+1)+1)+1metric_of_states_c(nextstate(j+1,t+1)+1,count(nextstate(j+1,t+1)+1))=metric_of_states(j+1)+branch_metric%计算累积度量(加) input_of_state(nextstate(j+1,t+1)+1,:,count(nextstate(j+1,t+1)+1))=survivor_state(j+1,:)%该分支所在路径的对应的输入 input_of_state(nextstate(j+1,t+1)+1,i,count(nextstate(j+1,t+1)+1))=tendend%----------------比较汇聚到同一状态的两条路径,选取距离较小的----------------- for j=0:number_of_states-1 if metric_of_states_c(j+1,1)>=metric_of_states_c(j+1,2) metric_of_states(j+1)=metric_of_states_c(j+1,2)survivor_state(j+1,:)=input_of_state(j+1,:,2)else metric_of_states(j+1)=metric_of_states_c(j+1,1)survivor_state(j+1,:)=input_of_state(j+1,:,1)endendcount=zeros(1,number_of_states)%--------------------------截短输出------------------------------------ if i>L [min_metric,location]=min(metric_of_states)decoder_output(i-L)=survivor_state(location,i-L)endend %---------------------最后L个比特译码输出-------------------------------- [min_metric,location]=min(metric_of_states)decoder_output(length_seq-K+1-L+1:length_seq-K+1)=survivor_state(location,length_seq-K+1-L+1:length_seq-K+1)========================华丽的分割线================================= %以上为硬判决,一下为软判决 function decoder_output=viterbi_soft(y,L) global Gn=size(G,1)K=size(G,2)number_of_states=2^(K-1)for j=0:number_of_states-1 for t=0:1 [next_state,memory_contents]=next_state_fun(j,t,K)input(j+1,next_state+1)=tbranch_output=rem(memory_contents*G',2)nextstate(j+1,t+1)=next_stateoutput(j+1,t+1)=bin2deci(branch_output)end end metric_of_states=zeros(1,number_of_states)metric_of_states_c=zeros(number_of_states,2)length_seq=length(y)/ndecoder_output=zeros(1,length_seq-K+1)channel_output_matrix=reshape(y,n,length_seq)survivor_state=zeros(number_of_states,length_seq+1)input_of_state=zeros(number_of_states,length_seq+1,2)state_sequence=zeros(1,length_seq+1)count=zeros(1,number_of_states)for i=1:length_seq-K+1 flag=zeros(1,number_of_states)for j=0:number_of_states-1 for t=0:1 binary_output=deci2bin(output(j+1,t+1),n)branch_metric=cor_dis(channel_output_matrix(:,i)',binary_output)count(nextstate(j+1,t+1)+1)=count(nextstate(j+1,t+1)+1)+1metric_of_states_c(nextstate(j+1,t+1)+1,count(nextstate(j+1,t+1)+1))=metric_of_states(j+1)+branch_metricinput_of_state(nextstate(j+1,t+1)+1,:,count(nextstate(j+1,t+1)+1))=survivor_state(j+1,:)input_of_state(nextstate(j+1,t+1)+1,i,count(nextstate(j+1,t+1)+1))=tendendfor j=0:number_of_states-1 if metric_of_states_c(j+1,1)<=metric_of_states_c(j+1,2) metric_of_states(j+1)=metric_of_states_c(j+1,2)survivor_state(j+1,:)=input_of_state(j+1,:,2)else metric_of_states(j+1)=metric_of_states_c(j+1,1)survivor_state(j+1,:)=input_of_state(j+1,:,1)endendcount=zeros(1,number_of_states)if i>L [max_metric,location]=max(metric_of_states)decoder_output(i-L)=survivor_state(location,i-L)endend [max_metric,location]=max(metric_of_states)decoder_output(length_seq-K+1-L+1:length_seq-K+1)=survivor_state(location,length_seq-K+1-L+1:length_seq-K+1)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12058484.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存