无线通信与编码_Rake接收机_三种合并算法_含MATLAB仿真代码

Rake接收机

RAKE接收机是一种用于无线通信系统的接收机。它的名字来源于“并行相关键接收机”(Parallel Receiving and Correlating Key Receiver)的缩写。RAKE接收机的主要作用是通过多个接收天线和并行处理器来改善信号接收效率。

RAKE接收机通常用于高速数据传输系统,如手机通信系统和无线局域网(WLAN)。它可以帮助消除多径散射对信号的干扰,提高信号检测的准确性。

RAKE接收机的工作原理是,每个接收天线都会收到信号的不同版本,这些版本可能因为多径散射或其他原因而有所差异。RAKE接收机通过并行处理器对这些信号版本进行相关,然后将它们合并在一起,从而获得一个更准确的信号。


使用选择性合并、最大比值合并、等增益合并算法进行Rake接收机的仿真

选择性合并(Selective Combining)是RAKE接收机中最常用的合并算法。在选择性合并中,RAKE接收机会根据信号的信噪比(SNR)来选择最优的信号版本进行合并。

在最大比值合并(Maximum Ratio Combining)中,RAKE接收机会根据信号的功率比来选择最优的信号版本进行合并。

在等增益合并(Equal Gain Combining)中,RAKE接收机将所有信号版本的功率平均分配,然后将它们合并在一起。

这三种合并算法各有优劣,适用于不同的应用场景。在实际应用中,RAKE接收机可能会根据具体情况使用多种合并算法来获得最优的信号检测效果。

clc,clear;		%使用选择性合并、最大比值合并、等增益合并算法进行Rake接收机的仿真
user = 1;       %用户数
Nc = 16;        %扩频因子
ISI_Length = 1; %码元长度
SNR = [0:1:10]; %信噪比(dB)
Tlen = 5000;    %数据长度
Bit_Error_Number1 = 0; %误比特率初始值
Bit_Error_Number2 = 0;
Bit_Error_Number3 = 0;
power_unitary_factor1 = sqrt( 5/9 );%每径功率因子
power_unitary_factor2 = sqrt( 3/9 );
power_unitary_factor3 = sqrt( 1/9 );
s_initial = randsrc( 1, Tlen );     %数据源
%生成 WALSH 矩阵
wal2 = [1 1;1 -1];
wal4 = [wal2 wal2; wal2 wal2*(-1)];
wal8 = [wal4 wal4; wal4 wal4*(-1)];
wal16 = [wal8 wal8; wal8 wal8*(-1)];
%扩频
s_spread = zeros( user, Tlen * Nc );
ray1 = zeros( user, 2*Tlen*Nc );
ray2 = zeros( user, 2*Tlen*Nc );
ray3 = zeros( user, 2*Tlen*Nc );
for i = 1:user
    x0 = s_initial( i,: ).'*wal16( 8,: );
    x1 = x0.';
    s_spread( i,: ) = ( x1(:) ).';
end
%输出重复一次,然后延迟(延迟了半个码元)
ray1( 1:2:2*Tlen*Nc - 1 ) = s_spread( 1:Tlen*Nc );
ray1( 2:2:2*Tlen*Nc ) = ray1( 1:2:2*Tlen*Nc - 1 );
 
%产生第二径,第三径信号
ray2( ISI_Length + 1:2*Tlen*Nc ) = ray1( 1:2*Tlen*Nc - ISI_Length );
ray3( 2*ISI_Length + 1:2*Tlen*Nc ) = ray1( 1:2*Tlen*Nc - 2*ISI_Length );
for nEN = 1:length( SNR )%EbN0dB
    EbNo = 10^( SNR(nEN)/10 );     %信噪比转换
    pn = sqrt( 32/(2*EbNo) );
    %接收信号
    demp = power_unitary_factor1*ray1+...
           power_unitary_factor2*ray2+...
           power_unitary_factor3*ray3+...
           ( randn( 1,2*Tlen*Nc )+randn( 1,2*Tlen*Nc )*i )*pn;
    dt = reshape( demp,32,Tlen )';
    %WALSH码重复
    wal16_d(1:2:31) = wal16(8,1:16);
    wal16_d(2:2:32) = wal16(8,1:16);
    %解扩第一径输出
    rdata1 = dt*wal16_d(1,:).';
    %WALSH码延迟
    wal16_delay1(1,2:32) = wal16_d(1,1:31);
    %解扩第二径输出
    rdata2 = dt*wal16_delay1(1,:).';
    %WALSH码延迟
    wal16_delay2(1,3:32) = wal16_d(1,1:30);
    wal16_delay2(1,1:2) = wal16_d(1,31:32);
    %解扩第三径输出
    rdata3 = dt*wal16_delay2(1,:).';
    
    p1 = rdata1'*rdata1;
    p2 = rdata2'*rdata2;
    p3 = rdata3'*rdata3;
    p = p1 + p2 + p3;
    u1 = p1/p;
    u2 = p2/p;
    u3 = p3/p;
    %最大比合并
    rd_m1 = real( rdata1*u1+rdata2*u2+rdata3*u3);
    %等增益合并
    rd_m2 = (real(rdata1+rdata2+rdata3))/3;
    %选择式合并
    u = [u1,u2,u3];
    maxu = max(u);
    if(maxu==u1)
        rd_m3 = real(rdata1);
    else
        if(maxu==u2)
            rd_m3 = real(rdata2);
        else
            rd_m3 = real(rdata3);
        end
    end
    %三种方法判决输出
    r_Data1 = sign(rd_m1)';
    r_Data2 = sign(rd_m2)';
    r_Data3 = sign(rd_m3)';
    %计算误比特率
    Bit_Error_Number1 = length(find(r_Data1(1:Tlen) ~= s_initial(1:Tlen)));
    Bit_Error_Rate1(nEN) = Bit_Error_Number1/Tlen;
    Bit_Error_Number2 = length(find(r_Data2(1:Tlen) ~= s_initial(1:Tlen)));
    Bit_Error_Rate2(nEN) = Bit_Error_Number2/Tlen;
    Bit_Error_Number3 = length(find(r_Data3(1:Tlen) ~= s_initial(1:Tlen)));
    Bit_Error_Rate3(nEN) = Bit_Error_Number3/Tlen;
end
figure(1)%绘制图像
plot(SNR,Bit_Error_Rate1,'r*-');hold on;grid on;
plot(SNR,Bit_Error_Rate2,'bo-');hold on;grid on;
plot(SNR,Bit_Error_Rate3,'g.-');grid on;
legend('最大比合并','选择式合并','等增益合并');
xlabel('信噪比'),ylabel('误比特率');
title('三种分集合并方式性能比较');
figure(2)
semilogy(SNR,Bit_Error_Rate1,'b*-');hold on;grid on;
semilogy(SNR,Bit_Error_Rate2,'go-');hold on;grid on;
semilogy(SNR,Bit_Error_Rate3,'k+-');grid on;
legend('最大比合并','选择式合并','等增益合并');
xlabel('信噪比'),ylabel('误比特率');
title('三种分集合并方式性能比较');
%采用最大比合并时误码率最低
%Rake接收机可以较好的解决多径问题
%白噪声对Rake接收机误码率影响不大,随着信噪比的增大,Rake接收机的误码率迅速下降
clear all;%接收部分code
user = 1;
Nc = 16;    %扩频因子
ISI_Length = 1;%码元长度
SNR = [0:1:30];%信噪比
Tlen = 8000;    %数据长度
 
 %误比特率初始值
Bit_Error_Number1 = 0; 
Bit_Error_Number2 = 0;
Bit_Error_Number3 = 0;
 
%功率因子
power_unitary_factor1 = sqrt( 6/9 );    
power_unitary_factor2 = sqrt( 2/9 );
power_unitary_factor3 = sqrt( 1/9 );
 
s_initial = randsrc( 1, Tlen );     %数据源
 
%WALSH矩阵
wal2 = [ 1 1; 1 -1 ];
wal4 = [wal2 wal2; wal2 wal2*(-1)];
wal8 = [wal4 wal4; wal4 wal4*(-1)];
wal16 = [wal8 wal8; wal8 wal8*(-1)];
 
%扩频
s_spread = zeros( user, Tlen*Nc );
ray1 = zeros( user, 2*Tlen*Nc );
ray2 = zeros( user, 2*Tlen*Nc );
ray3 = zeros( user, 2*Tlen*Nc );
for i = 1:user
    x0 = s_initial( i,: ).'*wal16( 8,: );
    x1 = x0.';
    s_spread( i,: ) = ( x1(:) ).';
end
%输出重复一次,然后延迟
ray1( 1:2:2*Tlen*Nc - 1 ) = s_spread( 1:Tlen*Nc );
ray1( 2:2:2*Tlen*Nc ) = ray1( 1:2:2*Tlen*Nc - 1 );
 
%第二径,第三径信号
ray2( ISI_Length + 1:2*Tlen*Nc ) = ray1( 1:2*Tlen*Nc - ISI_Length );
ray3( 2*ISI_Length + 1:2*Tlen*Nc ) = ray1( 1:2*Tlen*Nc - 2*ISI_Length );
 
for nEN = 1:length( SNR )
    EbNo = 10^( SNR(nEN)/10 );     %信噪比转换
    pn = sqrt( 32/(2*EbNo) );
    %接收信号
    demp = power_unitary_factor1*ray1+...
           power_unitary_factor2*ray2+...
           power_unitary_factor3*ray3+...
           ( randn( 1,2*Tlen*Nc )+randn( 1,2*Tlen*Nc )*i )*pn;
    dt = reshape( demp,32,Tlen )';
    %WALSH码重复
    wal16_d(1:2:31) = wal16(8,1:16);
    wal16_d(2:2:32) = wal16(8,1:16);
    %解扩第一径输出
    rdata1 = dt*wal16_d(1,:).';
    %WALSH码延迟
    wal16_delay1(1,2:32) = wal16_d(1,1:31);
    %解扩第二径输出
    rdata2 = dt*wal16_delay1(1,:).';
    %WALSH码延迟
    wal16_delay2(1,3:32) = wal16_d(1,1:30);
    wal16_delay2(1,1:2) = wal16_d(1,31:32);
    %解扩第三径输出
    rdata3 = dt*wal16_delay2(1,:).';
    
    p1 = rdata1'*rdata1;
    p2 = rdata2'*rdata2;
    p3 = rdata3'*rdata3;
    p = p1 + p2 + p3;
    u1 = p1/p;
    u2 = p2/p;
    u3 = p3/p;
    
    %最大比合并
    rd_m1 = real( rdata1*u1+rdata2*u2+rdata3*u3);
    %等增益合并
    rd_m2 = (real(rdata1+rdata2+rdata3))/3;
    %选择式合并
    u = [u1,u2,u3];
    maxu = max(u);
    if(maxu==u1)
        rd_m3 = real(rdata1);
    else
        if(maxu==u2)
            rd_m3 = real(rdata2);
        else rd_m3 = real(rdata3);
        end
    end
    %三种方法判决输出
    r_Data1 = sign(rd_m1)';
    r_Data2 = sign(rd_m2)';
    r_Data3 = sign(rd_m3)';
    %计算误比特率
    Bit_Error_Number1 = length(find(r_Data1(1:Tlen) ~= s_initial(1:Tlen)));
    Bit_Error_Rate1(nEN) = Bit_Error_Number1/Tlen;
    Bit_Error_Number2 = length(find(r_Data2(1:Tlen) ~= s_initial(1:Tlen)));
    Bit_Error_Rate2(nEN) = Bit_Error_Number2/Tlen;
    Bit_Error_Number3 = length(find(r_Data3(1:Tlen) ~= s_initial(1:Tlen)));
    Bit_Error_Rate3(nEN) = Bit_Error_Number3/Tlen;
end
plot(SNR,Bit_Error_Rate1,'r*-');hold on;
plot(SNR,Bit_Error_Rate2,'bo-');hold on;
plot(SNR,Bit_Error_Rate3,'g.-');
legend('最大比合并','选择式合并','等增益合并');
xlabel('信噪比');
ylabel('误比特率');
title('三种分集合并方式性能比较');

clear all;%发送部分代码
Numusers = 1;
Nc = 16;    %扩频因子
ISI_Length = 1;  %码元长度
EbN0db = 2;      %信噪比
Tlen = 10;       %数据长度
 
%我们假设出的每径功率因子
power_unitary_factor1 = sqrt( 6/9 );
power_unitary_factor2 = sqrt( 2/9 );
power_unitary_factor3 = sqrt( 1/9 );
s_initial = randsrc( 1, Tlen );     %产生数据源1-1
figure(1)
stairs(s_initial,'Color','r');
ylim([-1.5,1.5]);
title('信号源序列','Color','b')
xlabel('数据长度')
ylabel('幅度')
%根据扩频因子等于16产生walsh矩阵
wal2 = [ 1 1; 1 -1 ];
wal4 = [wal2 wal2; wal2 wal2*(-1)];
wal8 = [wal4 wal4; wal4 wal4*(-1)];
wal16 = [wal8 wal8; wal8 wal8*(-1)];
%扩频
s_spread = zeros( Numusers, Tlen*Nc );
ray1 = zeros( Numusers, 2*Tlen*Nc );
ray2 = zeros( Numusers, 2*Tlen*Nc );
ray3 = zeros( Numusers, 2*Tlen*Nc );

for i = 1:Numusers
    x0 = s_initial( i,: ).'*wal16( 8,: );
    x1 = x0.';
    s_spread( i,: ) = ( x1(:) ).';
end
%将扩频后的输出重复,然后进行延迟
ray1( 1:2:2*Tlen*Nc - 1 ) = s_spread( 1:Tlen*Nc );
ray1( 2:2:2*Tlen*Nc ) = ray1( 1:2:2*Tlen*Nc - 1 );
 
%产生第二,第三径信号
ray2( ISI_Length + 1:2*Tlen*Nc ) = ray1( 1:2*Tlen*Nc - ISI_Length );
ray2( 2*ISI_Length + 1:2*Tlen*Nc ) = ray1( 1:2*Tlen*Nc - 2*ISI_Length );
 
for nEN = 1:length( EbN0db )
    en = 10^( EbN0db(nEN)/10 );     %信噪比转换
    sigma = sqrt( 32/(2*en) );
    %收到信号
    demp = power_unitary_factor1*ray1+...
           power_unitary_factor2*ray2+...
           power_unitary_factor3*ray3+...
           ( rand( 1,2*Tlen*Nc )+randn( 1,2*Tlen*Nc )*i )*sigma;
    dt = reshape( demp,32,Tlen )';
    %将walsh码重复
    wal16_d(1:2:31) = wal16(8,1:16);
    wal16_d(2:2:32) = wal16(8,1:16);
    %解扩后第一径输出
    rdata1 = dt*wal16_d(1,:).';
    %将walsh码延迟
    wal16_delay1(1,2:32) = wal16_d(1,1:31);
    %解扩后第二径输出
    rdata2 = dt*wal16_delay1(1,:).';
    %将walsh码延迟
    wal16_delay2(1,3:32) = wal16_d(1,1:30);
    wal16_delay2(1,1:2) = wal16_d(1,31:32);
    %解扩后第三径输出
    rdata3 = dt*wal16_delay2(1,:).';
    
    p1 = rdata1'*rdata1;
    p2 = rdata2'*rdata2;
    p3 = rdata3'*rdata3;
    p = p1 + p2 + p3;
    u1 = p1/p;
    u2 = p2/p;
    u3 = p3/p;
    
    %最大比合并
    rd_m1 = real( rdata1*u1+rdata2*u2+rdata3*u3);
    %等增益合并
    rd_m2 = (real(rdata1+rdata2+rdata3))/3;
    %选择式合并
    u = [u1,u2,u3];
    maxu = max(u);
    if(maxu==u1)
        rd_m3 = real(rdata1);
    else
        if(maxu==u2)
            rd_m3 = real(rdata2);
        else rd_m3 = real(rdata3);
        end
    end
 
    %输出数据
    r_Data1 = sign(rd_m1)';
    r_Data2 = sign(rd_m2)';
    r_Data3 = sign(rd_m3)';
    
end
figure(2)
subplot(3,1,1)
stairs(r_Data1,'Color','r');
ylim([-1.5,1.5]);
title('最大比合并方式','Color','b')
xlabel('码元长度')
ylabel('幅度')
subplot(3,1,2)
stairs(r_Data2,'Color','r');
ylim([-1.5,1.5]);
title('等增益合并','Color','b')
xlabel('码元长度')
ylabel('幅度')
subplot(3,1,3)
stairs(r_Data3,'Color','r');
ylim([-1.5,1.5]);
title('选择式合并','Color','b')
xlabel('码元长度')
ylabel('幅度')
figure(3)
subplot(3,1,1)
stairs(s_initial,'Color','r');
ylim([-1.5,1.5]);
hold on
stairs(r_Data3,'Color','g');
ylim([-1.5,1.5]);
title('最大比值合并和初始序列比较','Color','b')
xlabel('码元长度')
ylabel('幅度')
ylim([-1.5,1.5]);
subplot(3,1,2)
stairs(s_initial,'Color','r');
ylim([-1.5,1.5]);
hold on
stairs(r_Data2,'Color','g');
ylim([-1.5,1.5]);
title('等增益合并和初始序列比较','Color','b')
xlabel('码元长度')
ylabel('幅度')
ylim([-1.5,1.5]);
subplot(3,1,3)
stairs(s_initial,'Color','r');
ylim([-1.5,1.5]);
hold on
stairs(r_Data1,'Color','g');
ylim([-1.5,1.5]);
title('选择式合并和初始序列比较','Color','b')
xlabel('码元长度')
ylabel('幅度')
ylim([-1.5,1.5]);

Walsh码是一种二进制线性码,它可以用来编码信息序列。Walsh码的名字来源于美国数学家J. L. Walsh,他在1923年提出了这种码制。

Walsh码有许多不同的变体,其中最常用的是Hadamard码。Hadamard码是Walsh码的一种特殊形式,它的码字长度为2的整数次幂。Hadamard码具有良好的正交性,因此在信道均衡、多径抵消和调制解调等应用中广泛使用。

Walsh码在通信领域中有许多应用。例如,它可以用来进行频谱分配,以便在无线电频谱中有效地传输信息。Walsh码也可以用来进行信号加扰,以增强信息的安全性。此外,Walsh码还可以用来进行无线局域网(WLAN)的调制解调,以及CDMA手机通信系统的多址传输。

  • 9
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Rake接收机是一种经典的多径信道均衡技术,使用多个接收分支接收到来的多个信号,并将它们进行加权合并,以提高接收信号的质量。下面是基于MATLAB实现Rake接收机多径分量的合并方式的代码示例: ```matlab % 定义多径信道的冲激响应 h = [0.2 0.4 0.6 0.8 1 0.8 0.6 0.4 0.2]; % 定义接收到的信号序列 rx_signal = [0 0 0 0 2 4 6 8 10]; % 定义Rake接收机的接收分支数量 num_branches = 3; % 对接收到的信号进行Rake接收机处理 for i = 1:num_branches % 计算当前接收分支的时延 delay = (i-1)*2; % 对接收分支的时延进行处理,保证不越界 if delay >= length(h) continue; end % 根据时延对信道冲激响应进行截取 channel_impulse = h(1+delay:end); % 对信道冲激响应进行加权,得到该分支的接收信号 branch_signal = channel_impulse(1:min(length(channel_impulse), length(rx_signal))) .* rx_signal(1:min(length(channel_impulse), length(rx_signal))); % 将接收信号加入到当前接收分支的输出序列中 if i == 1 output_signal = branch_signal; else output_signal = output_signal + branch_signal; end end % 输出Rake接收机的输出信号 disp(output_signal); ``` 上述代码中,首先定义了多径信道的冲激响应 h 和接收到的信号序列 rx_signal。然后,定义了Rake接收机的接收分支数量 num_branches。接下来,使用 for 循环对每个接收分支进行处理。对于每个接收分支,先计算出其时延 delay,然后根据时延对信道冲激响应进行截取,得到该分支的信道冲激响应 channel_impulse。接着,对信道冲激响应进行加权,得到该分支的接收信号 branch_signal。最后,将接收信号加入到当前接收分支的输出序列中。最终,将所有接收分支的输出信号相加,得到Rake接收机的输出信号 output_signal。 需要注意的是,Rake接收机的实现方式有很多种,上述代码只是其中一种实现方式。实际应用中,需要根据具体情况进行选择和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmallC1oud

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值