欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

数字基带传输系统设计

最编程 2024-04-14 15:52:56
...

文章和代码已经归档至【Github仓库:communication-system-simulation】或者公众号【AIShareLab】回复 通信系统仿真 也可获取。

数字基带传输系统设计

一、项目原理概述

1.1基带信号概念描述

基带信号是由信源产生的,没有经过调制,包含了要传输的信息的信号。

1.2数字基带传输系统概念描述

在某些具有低通特性的有线信道中,特别是在传输距离不太远的情况下,基带信号可以不经过载波调制而直接进行传输,这样的传输系统,称为数字基带传输系统。

1.3数字基带传输系统框图(AWGN信道)

图 1 数字基带传输系统框图(使用drawio绘制)

(1)发送滤波器(信道信号形成器):将发送的码元映射为基带波形,产生适合信道传输的基带信号波形。发送滤波器用于压缩输入信号频带,将传输码变换为适宜于信道传输的基带信号波形。

(2)传输信道:允许基带信号通过的媒介,一般会产生噪声造成信号衰减。对于AWGN信道,是加性的零均值符合高斯分布的噪声。

(3)接受滤波器:用来接收信号,尽可能滤除信道噪声和ISI对系统性能的影响,对信道特性进行平衡,使输出的基带波形有利于抽样判决。

(4)抽样判决器:在传输特性不理想及噪声背景下,在特定抽样时刻对接收滤波器输出波形进行抽样判决,以恢复或再生基带信号。

(5)位定时提取(定时脉冲和同步提取):用来抽样的位定时脉冲依靠同步提取电路从接收信号中提取信号,位定时的准确与否将直接影响判决效果。

二、相关代码设计思路及代码实现

2.1滤波器部分

2.1.1 根升余弦匹配滤波型

1.设计原理

确定理想升余弦滤波器的频域表达式,对给定的理想滤波器的频率响应进行抽样,其中频率抽样间隔Δf=1NT\Delta f=\frac{1}{N T},得到H(kΔf)H(k \Delta f)。计算抽样值的幅度响应,开平方后可得平方根升余弦的幅度响应:abs函数取幅度响应,利用sqrt函数开平方得Hwsqrt=H(kΔf)H w s q r t=\sqrt{H(k \Delta f)}

对幅度响应进行离散傅里叶反变换,并取实部即可。我们针对公式进行了代码的编写。

这里离散傅里叶反变换公式如下:

x~(n)=1Nk=0N1X~(k)ej2πNnk\tilde{x}(n)=\frac{1}{N} \sum_{k=0}^{N-1} \tilde{X}(k) e^{j \frac{2 \pi}{N} n k}

2.流程图

图2 频率抽样法设计FIR平方根升余弦滤波器流程

3.代码实现

% 采用频率抽样法设计平方根升余弦特性的匹配滤波器
% alpha:滚降因子
% L:为FIR滤波器的长度
function SendFilter=MatchSendFilter(alpha,L)
    Tc = 4;
    fs = 1;% 抽样频率为1
    for m = 1 : L
        n = abs(fs * (m - (L - 1) / 2) / L);
        if n <= (1 - alpha) / 2 / Tc
            Hd(m) = sqrt(Tc);
        elseif n > (1 - alpha) / 2 / Tc && n <= (1 + alpha) / 2 / Tc
            Hd(m) = sqrt(Tc / 2 * (1 + cos(pi * Tc / alpha * (n - (1 - alpha) / 2 / Tc)))); 
        elseif n > (1 + alpha) / 2 / Tc
            Hd(m) = 0;
        end
    end
        % 离散傅里叶反变换
for n=0:M-1
hn(n+1)=0;
    for k=0:N-1
hn(n+1)=hn(n+1)+H(k+1)*exp(1j*2*pi/M*(n+1)*(k+1));
    end
    hn(n+1)=1/M*hn(n+1);
SendFilter(m) = hn(n+1);
end
     SendFilter = real(SendFilter);
     fid=fopen('sendfilter.bin.txt','w');           %将滤波器的单位冲激响应的有关参数存入文件?
    fwrite(fid,SendFilter,'double');
    fclose(fid);
end

2.1.2 根升余弦匹配滤波型

1.设计原理

利用窗函数设计FIR数字滤波器是在时域上进行的。Blackman窗的时域表达式为

w(n)=[0.420.5cos(2πnN1)+0.08cos(4πnN1)]RN(n)w(n)=\left[0.42-0.5 \cos \left(\frac{2 \pi n}{N-1}\right)+0.08 \cos \left(\frac{4 \pi n}{N-1}\right)\right] R_{N}(n)

由升余弦滚降滤波器的单位冲激响应得到FIR滤波器的设计公式为:

h(nT)=hd(t)t=nTw(n)h(n T)=h_{d}(t) \mid t=n T \cdot w(n)

由此得到关于原点偶对称的有限长单位冲激响应,将其向右移位τ=N12\tau=\frac{N-1}{2},得到因果的FIR滤波器。

2.流程图

图3 用窗函数法设计FIR升余弦滚降滤波器流程图

3.代码实现

% 采用窗函数设计法设计升余弦特性的非匹配滤波器
% alpha:滚降因子
% L:为FIR滤波器的长度
function SendFilter=NonMatchSendFilter(alpha,L)
    Tc=4;
    n=-(L-1)/2:(L-1)/2;
    A=sin(pi*n/Tc);
    B=pi*n/Tc;
    C=cos(alpha*pi*n/Tc); D=1-4*alpha^2*n.^2/Tc^2;        hd=A./B.*C./D;                                        
    hd((L+1)/2)=1;                                        
    SendFilter=rand(length(hd));
    for n=0:L-1
        w=0.42-0.5*cos(2*pi*n/(L-1))+0.08*cos(4*pi*n/(L-1)) %Blackman窗
        SendFilter(n+1)=hd(n+1)*w;
    end    
fid=fopen('sendfilter.txt','w');           %将滤波器的单位冲激响应的有关参数存入文件
fwrite(fid,SendFilter,'double');                   %写入数据
    fclose(fid);
end

2.2 数字基带系统部分

2.2.1发送信号生成

1.设计原理

输入参数:N:传输码元个数 A:一个比特周期的抽样点数SourceOutput:双极性二进制信源输出 输出参数:ProcessedSource:发送滤波器输入信号

传入发送滤波器的信号为生成的双极性二进制信号经抽样后的,抽样公式为

 ProcessedSource (n)=l=0L1 SourceOutput(l) δ(nlTb)\text { ProcessedSource }(\mathrm{n})=\sum_{l=0}^{L-1} \text { SourceOutput(l) } \delta\left(n-l T_{b}\right)

序列只在  ProcessedSource (n)\text { ProcessedSource }(\mathrm{n}) 只在 n=lTbn=l \cdot T_{b} 时有值,值为  SourceOutput(l) \text { SourceOutput(l) } ,再在序列中除抽取外的其它位置插入零值点,得到发送滤波器的输入序列。

2.代码实现

function an = SourceSignal(N)
%function an = SourceSignal(N,seed)
%双极性信源信号产生输入参数为N,seed为随机种子,控制随机数的生成
%rng(seed)
an =rand(1,N);
for i = 1:N
    if an(i)< 0.5
        an(i)=-1;
    elseif an(i)>=0.5
        an(i)=1;
    end
end
end

2.2.2信源输出

1.设计原理

输入参数:N:传输码元个数

输出参数:SourceOutput:生成的双极性二进制信源

输入为要生成的序列的长度N,利用matlab中的rand函数产生范围在0到1的有L个随机数的序列,再经过判断,将随机序列中大于0.5的输出1,小于0.5的输出-1。针对码元个数,定义1×A*L的序列dn,对矩阵dn每隔A插入数值,这样就发送了完整的信号。

2.代码实现

function dn=SendSignal(an,A)
%发送信号生成
%输入参数为双极性信源信号an,A为一个比特周期的抽样点数
L=length(an);%获取序列的码元个数
dn=zeros(1,A*L);
for i=1:L
    dn(A*(i-1)+1)=an(i);%插入零点
end
end

2.2.3信道噪声信号

1.设计原理

输入参数:SNR:

信噪比 ChannelInput:发送滤波器输出信号

输出参数:Noise:产生的信道噪声

已知信噪比 SNR 和平均比特能量 EbE_{b} 可由公式 sigm=N02=Eb/10SNR/102sigm =\frac{N_{0}}{2}=\frac{E_{b} / 10^{S N R / 10}}{2} 计算出热噪声的功率 谱密度. 在 Matlab 中生成一个均值为 a\mathrm{a} , 方差为 b\mathrm{b} 的随机矩阵的方法为将 randn 产生的结果 乘以标准差, 然后加上期望均值。所以要产生均值为 0 , 方差为 N02\frac{N_{0}}{2} 的高斯随机序列, 公式为

noise=randn(size(ChannelInput))sqrt(No2)noise =\operatorname{randn}(\operatorname{size}( ChannelInput )) * \operatorname{sqrt}\left(\frac{N_{\mathrm{o}}}{2}\right)

2.代码实现

% 信道噪声信号的产生
% SNR:信噪比
% ChannelInput:发送滤波器输出信号
function Noise=GuassNoise(SNR,ChannelInput)
    L = length(ChannelInput);
    Eb = 0;
    for i = 1 : L
        Eb = Eb + ChannelInput(i)^2;
end
    Eb = Eb / L;
% 通过信噪比和计算出的平均每比特能量Eb来计算N0
    N0 = Eb / (10^(SNR / 10));  
    % 计算出噪声的功率谱密度,开方
    StandardDeviation = sqrt(N0 / 2); 
    Noise = 0 + StandardDeviation * randn(1,L);
end

2.2.4眼图绘制

1.设计原理

输入参数: ReceiveFilterOutput:接收滤波器输出信号 A:一个比特周期内的抽样点数 N:传输码元个数 输出参数:每屏信号显示4个码元周期的眼图

眼图可以理解为一系列信号在示波器的叠加

2.流程图

图4 眼图绘制流程图

3.代码实现

%眼图的绘制,每屏显示4个码元周期的眼图
% A:一个比特周期内的抽样点数
% N:传输码元个数
%ReceiveFilterOutput:接收滤波器输出信号
function EyeDiagram(A,N,ReceiveFilterOutput)
    figure;
    for i = 1 : 4 : N / 4 
        EyePattern =     ReceiveFilterOutput((i - 1) * A + 1 : (i + 3) * A);
        plot(EyePattern,'b');
        hold on
    end
    title('眼图');
end

2.2.5 抽样信号与判决信号的产生

1.设计原理

输入参数:A:一个比特周期内的抽样点数 N:传输码元个数 ReceiveFilterOutput:接收滤波器输出信号

输出参数:SamplingSignal:抽样信号 JudgingSignal:判决信号

对接收滤波器输出信号进行抽样判决:先在接收滤波器输出信号的对应点处抽样得到抽样信号。再对抽样信号以零为门限进行判决,大于等于0则判决为1,小于零则判决为-1。

2.代码实现

%抽样信号和判决信号的生成
% A:一个比特周期内的抽样点数
% N:传输码元个数
%ReceiveFilterOutput:接收滤波器输出信号
function [JudgingSignal,SamplingSignal] = JudgeAndSample(A,N,ReceiveFilterOutput)
for i = 0 : N - 1
        SamplingSignal(i + 1) = 
    ReceiveFilterOutput(A * i + 1); 
if SamplingSignal(i + 1) >= 0
            JudgingSignal(i + 1) = 1;
 elseif SamplingSignal(i + 1) < 0
            JudgingSignal(i + 1) = -1;
        end
    end
end

2.2.6星座图的绘制

1.设计原理

输入参数:SamplingSignal:抽样后得到的信号 输出:星座图

将在发送序列SourceOutput为1时对应的抽样序列的值放入序列strong(i)中,-1对应的抽样序列值放入weak(i)中,绘制两个序列的散点图。在Matlab中可用scatterplot函数绘制星座图。点越接近1或-1证明受到噪声的干扰越小。

2.流程图

图5 星座图流程图

3.代码实现

% 星座图的绘制
% SamplingSignal:抽样后得到的信号
function StarsDiagram(SamplingSignal)
    N = length(SamplingSignal);
    m = 1;
    n = 1;
    for i = 1 : N
        if SamplingSignal(i) < 0
            weak(m) = SamplingSignal(i);
            m = m + 1;
        elseif SamplingSignal(i) >= 0
            strong(n) =     SamplingSignal(i);
            n = n + 1;
        end
    end
    figure
    plot(weak,zeros(1,length(weak)),'.r');
    hold on
    plot(strong,zeros(1,length(strong)),'.b');
    title('星座图');
end

三、性能测试

3.1 滤波器性能测试

据前面原理所述, FIR 滤波器的群延时为 τ=N12\tau=\frac{N-1}{2}

上一篇: Matlab 绘制 RC 网络幅相曲线

下一篇: 自主控制理论 第 6 章 II 相对稳定性、鸟图和闭环频率响应

推荐阅读