精华内容
下载资源
问答
  • OFDM完整仿真过程及解释(MATLAB)

    万次阅读 多人点赞 2019-04-19 17:03:45
    因为是复制过来,如果出现图片显示完整以及需要源程序请点击下面链接查看原文: OFDM完整仿真过程及解释(MATLAB) - 子木的文章 - 知乎 https://zhuanlan.zhihu.com/p/57967971 目录: 一、说明 二、ofdm...

    因为是复制过来,如果出现图片显示不完整以及需要源程序请点击下面链接查看原文:

    OFDM完整仿真过程及解释(MATLAB) - 子木的文章 - 知乎

    点击这里访问原文

    后面的更新没有同步,点上面链接可以看更新部分。

     

    目录:

    一、说明

    二、ofdm总体概述

    三、基本原理

    四、过程中涉及的技术

    五、OFDM基本参数的选择

    六、OFDM的MATLAB仿真程序

     

    一、说明

    0.能找到这篇文章,说明对ofdm已经有一点了解,所以其原理就不再赘述,这篇代码的目的只是希望能对ofdm整个过程有一个理解;

    1.看书上ofdm介绍挺简单的,自己来仿真才发现很多知识点都不知道;

    2.花了很长时间才理清整个ofdm过程,网上的程序都是一段一段的,不能直接理解整个过程。所以想着自己来做一个完整过程的仿真,加深理解;

    3.基带信号能完成整个过程,但是想加进频带传输这一部分,就完整了;

    4.信道部分想用瑞利信道的,程序写出来了,但是误差和信道估计这一块还不是很明白,所以就先用的高斯信道;

    5.不足之处欢迎指正。。。。

    二、概述

    OFDM是一种特殊的多载波传输方案,它可以被看作是一种调制技术,也可以被当作一种复用技术。

    简单来说:OFDM是一种多载波的传输方法,它将频带划分为多个子信道并行传输数据,将高速数据流分成多个并行的低速数据流,然后调制到每个信道的子载波上进行传输。由于它将非平坦衰落无线信道转化成多个正交平坦衰落的子信道,从而可消除信道波形间的干扰,达到对抗多径衰落的目的。

    正交频分复用(OFDM)是对多载波调制(MCM)的一种改进,在。它的特点是:各子载波相互正交,所以扩频调制后的频谱可以相互重叠,不但减少了子载波间的相互干扰,还大大提高了频谱利用率。

    选择OFDM的一个很大的原因是该系统能够很好的对抗频率选择性衰落和窄带干扰。在单载波系统中,一次衰落或者干扰会导致整个链路失效,但是在多载波系统中,某一时刻只会有少部分的子信道受到深衰落的影响。

    三、基本原理

    3.1 OFDM系统收发机的典型(根据实际需要可添/删部分)框图如下:

    OFDM收发机框图

    其中,上半部分对应于发射机链路,下半部分对应于接收机链路。

    发送端将被传输的数字信号转换成子载波幅度和相位的映射,并进行离散傅里叶变换(IDFT),将数据的频谱表达式变到时域上。IFFT和IDFT变换的作用相同,只是有更高的计算效率,所以适用于所有的应用系统。接收端进行与发送端相反的操作,用FFT变换分解,子载波的幅度和相位最终转换回数字信号。

    这里理解为传输的频域信号是因为IFFT是从频域到时域,实际上这里IFFT充当的是一个实现子载波正交的作用,具体可以推导其DFT公式。知乎里公式编辑太麻烦了。

     

    3.2 OFDM调制与解调

    一个OFDM符号之内包括多个经过调制的子载波的合成信号,其中每个子载波都可以收到psk(相移键控)和qam(正交幅度调制)的调制。

    OFDM发射机将信息比特流映射成一个psk或qam符号序列,之后将串行的符号序列转换为并行符号流。每N个经过串并转换的符号被不同的子载波调制。

    OFDM符号是N个并行符号的复合信号,若单个串行符号的传输时间(周期)是Ts,则一个OFDM符号的持续时间(周期)Tsym=N*Ts。

    频域调制信号X[k]的频率为:fk=k/Tsym,子载波数量为N,则k=0,1,2.....N-1。(由DFT原理推导)

    四、过程中涉及的技术

    为什么要用?怎么用?

    4.1 保护间隔

    多径信道会对OFDM符号造成ISI影响,破坏了子载波间的正交性。故需要采取一些方法来消除多径信道带来的符号间干扰(ISI)影响,即插入保护间隔。

    保护间隔有两种插入方法:一种是补零(zp),即在保护间隔中填充0;另一种是插入循环前缀(cp)或循环后缀(cs)实现OFDM的循环扩展(为了某种连续性)。

    zp是在保护间隔内不插入任何信号,但是在这种情况下,由于多径传播的影响,会产生载波间干扰(ICI),即不同的子载波间会产生干扰。

    一般采用cp。cp是将OFDM后部的采样复制到前面,长度为Tcp,故每个符号的长度为Tsym=Tsub+Tcp,Tsub为数据部分子载波数。Tcp大于或等于多径时延,符号间的ISI影响将被限制在保护间隔中,因此不会影响下一个OFDM的FFT变换。

    4.2交织

    交织的作用是将突发错误转换为随机错误,有利于前向纠错码的译码,提高了整个通信系统的可靠性。交织由两个变换过程组成。第一次变换保证了相邻的编码比特被映射到不相邻的子载波上。第二次变换保证了相邻的编码比特被分别映射到星座图的重要和非重要比特上,避免出现长时间的低比特位映射。

    交织块的长度Ncbps,对qpsk、16qam、64qam分别为2、4、6,s=Ncbps/2,d=16。

    4.3信道编码

    由于移动通信存在干扰和衰落,在信号传输过程中将出现差错,故对数字信号必须采用纠、检错技术,即纠、检错编码技术,以增强数据在信道中传输时抵御各种干扰的能力,提高系统的可靠性。

    这里的信道编码一般采用卷积编码,Viterbi译码。

    卷积编码是现代数字通信系统中常见的一种前向纠错码,区别于常规的线性分组码,卷积编码的码字输出不仅与当前时刻的信息符号输入有关,还与之前输入的信息符号有关。

    4.4 扩频

    “扩频通信技术是一种信息传输方式,其信号所占有的频带宽度远大于所传信息必需的最小带宽;频带的扩展是通过一个独立的码序列来完成,用编码及调制的方法来实现的,与所传信息数据无关;在接收端则用同样的码进行相关同步接收、解扩及恢复所传信息数据”

    根据香农定理,带宽和信噪比可用互换,扩频扩展了带宽,则对信噪比的要求可降低。

    4.5 导频

    导频不携带信息,导频是双方已知的数据,是用来做信道估计的。

    在接收机中,虽然利用接收到的段训练序列、长训练序列可以进行信道均衡、频率偏差校正,但符号还会存在一定的剩余偏差,且偏差会随着时间的累积而累积,会造成所有子载波产生一定的相位偏移。因此,还需要不断地对参考相位进行跟踪。要能实现这个功能,需要在52个非0子载波中插入导频符号。

    4.6 RF(射频)调制

    OFDM调制器的输出产生了一个基带信号,将此基带信号与所需传输的频率进行混频操作,利用模拟技术或数字上变频可完成。由于数字调制技术提高了处理I、Q信道之间的匹配性和数字IQ调制器相位的准确性,将会更加精确。

    五、OFDM基本参数的选择

    5.1 各种OFDM参数的选择就是需要在多项要求冲突中进行折衷考虑。通常来说,首先要确认3个参数:带宽、比特率、及保护间隔。

    5.1.1 按照惯例,保护间隔的时间长度应该为应用移动环境信道的时延扩展均方根值的2~4倍。

    5.1.2 确定保护间隔之后,则OFDM符号周期长度就确定了。为了最大限度的减少由于插入保护比特所带来的信噪比的损失,OFDM符号周期长度远远大于保护间隔长度。但是符号周期又不能任意大,否则就需要更多的子载波,带宽不变,子载波间隔就变小,系统的实现复杂度就提高了,而且还加大了系统的峰值平均功率比,同时系统对频率偏差更加敏感。因此,一般选择符号周期长度是保护间隔的5倍,这样,由于插入保护比特所造成的信噪比损耗只有1dB左右。

    5.1.3 确定保护间隔和符号周期长度之后,子载波的数量可由-3dB带宽除以子载波间隔(即去掉保护间隔之后的符号周期的倒数)得到。或者可由所要求比特速率除以每个子信道的比特速率来确定子载波的数量。每个信道中所传输的比特速率可由调制类型、编码速率、和符号速率来确定。

    5.2 有用符号持续时间T

    T对子载波之间间隔、译码的等待周期都有影响,为了保持数据的吞吐量,子载波数目和FFT的长度要有相对较大的数量,这就导致符号持续时间变长。总之,符号周期长度的选择以保证信道的稳定为前提。

    5.3 子载波数

    N=1/T

    其数值与FFT处理过的复数点数相对应,需适应数据速率和保护间隔的要求。

    5.4 调制模式

    OFDM系统的调制模式基于功率和频谱利用率来选择,可采用qam、psk。

    为了使所有的点有相同的平均功率,二进制序列映射后的复数要归一化。(BPSK\QPSK\16QAM\64QAM分别对应乘以1、1/根号2、1/根号10、1/根号42),解调的时候再变回去。

    5.5 以具体实例说明;

    要求:(1)比特率为25Mbit/s(2)可容忍的时延扩展为200ns(3)带宽小于18MHz。

    1)由200ns时延扩展得保护间隔为800ns;

    2)由保护间隔800ns得符号周期长度6*800ns=4.8us;

    3)子载波的间隔选取4.8-0.8=4us的倒数,即250KHz;

    4)由所要求的比特速率与OFDM符号速率的比值,每个符号需要传送的比特:25Mbit/s)/(1/4.8us)=120bit。

    5)为了完成上面120bit/符号,有两种选择:利用16QAM和码率为1/2的编码方法,这样每个子载波携带2bit的有用信息,因此需要60个子载波;另一种是利用QPSK和码率为3/4的编码方法,每个子载波携带1.5bit信息。因此需要80个子载波,然而80个子载波意外着带宽:80*250KHz=20MHz,大于所给带宽要求,故取第一种,即60个子载波。可利用64点IFFT来实现,剩余4个子载波补0.

    六、OFDM的MATLAB仿真主程序

    clc;
    clear;
    
    %————————————————————————————————————————————————————————%
    %q1:ifft点数难道不是应该等于子载波数吗?子载波数与ifft点数的关系?
    %a:ifft点数等于子载波数
    %q2:对矩阵进行fft?
    %a:y可以是一向量或矩阵,若y为向量,则Y是y的FFT,并且与y具有相同的长度。若y为一矩阵,则Y是对矩阵的每一列向量进行FFT。
    %q3:怎么对ofdm信号上变频
    %————————————————————————————————————————————————————————%
    
    %% 参数设置
    
    N_sc=52;      %系统子载波数(不包括直流载波)、number of subcarrier
    N_fft=64;            % FFT 长度
    N_cp=16;             % 循环前缀长度、Cyclic prefix
    N_symbo=N_fft+N_cp;        % 1个完整OFDM符号长度
    N_c=53;             % 包含直流载波的总的子载波数、number of carriers
    M=4;               %4PSK调制
    SNR=0:1:25;         %仿真信噪比
    N_frm=10;            % 每种信噪比下的仿真帧数、frame
    Nd=6;               % 每帧包含的OFDM符号数
    P_f_inter=6;      %导频间隔
    data_station=[];    %导频位置
    L=7;                %卷积码约束长度
    tblen=6*L;          %Viterbi译码器回溯深度
    stage = 3;          % m序列的阶数
    ptap1 = [1 3];      % m序列的寄存器连接方式
    regi1 = [1 1 1];    % m序列的寄存器初始值
    
    
    %% 基带数据数据产生
    P_data=randi([0 1],1,N_sc*Nd*N_frm);
    
    
    %% 信道编码(卷积码、或交织器)
    %卷积码:前向纠错非线性码
    %交织:使突发错误最大限度的分散化
    trellis = poly2trellis(7,[133 171]);       %(2,1,7)卷积编码
    code_data=convenc(P_data,trellis);
    
    
    %% qpsk调制
    data_temp1= reshape(code_data,log2(M),[])';             %以每组2比特进行分组,M=4
    data_temp2= bi2de(data_temp1);                             %二进制转化为十进制
    modu_data=pskmod(data_temp2,M,pi/M);              % 4PSK调制
    % figure(1);
    scatterplot(modu_data),grid;                  %星座图(也可以取实部用plot函数)
    
    %% 扩频
    %————————————————————————————————————————————————————————%
    %扩频通信信号所占有的频带宽度远大于所传信息必需的最小带宽
    %根据香农定理,扩频通信就是用宽带传输技术来换取信噪比上的好处,这就是扩频通信的基本思想和理论依据。
    %扩频就是将一系列正交的码字与基带调制信号内积
    %扩频后数字频率变成了原来的m倍。码片数量 = 2(符号数)* m(扩频系数)
    %————————————————————————————————————————————————————————%
    
    code = mseq(stage,ptap1,regi1,N_sc);     % 扩频码的生成
    code = code * 2 - 1;         %将1、0变换为1、-1
    modu_data=reshape(modu_data,N_sc,length(modu_data)/N_sc);
    spread_data = spread(modu_data,code);        % 扩频
    spread_data=reshape(spread_data,[],1);
    
    %% 插入导频
    P_f=3+3*1i;                       %Pilot frequency
    P_f_station=[1:P_f_inter:N_fft];%导频位置(导频位置很重要,why?)
    pilot_num=length(P_f_station);%导频数量
    
    for img=1:N_fft                        %数据位置
        if mod(img,P_f_inter)~=1          %mod(a,b)就是求的是a除以b的余数
            data_station=[data_station,img];
        end
    end
    data_row=length(data_station);
    data_col=ceil(length(spread_data)/data_row);
    
    pilot_seq=ones(pilot_num,data_col)*P_f;%将导频放入矩阵
    data=zeros(N_fft,data_col);%预设整个矩阵
    data(P_f_station(1:end),:)=pilot_seq;%对pilot_seq按行取
    
    if data_row*data_col>length(spread_data)
        data2=[spread_data;zeros(data_row*data_col-length(spread_data),1)];%将数据矩阵补齐,补0是虚载频~
    end;
    
    %% 串并转换
    data_seq=reshape(data2,data_row,data_col);
    data(data_station(1:end),:)=data_seq;%将导频与数据合并
    
    %% IFFT
    ifft_data=ifft(data); 
    
    %% 插入保护间隔、循环前缀
    Tx_cd=[ifft_data(N_fft-N_cp+1:end,:);ifft_data];%把ifft的末尾N_cp个数补充到最前面
    
    %% 并串转换
    Tx_data=reshape(Tx_cd,[],1);%由于传输需要
    
    %% 信道(通过多经瑞利信道、或信号经过AWGN信道)
     Ber=zeros(1,length(SNR));
     Ber2=zeros(1,length(SNR));
    for jj=1:length(SNR)
        rx_channel=awgn(Tx_data,SNR(jj),'measured');%添加高斯白噪声
        
    %% 串并转换
        Rx_data1=reshape(rx_channel,N_fft+N_cp,[]);
        
    %% 去掉保护间隔、循环前缀
        Rx_data2=Rx_data1(N_cp+1:end,:);
    
    %% FFT
        fft_data=fft(Rx_data2);
        
    %% 信道估计与插值(均衡)
        data3=fft_data(1:N_fft,:); 
        Rx_pilot=data3(P_f_station(1:end),:); %接收到的导频
        h=Rx_pilot./pilot_seq; 
        H=interp1( P_f_station(1:end)',h,data_station(1:end)','linear','extrap');%分段线性插值:插值点处函数值由连接其最邻近的两侧点的线性函数预测。对超出已知点集的插值点用指定插值方法计算函数值
    
    %% 信道校正
        data_aftereq=data3(data_station(1:end),:)./H;
    %% 并串转换
        data_aftereq=reshape(data_aftereq,[],1);
        data_aftereq=data_aftereq(1:length(spread_data));
        data_aftereq=reshape(data_aftereq,N_sc,length(data_aftereq)/N_sc);
        
    %% 解扩
        demspread_data = despread(data_aftereq,code);       % 数据解扩
        
    %% QPSK解调
        demodulation_data=pskdemod(demspread_data,M,pi/M);    
        De_data1 = reshape(demodulation_data,[],1);
        De_data2 = de2bi(De_data1);
        De_Bit = reshape(De_data2',1,[]);
    
    %% (解交织)
    %% 信道译码(维特比译码)
        trellis = poly2trellis(7,[133 171]);
        rx_c_de = vitdec(De_Bit,trellis,tblen,'trunc','hard');   %硬判决
    
    %% 计算误码率
        [err,Ber2(jj)] = biterr(De_Bit(1:length(code_data)),code_data);%译码前的误码率
        [err, Ber(jj)] = biterr(rx_c_de(1:length(P_data)),P_data);%译码后的误码率
    
    end
     figure(2);
     semilogy(SNR,Ber2,'b-s');
     hold on;
     semilogy(SNR,Ber,'r-o');
     hold on;
     legend('4PSK调制、卷积码译码前(有扩频)','4PSK调制、卷积码译码后(有扩频)');
     hold on;
     xlabel('SNR');
     ylabel('BER');
     title('AWGN信道下误比特率曲线');
    
     figure(3)
     subplot(2,1,1);
     x=0:1:30;
     stem(x,P_data(1:31));
     ylabel('amplitude');
     title('发送数据(以前30个数据为例)');
     legend('4PSK调制、卷积译码、有扩频');
    
     subplot(2,1,2);
     x=0:1:30;
     stem(x,rx_c_de(1:31));
     ylabel('amplitude');
     title('接收数据(以前30个数据为例)');
     legend('4PSK调制、卷积译码、有扩频');
    

    七、能看到这里,如果有丢丢帮助的话,emmmm点个赞~呗

    原文:

    整个过程

    本来对每一步都有讲解注释的,但是程序编辑多了感觉不美观,就删掉了。比如扩频,其原理、作用、如何实现~

    三、代码及说明

    1.尽量把每一句程序都注释,能达到初学者拿到程序就能懂的程度;

    2.下面这段程序是上变频之前的,包含了画图,对ofdm信号有一个直观的感受(与上面图片中的流程可能冲突,这里仅仅是为了画图解释,所以这也是最开始学容易绕晕的地方)

    clear;
    %% 参数设置
    sub_carriers=2048;%子载波数
    T = 1 / sub_carriers;
    time = [0:T:1-T];% Nifft份,每份相隔T
    
    Lp=4984;
    P_Tx=(rand(1,Lp)>0.5);%(bits)%产生1个长为Lp的数据包:
    conv_out=convolutional_en(P_Tx);%(卷积编码):
    interleave_table = interleav_matrix(ones(1,2*(Lp+8)));
    interleav_out = interleaving(conv_out ,interleave_table);%(交织器)
    
    x=qpsk(interleav_out);%(4QAM 调制)
    L=length(x);%信号长度
    
    s=48;
    symbol_used_len=L/s;%把输入分为S个符号,每个符号长为symbol_used_len
    %循环前缀的长度
    cp=256;
    %每一个OFDM符号的抽样值应补‘0’个数zeros_pad
    zeros_pad=sub_carriers-symbol_used_len;
    %每一个OFDM符号一侧应该补‘0’个数zeros_pad_side
    zeros_pad_side=zeros_pad/2;
    
    %对输入信号进行分割,分割为s个符号,再对每个符号进行FFT运算,实现OFDM解调,并保证能量不变
    time_domain_x_link=[];
    for I=0:(s-1)
        %对输入进行分割 
        x_temp=x(I*symbol_used_len+1:I*symbol_used_len+symbol_used_len);
        %对每个分割的部分进行补零操作,使其长为sub_carriers
        x_temp_pad=[zeros(1,zeros_pad_side),x_temp,zeros(1,zeros_pad_side)];
        %对每个符号进行IFFT运算
        time_domain_x_temp=ifft(x_temp_pad)*sqrt(sub_carriers);
        %对每个符号添加循环前缀
        time_domain_x_cp_temp=[time_domain_x_temp(sub_carriers-cp+1:sub_carriers),time_domain_x_temp];
        %将符号连接成为串行数据流
        time_domain_x_link=[time_domain_x_link,time_domain_x_cp_temp];
    
    end
    sum_xI = real(time_domain_x_link);
    sum_xQ = imag(time_domain_x_link);
    
    figure;
    num=1000;%画出前num个点  
    xaxis   = zeros(length(time(1:num)));
    plot(time(1:num), sum_xI(1:num), 'b:', time(1:num), sum_xQ(1:num), 'g:', time(1:num), abs(sum_xI(1:num)+j*sum_xQ(1:num)), 'k-', time(1:num), xaxis, 'r-');
    ylabel('y'),xlabel('t'),
    title(['前', num2str(num),'个点经ifft的QAM符号实部之和虚部之和以及实部与虚部的绝对值波形']),
    legend('实部之和','虚部之和', '绝对值');

    3.与上面图片流程相符的代码

    代码前面的问题也是我在这个过程中遇到的,困扰了好久,可以带着问题看看。欢迎讨论。

    clc;
    clear;
    
    %————————————————————————————————————————————————————————%
    %q1:fft点数难道不是应该等于子载波数吗?子载波数与ifft点数的关系?
    %q2:对矩阵进行fft?
    %q3:怎么对ofdm信号上变频
    %q4:基带速率是多少?怎么实现?
    %q5传输频带是多少?怎么实现?
    %q6子载波间隔是多少?怎么实现?
    %q7符号周期是多少?怎么实现?
    %————————————————————————————————————————————————————————%
    
    %% 参数设置
    
    N_sc=52;      %系统子载波数(不包括直流载波)、number of subcarrier
    N_fft=64;            % FFT 长度
    N_cp=16;             % 循环前缀长度、Cyclic prefix
    N_symbo=N_fft+N_cp;        % 1个完整OFDM符号长度
    N_c=53;             % 包含直流载波的总的子载波数、number of carriers
    M=4;               %4PSK调制
    SNR=0:1:25;         %仿真信噪比
    N_frm=10;            % 每种信噪比下的仿真帧数、frame
    Nd=6;               % 每帧包含的OFDM符号数
    P_f_inter=6;      %导频间隔
    data_station=[];    %导频位置
    L=7;                %卷积码约束长度
    tblen=6*L;          %Viterbi译码器回溯深度
    stage = 3;          % m序列的阶数
    ptap1 = [1 3];      % m序列的寄存器连接方式
    regi1 = [1 1 1];    % m序列的寄存器初始值
    
    
    %% 基带数据数据产生
    P_data=randi([0 1],1,N_sc*Nd*N_frm);
    
    
    %% 信道编码(卷积码、或交织器)
    %卷积码:前向纠错非线性码
    %交织:使突发错误最大限度的分散化
    trellis = poly2trellis(7,[133 171]);       %(2,1,7)卷积编码
    code_data=convenc(P_data,trellis);
    
    
    %% qpsk调制
    data_temp1= reshape(code_data,log2(M),[])';             %以每组2比特进行分组,M=4
    data_temp2= bi2de(data_temp1);                             %二进制转化为十进制
    modu_data=pskmod(data_temp2,M,pi/M);              % 4PSK调制
    % figure(1);
    scatterplot(modu_data),grid;                  %星座图(也可以取实部用plot函数)
    
    %% 扩频
    %————————————————————————————————————————————————————————%
    %扩频通信信号所占有的频带宽度远大于所传信息必需的最小带宽
    %根据香农定理,扩频通信就是用宽带传输技术来换取信噪比上的好处,这就是扩频通信的基本思想和理论依据。
    %扩频就是将一系列正交的码字与基带调制信号内积
    %扩频后数字频率变成了原来的m倍。码片数量 = 2(符号数)* m(扩频系数)
    %————————————————————————————————————————————————————————%
    
    code = mseq(stage,ptap1,regi1,N_sc);     % 扩频码的生成
    code = code * 2 - 1;         %将1、0变换为1、-1
    modu_data=reshape(modu_data,N_sc,length(modu_data)/N_sc);
    spread_data = spread(modu_data,code);        % 扩频
    spread_data=reshape(spread_data,[],1);
    
    %% 插入导频
    P_f=3+3*1i;                       %Pilot frequency
    P_f_station=[1:P_f_inter:N_fft];%导频位置(导频位置很重要,why?)
    pilot_num=length(P_f_station);%导频数量
    
    for img=1:N_fft                        %数据位置
        if mod(img,P_f_inter)~=1          %mod(a,b)就是求的是a除以b的余数
            data_station=[data_station,img];
        end
    end
    data_row=length(data_station);
    data_col=ceil(length(spread_data)/data_row);
    
    pilot_seq=ones(pilot_num,data_col)*P_f;%将导频放入矩阵
    data=zeros(N_fft,data_col);%预设整个矩阵
    data(P_f_station(1:end),:)=pilot_seq;%对pilot_seq按行取
    
    if data_row*data_col>length(spread_data)
        data2=[spread_data;zeros(data_row*data_col-length(spread_data),1)];%将数据矩阵补齐,补0是虚载频~
    end;
    
    %% 串并转换
    data_seq=reshape(data2,data_row,data_col);
    data(data_station(1:end),:)=data_seq;%将导频与数据合并
    
    %% IFFT
    ifft_data=ifft(data); 
    
    %% 插入保护间隔、循环前缀
    Tx_cd=[ifft_data(N_fft-N_cp+1:end,:);ifft_data];%把ifft的末尾N_cp个数补充到最前面
    
    %% 并串转换
    Tx_data=reshape(Tx_cd,[],1);%由于传输需要
    
    %% 信道(通过多经瑞利信道、或信号经过AWGN信道)
     Ber=zeros(1,length(SNR));
     Ber2=zeros(1,length(SNR));
    for jj=1:length(SNR)
        rx_channel=awgn(Tx_data,SNR(jj),'measured');%添加高斯白噪声
        
    %% 串并转换
        Rx_data1=reshape(rx_channel,N_fft+N_cp,[]);
        
    %% 去掉保护间隔、循环前缀
        Rx_data2=Rx_data1(N_cp+1:end,:);
    
    %% FFT
        fft_data=fft(Rx_data2);
        
    %% 信道估计与插值(均衡)
        data3=fft_data(1:N_fft,:); 
        Rx_pilot=data3(P_f_station(1:end),:); %接收到的导频
        h=Rx_pilot./pilot_seq; 
        H=interp1( P_f_station(1:end)',h,data_station(1:end)','linear','extrap');%分段线性插值:插值点处函数值由连接其最邻近的两侧点的线性函数预测。对超出已知点集的插值点用指定插值方法计算函数值
    
    %% 信道校正
        data_aftereq=data3(data_station(1:end),:)./H;
    %% 并串转换
        data_aftereq=reshape(data_aftereq,[],1);
        data_aftereq=data_aftereq(1:length(spread_data));
        data_aftereq=reshape(data_aftereq,N_sc,length(data_aftereq)/N_sc);
        
    %% 解扩
        demspread_data = despread(data_aftereq,code);       % 数据解扩
        
    %% QPSK解调
        demodulation_data=pskdemod(demspread_data,M,pi/M);    
        De_data1 = reshape(demodulation_data,[],1);
        De_data2 = de2bi(De_data1);
        De_Bit = reshape(De_data2',1,[]);
    
    %% (解交织)
    %% 信道译码(维特比译码)
        trellis = poly2trellis(7,[133 171]);
        rx_c_de = vitdec(De_Bit,trellis,tblen,'trunc','hard');   %硬判决
    
    %% 计算误码率
        [err,Ber2(jj)] = biterr(De_Bit(1:length(code_data)),code_data);%译码前的误码率
        [err, Ber(jj)] = biterr(rx_c_de(1:length(P_data)),P_data);%译码后的误码率
    
    end
     figure(2);
     semilogy(SNR,Ber2,'b-s');
     hold on;
     semilogy(SNR,Ber,'r-o');
     hold on;
     legend('4PSK调制、卷积码译码前(有扩频)','4PSK调制、卷积码译码后(有扩频)');
     hold on;
     xlabel('SNR');
     ylabel('BER');
     title('AWGN信道下误比特率曲线');
    
     figure(3)
     subplot(2,1,1);
     x=0:1:30;
     stem(x,P_data(1:31));
     ylabel('amplitude');
     title('发送数据(以前30个数据为例)');
     legend('4PSK调制、卷积译码、有扩频');
    
     subplot(2,1,2);
     x=0:1:30;
     stem(x,rx_c_de(1:31));
     ylabel('amplitude');
     title('接收数据(以前30个数据为例)');
     legend('4PSK调制、卷积译码、有扩频');

    4.上面就是整个基带传输过程,其实上变频和下变频也很简单,将信号分为IQ路,分别乘cos和-sin即可,关于这一步,可以参考我另一篇8PSK调制的文章,在那篇文章里有相似的原理。链接:https://blog.csdn.net/qq_41687938/article/details/89514982和贼详细的8PSK调制与解调详细过程 - 子木的文章 - 知乎 https://zhuanlan.zhihu.com/p/47258287

    5.本来打算解释解释原理的,但是想着网上资料很多,就不献丑了,想打王者了~

    展开全文
  • LDPC编译码原理

    万次阅读 多人点赞 2019-08-01 20:45:32
    LDPC码简介 LDPC编码 LDPC译码 结语

    LDPC码简介

          低密度校验码(LDPC码)是一种前向纠错码,LDPC码最早在20世纪60年代由Gallager在他的博士论文中提出,但限于当时的技术条件,缺乏可行的译码算法,此后的35年间基本上被人们忽略,其间由Tanner在1981年推广了LDPC码并给出了LDPC码的图表示,即后来所称的Tanner图。1993年Berrou等人发现了Turbo码,在此基础上,1995年前后MacKay和Neal等人对LDPC码重新进行了研究,提出了可行的译码算法,从而进一步发现了LDPC码所具有的良好性能,迅速引起强烈反响和极大关注。经过十几年来的研究和发展,研究人员在各方面都取得了突破性的进展,LDPC码的相关技术也日趋成熟,甚至已经开始有了商业化的应用成果,并进入了无线通信等相关领域的标准。

    • LDPC码的特点
      LDPC码是一种分组码,其校验矩阵只含有很少量非零元素。正是校验矩阵的这种稀疏性,保证了译码复杂度和最小码距都只随码长呈现线性增加。除了校验矩阵是稀疏矩阵外,码本身与任何其它的分组码并无二致。其实如果现有的分组码可以被稀疏矩阵所表达,那么用于码的迭代译码算法也可以成功的移植到它身上。然而,一般来说,为现有的分组码找到一个稀疏矩阵并不实际。不同的是,码的设计是以构造一个校验矩阵开始的,然后才通过它确定一个生成矩阵进行后续编码。而LDPC的编码就是本文所要讨论的主体内容。对于LDPC码而言,校验矩阵的选取十分关键,不仅影响LDPC码的纠错性能力,也影响LDPC编译码的复杂度及硬件实现的复杂度。准循环 LDPC 码(Quasi-Cycle,QC-LDPC)是 LDPC 码中重要的一类,是指一个码字以右移或左移固定位数的符号位得到的仍是一个码字。QC-LDPC 码的校验矩阵是由循环子矩阵的阵列组成,相对于其他类型的 LDPC 码,在编码和解码的硬件实现上具有许多优点。编码可以通过反馈移位寄存器有效实现,采用串行算法,编码的复杂度与校验比特位数成正比,而采用并行算法,编码复杂度与码字长度成正比。对硬件解码实现,准循环的结构简化了消息传递的路径,可以部分并行解码,实现了解码复杂度和速率的折中。这些优点,使得 QC-LDPC 码作为未来通信和存储系统应用的主要 LDPC 码。

    • 译码算法的选择
      译码方法是LDPC码与经典的分组码之间的最大区别。经典的分组码一般是用ML类的译码算法进行译码的,所以它们一般码长较小,并通过代数设计以减低译码工作的复杂度。但是LDPC码码长较长,并通过其校验矩阵H的图像表达而进行迭代译码,所以它的设计以校验矩阵的特性为核心考虑之一。由于 LDPC 码校验矩阵的稀疏性,其译码复杂度与码长不是指数关系,而是线性关系,因而 LDPC 码的码长可以很长,可以达到几千到几万甚至更高,这样带来的一个好处是:一个码字内各比特之间的关联长度比较长,一般通过迭代译码方法进行译码,充分利用码字内各比特的关联性以提高译码准确度,并且还充分利用了信道的特征。本课题采用的译码算法为置信传播(BP)译码算法,置信传播算法是基于 Tanner 图的迭代译码算法。在迭代过程中,可靠性信息,即“消息”通过 Tanner图上的边在变量节点和校验节点中来回传递,经多次迭代后趋于稳定值,然后据此进行最佳判决,BP译码算法有着非常好译码性能。

    • Tanner图
      LDPC码常常通过图来表示,而Tanner图所表示的其实是LDPC码的校验矩阵。Tanner图包含两类顶点:n个码字比特顶点(称为比特节点),分别与校验矩阵的各列相对应和m个校验方程顶点(称为校验节点),分别与校验矩阵的各行对应。校验矩阵的每行代表一个校验方程,每列代表一个码字比特。所以,如果一个码字比特包含在相应的校验方程中,那么就用一条连线将所涉及的比特节点和校验节点连起来,所以Tanner图中的连线数与校验矩阵中的1的个数相同。以下图是矩阵的Tanner图,其中比特节点用圆形节点表示,校验节点用方形节点表示,加黑线显示的是一个6循环:
      ​​​​​​在这里插入图片描述
      Tanner图中的循环是由图中的一群相互连接在一起的顶点所组成的,循环以这群顶点中的一个同时作为起点和终点,且只经过每个顶点一次。循环的长度定义为它所包含的连线的数量,而图形的围长,也可叫做图形的尺寸,定义为图中最小的循环长度。如上图中,图形的尺寸,即围长为6,如加黑线所示。
      在这里插入图片描述

    LDPC编码

    • 基于校验矩阵H直接编码方案
      首先推导出根据校验矩阵直接编码的等式。将尺寸为(m,n)校验矩阵写成如下形式:
      H = [ H 1   H 2 ] H=[H_1 \ H_2] H=[H1 H2]
      其中 H 1 H_1 H1 的大小为 m ∗ k m*k mk H 2 H_2 H2 的大小为 m ∗ m m*m mm 。设编码后的码字行向量为 c c c ,它的长度为n,把它写成如下形式
      c = [ s   p ] c=[s \ p] c=[s p]
      其中s是信息码的行向量,长度为k,p为检验行向量,长度为m,根据校验公式
      H ∗ c T = 0 H*c^T=0 HcT=0
      上式展开得
      [ H 1   H 2 ] [ s T p T ] = 0 [H_1 \ H_2] \begin{bmatrix} s^T \\ p^T \\ \end{bmatrix}=0 [H1 H2][sTpT]=0
      展开该矩阵方程,并考虑到运算是在GF(2)中进行的,得到
      p ∗ H 2 T = s ∗ H 1 T p*H^T_2=s*H^T_1 pH2T=sH1T
      如果校验矩阵H是非奇异的,则满秩,所以有
      p = s ∗ H 1 T ∗ H 2 − T p=s*H^T_1*H^{-T}_2 p=sH1TH2T
      这样就把码字的校验位计算出来了,这种方法需要保证 H 2 H_2 H2 是可逆的,而准循环LDPC码因其结构化的特点可以保证这一条件。
    • 基于生成矩阵G的编码方案
      令LDPC码的校验矩阵H分为两部分:
      H = [ Q c ∗ m   P c ∗ c ] H=[Q_{c*m} \ P_{c*c}] H=[Qcm Pcc]
      其中子矩阵P的大小为c×c,Q的大小为c×m。计算
      W = ( P c ∗ c − 1   Q c ∗ m ) T W=(P^{-1}_{c*c} \ Q_{c*m})^T W=(Pcc1 Qcm)T
      其中的矩阵运算为模二运算。求得的m×c矩阵W必定是一个稠密的准循环结构矩阵。由稠密的准循环结构矩阵W可以求得生成矩阵:
      G = [ I m ∗ m   W ] G=[I_{m*m }\ W] G=[Imm W]
      其中 I I I是m×m的单位矩阵。可以看出生成矩阵具有准循环结构特性。得到生成矩阵G后将码字X与其相乘C=X*G,获得编码后的码字C。这里的乘法要满足有限域的乘法法则。

    LDPC译码

    Gallager 在描述 LDPC 码的时候,分别提出了硬判决译码算法和软判决译码算法两种。经过不断发展,如今的硬判决算法已在 Gallager 算法基础上进展很多,包含许多种加权比特翻转译码算法及其改进形式。硬判决和软判决各有优劣,可以适用于不同的应用场合。

    • 比特翻转算法(BF)
      硬判决译码算法最早是 Gallager 在提出 LDPC 码软判决算法时的一种补充。硬判决译码的基本假设是当校验方程不成立时,说明此时必定有比特位发生了错误,而所有可能发生错误的比特中不满足校验方程个数最多的比特发生错误的概率最大。在每次迭代时均翻转发生错误概率最大的比特并用更新之后的码字重新进行译码。具体步骤如下:
    1. 设置初始迭代次数 k1及其上限kmax 。对获得的码字y=(y1,y2…yn)按照下式展开二元硬判决得到接收码字的硬判决序列Zn 。
      在这里插入图片描述
    2. k 1 = k m a x k_1=k_{max} k1=kmax ,则译码结束。不然,计算伴随式s=(s0,s1,…sm-1),sm表示第m个校验方程的值。若伴随式的值均为 0,说明码字正确,译码成功。否则说明有比特位错误。继续进行步骤3。
    3. 对每个比特,统计其不符合校验方程的数量fn (1<=n<=N)

    在这里插入图片描述
    4. 将最大 f n f_n fn所对应的比特进行翻转,然后k=k+1,返回步骤2。

          BF 算法的理论假设是若某个比特不满足校验方程的个数最多,则此比特是最有可能出错的比特,因此,选择这个比特进行翻转。BF 算法舍弃了每个比特位的可靠度信息,单纯的对码字进行硬判决,理论最为简单,实现起来最容易,但是性能也最差。当连续两次迭代翻转函数判断同一个比特位为最易出错的比特时,BF 算法会陷入死循环,大大降低了译码性能。

    • 置信传播算法(BP)
      置信传播(Belief Propagation)译码算法是消息传递(Message Passing)算法在 LDPC译码中的运用。消息传递算法是一个算法类,最初运用于人工智能领域,人们将其运用到 LDPC 码的译码算法中,提出了LDPC 码的置信传播算法。置信传播算法是基于 Tanner 图的迭代译码算法。在迭代过程中,可靠性信息,即“消息”通过 Tanner图上的边在变量节点和校验节点中来回传递,经多次迭代后趋于稳定值,然后据此进行最佳判决。

    在介绍BP译码算法之前需要先了解一下Tanner图的概念。

          Tanner图是一种表示LDPC码的双向图,图的下面每个节点表示码字的一个比特位,称比特节点(bit nodes)。上面每个节点称为校验节点(check nodes)。校验矩阵中为1的元素,表示Tanner图中比特节点和校验节点之间存在连接边,这条边可称为两端节点的相邻边,相邻边两端的节点称为相邻节点,每个节点相邻边数称为该节点的度数。Tanner图是用来描述LDPC码结构的有效工具,同时也是迭代译码算法的参考工具。在Tanner图中校验节点和变量节点之间可以进行消息的可靠传递,首先变量节点接收初始化后验概率进行计算,将得到的可靠信息传递给相邻的校验节点;经过校验节点更新算法的计算,再将得到的运算结果传回至与其相邻的变量节点处,随后变量节点再将由校验节点得到的可靠信息以及初始化后验概率信息进行处理;将最后得到的有效信息进行判决得到译码结果。
          LDPC码的译码较为复杂,下面以置信传播算法举一个简单的例子来说明一下。
          发送码字C=(C9,C8,C7,C6,C5,C4,C3,C2,C1),其监督矩阵H是
    在这里插入图片描述
          则C必然满足线性方程组 H C T = 0 HC^T=0 HCT=0,即
    在这里插入图片描述
          通过信道后接收到的码字Y=(Y0,Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8,Y9)可能包含错误,因此伴随式 S = H Y T ≠ 0 S=HY^T≠0 S=HYT̸=0。将此线性方程组用如图所示的Tanner图来表示。
    在这里插入图片描述
    图中的X0,X1…X9称为变量节点,代表10个比特C0,C1,C2…C9,它们是译码器待求解的未知变量。图中的 □ □ 成为校验节点,代表线性方程组中的每一个校验方程,连线就代表方程中此变量的系数为1。
          译码过程是在变量节点和校验节点之间传递信息。每个变量节点告诉它所连接的校验节点“我认为该变量是什么”,而校验节点告诉它所连接的变量节点“我认为该变量应该是什么”。经过反复的消息传递后,变量节点和校验节点不断改变自己对各个变量是什么的看法,最终能形成一个满足校验方程的码字,这就是译码的结果。如果经过充分的迭代后仍然不能形成一个满足校验方程的码字,则译码器宣布它无法译出这个码字,即译码失败。

    置信传播译码算法的基本流程如下:
          在迭代前,译码器接收到信道传送过来的实值序列y=(y1,y2,….yn),所有变量节点bi接收到对应的接收值yi。
          第一次迭代:每个变量节点给所有与之相邻的校验节点传送一个可靠性消息,这个可靠性消息就是信道传送过来的值;每个校验节点接收到变量节点传送过来的可靠性消息之后,进行处理,然后返回一个新的可靠性信息给与之相邻的变量节点,这样就完成了第一次迭代;此时可以进行判决,如果满足校验方程,则不需要再迭代,直接输出判决结果,否则进行第二次迭代。
          第二次迭代:每个变量节点处理第一次迭代完成时校验节点传送过来的可靠性消息,处理完成后新的消息发送给校验节点,同理,校验节点处理完后返回给变量节点,这样就完成了第二次迭代。完成后同样进行判决,如果满足校验方程则结束译码,否则如此反复多次迭代,每次都进行判决,直到达到设定的最大迭代次数,译码失败。在每次迭代过程中,无论是变量节点传送给校验节点的信息或者校验节点传送给变量节点的信息,都不应该包括前次迭代中接收方发送给发送方的信息,这样是为了保证发送的信息与接收节点已得到的信息相互对立。
          假设在 AWGN 信道中,信道编码后的码字C=(c1,c2,…,cn)通过调制映射为调制序列X=(x1,x2…,xn),然后经信道传输,接收的序列为y=(y1,y2…,yn)。
    为后面章节的推导方便,先介绍一引理。

    引理:

    一个独立的比特序列,其长度为m,假设第i个比特为 1 的概率为 p i p_i pi,则整个序列中出现偶数个1的概率为
    在这里插入图片描述)
    出现奇数个 1 的概率为
    在这里插入图片描述
    这是信道编码领域中经常使用的一个定理,故直接使用。

    Gallager 定理:对于 ( n , j , k ) (n, j, k) (n,j,k)规则 LDPC 码, P i l P_{il} Pil i i i个校验方程中第 l l l校特为1的概率,则
    在这里插入图片描述
    其中:
    P r ( x i = 0 ∣ { y } , S ) P_r(x_i=0|\{y\},S) Pr(xi=0{y},S)表示在程组为 S S S,接收序列为 y y y 的条件下判断发送帧中的第i个比特为0的概率
    P r ( x i = 1 ∣ { y } , S ) P_r(x_i=1|\{y\},S) Pr(xi=1{y},S)表示在程组为 S S S,接收序列为 y y y 的条件下判断发送帧中的第i个比特为0的概率
    p i p_i pi表示发送序列的第 i位为1的先验概率;
    M ( i ) M(i) M(i) 表示校验节点的集合,集合中的节点均与变量节点 i i i相邻;
    N ( j ) N( j) N(j) 表示变量节点的集合,集合中的节点均与校验节点 j j j 相邻。

    由上节介绍的 BP 算法的原理及 Gallager 定理中的描述可知,变量节点 i i i传递给校验节点 j j j的可靠性信息 q i j ( 1 ) q_{ij} (1) qij(1)就是 P r ⁡ ( X j = 1 ∣ { y } , S ) Pr⁡(X_j=1|\{y\},S) Pr(Xj=1{y},S),于是定义
    在这里插入图片描述
    表示变量节点 i i i传递给校验节点 j j j 的外部概率信息,即在得到除校验节点 j j j 以外的其他所有校验比特和信道的外部信息后,判断变量节点 c i = 1 c_i=1 ci=1的概率。
    再定义
    在这里插入图片描述
    表示变量节点 i i i传递给校验节点 j j j 的外部概率信息,即在得到除 j j j 以外的其他所有校验比特和信道的外部信息后,判断变量节点 c i = 0 c_i=0 ci=0的概率。
    另一方面,校验节点 j j j 传递给变量节点 i i i 的可靠性信息应该为在给定信息位和其他信息位具有独立概率分布条件下,校验方程 j j j 满足的概率。将此可靠性信息记为 r j i r_{ji} rji,则
    在这里插入图片描述
    将上式代入
    在这里插入图片描述
    根据以上的描述和符号定义,概率 BP 译码算法流程可以归纳为如下几个步骤:
    (1) 初始化
    计算经信道传输后各变量节点的初始概率 p i ( 1 ) p_i(1) pi(1) p i ( 0 ) p_i(0) pi(0)。然后对每个变量节点求传递给与其相邻的校验节点的可靠性信息
    在这里插入图片描述
    其中的上标(0)表示迭代次数。
    2) 校验节点处理过程 ( r i j (r_{ij} (rij的计算)
    求出第 l l l次迭代过程中校验节点i递给与之相邻的变量节点 j j j可靠性信息
    在这里插入图片描述
    其中的上标 ( l ) (l) (l) ( l − 1 ) (l −1) (l1)均表示迭代次数。
    (3)变量节点处理过程( q i j q_{ij} qij的计算)
    求出第 l l l 次迭代过程中变量节点 j j j 传递给与之相邻的校验节点 i i i的可靠性信息
    在这里插入图片描述
    其中的 K i j K_{ij} Kij是校正因子,使每次计算出的 q i j ( l ) ( 1 ) + q i j ( l ) ( 0 ) = 1 q^{(l)}_{ij}(1)+q^{(l)}_{ij}(0)=1 qij(l)(1)+qij(l)(0)=1
    (4)译码判决
    在本次迭代过程处理最后,重新计算各变量节点的可靠性信息
    在这里插入图片描述
    其中的 K j K_j Kj也为校正因子,目的是使 q j ( l ) ( 1 ) + q j ( l ) ( 0 ) = 1 q^{(l)}_{j}(1)+q^{(l)}_{j}(0)=1 qj(l)(1)+qj(l)(0)=1
    如果 q j ( l ) ( 1 ) > q j ( l ) ) ( 0 ) q^{(l)}_j (1)>q^{(l)}_j)(0) qj(l)(1)qj(l))(0),那么这一点的估计值时 c i = 1 c_i=1 ci=1,否则估计值为 c i = 0 c_i=0 ci=0。如果估计值满足奇偶校验方程,那么终止算法,否则算法继续运行,直到达到预先设置的最大迭代次数。

    • 仿真验证
    LDPC码基于IEEE 802.16e标准
    码长1440
    码率1/2
    有限域四元
    迭代次数20
    调制方式QPSK
    单一信噪比下仿真次数10^5
    最小误码总数不少于200
    信道高斯信道

    仿真说明如下:
    下图是在高斯信道下,码字经过LDPC编码和未编码的译码结果对比图,为了保证对比的有效性,仿真中LDPC码与未编码的码字等长,同为1440,LDPC码通过BP译码算法译码,而未编码的码字通过解调硬判决译码。
    在这里插入图片描述
    仿真结果分析:从图可以看出码字经过LDPC编译码之后其抵抗噪声的能力极大加强,与未编码的码字相比,在误码率都为1e-4时,其性能提高了9.5dB左右,从而验证了LDPC码是一种性能极佳的信道纠错码。

    • 结束语

    目前LDPC码研究领域的主要工作集中在译码算法的性能分析、编码方法、码的优化算法等,经过研究人员的努力,LDPC码的研究取得很大进展,但仍有许多问题需要进一步研究:

    (1)LDPC码校验矩阵的构造,尽管在构造最优的LDPC码方面取得了一些进步,但目前还没有一套系统的办法来构造所需要的好码,特别是在码字长度有限、码率一定的条件下,构造性能优异的好码是一个非常具有挑战性的课题。

    (2)LDPC编码系统的联合优化设计,将编码技术与调制技术、均衡技术、时空编码技术、OFDM技术结合进行性能优化是当前及将来的发展方向之一。

    (3)无线衰落信道及MIMO技术下LDPC码的性能分析方法及优化设计准则。目前LDPC码字的优化设计主要在加性高斯白噪声信道下得到的,而无线衰落信道下,特别是时变信道非线性环境下码字的性能分析方法、优化设计准则和信道估计的影响也是非常关键的课题,需要进一步的研究探索。

    此外,基于LDPC码的链路自适应技术,LDPC码在集成通信网物理层、应用层联合优化系统中的应用,LDPC码在无线局域网和深空宇航中的应用,基于LDPC码的图像传输、图像数字水印系统中的应用以及寻找更适合硬件实现的LDPC码编译码方法等都是非常值得研究的课题。

    展开全文
  • 浅谈脉冲调制编码 PCM的三个过程

    千次阅读 2020-05-18 22:05:42
    可见在发送端,要有一个将模拟信号转化成数字信号的过程,为A/D转换,在接收端有一个将数字信号转化成模拟信号的过程,为D/A转换。 脉冲调制编码PCM的主要作用是将时间连续,取值连续的模拟信号变换成时间离散,取值...

    例题:用PCM对语音进行数字量化,如果将声音分为64个量化级,采样频率为8000次/秒,那么一路话音需要的数据传输率为
    A.128bit/s
    B.56kbit/s
    C.48kbit/s
    D.64kbit/s

    答案:C (解答在文末)

    在数字通信系统中,信源和信宿都是模拟信号,而信道传输的是数字信号。可见在发送端,要有一个将模拟信号转化成数字信号的过程,为A/D转换,在接收端有一个将数字信号转化成模拟信号的过程,为D/A转换。

    脉冲调制编码PCM的主要作用是将时间连续,取值连续模拟信号变换成时间离散,取值离散数字信号后在信道中传输,即完成A/D转换。

    那么我们为什么需要将模拟信号转换成数字信号呢?

    主要原因在于模拟信号和数字信号两者的特点:
    模拟信号会随着信息的变化而变化,模拟信号其特点是幅度连续(连续的含义是在某一取值范围内可以取无限多个数值),如果要用计算机来识别模拟信号传输的内容,会十分的困难,且模拟信号抗干扰性也较差
    数字信号只有0、1两个状态,它的值是通过中央值来判断的,在中央值以下规定为0,以上规定为1,所以即使混入了其他干扰信号,只要干扰信号的值不超过阂值范围,就可以再现出原来的信号。因此数字信号在传输过程中不仅具有较高的抗干扰性,还可以通过压缩,占用较少的带宽,实现在相同的带宽内传输更多、更高音频、视频等数字信号的效果。
    基于这样的原因,我们需要采用PCM的方法将模拟信号转换成数字信号。

    PCM过程划分为3步,采样、量化、编码

    采样:

    为了将模拟信号转换成数字信号,首先就需要搞清楚模拟信号究竟长成什么样,于是我们第一步是采样,采样的方法是不断地在固定的时间间隔下,通过高频率的探测来采集模拟信号当时的电压瞬时值。
    在这里插入图片描述
    采样后得到的其实已经变成数字信号,但还不是实际应用中的二进制数字信号。并且采样得到的电压大小难以确定,且各不相同。如果让计算机记录下所有电压,难度很高且没有必要。因此接下来便进入第二步:量化。

    量化:

    量化是将电压划分为不同的等级,采用就近原则(“四舍五入”),把采集到的电压划分为不同的等级,减少工作量。例如下图,将采样得到的信号量化为了256个等级
    在这里插入图片描述
    介绍三个概念:
    •量化值:确定的量化后的取值
    •量化级:量化值的个数(也能表示电压等级个数)
    •量化间隔:相邻两个量化值之差

    编码:

    经过量化后的信号也存在很多不同的信号电压,若要计算机能够识别,就需要将每个采样电压等级转化成计算机可识别的二进制编码。用二进制码组表示量化后的十进制量化组。所以上图中采样信号的256个等级,如果转化成二进制的话,可以用8个bit位来表示。

    对于例题:
    将声音分为64个量化级,采样频率为8000次/秒。
    64个量化级表示采样后得到的电压被转化成64个电压等级,在编码时要用6bit表示。
    采样频率为8000次/秒,也就是说明每秒钟会采集到8000个6bit的电压数字信号。
    因此,为满足采样信号能够稳定传输,数据传输率就应该为8000次/秒*6bit=48000bit/s=48kbit/s。答案选择C。

    展开全文
  • 详解遗传算法(含MATLAB代码)

    万次阅读 多人点赞 2019-05-29 11:30:47
    1.编码 2.适应度函数 3.选择算子 4.交叉算子 5.变异算子 6.运行参数 四、遗传算法的基本原理 4.1 模式定理 4.2 积木块假设 五、遗传算法编程实例(MATLAB) 一、遗传算法概述 遗传算法(...

    目录

    一、遗传算法概述

    二、遗传算法的特点和应用

    三、遗传算法的基本流程及实现技术

    3.1 遗传算法的基本流程

    3.2 遗传算法的实现技术

    1.编码

    2.适应度函数

    3.选择算子

    4.交叉算子

    5.变异算子

    6.运行参数

    四、遗传算法的基本原理

    4.1 模式定理

    4.2 积木块假设

    五、遗传算法编程实例(MATLAB)


    一、遗传算法概述

            遗传算法(Genetic Algorithm,GA)是进化计算的一部分,是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法简单、通用,鲁棒性强,适于并行处理。

    二、遗传算法的特点和应用

       遗传算法是一类可用于复杂系统优化的具有鲁棒性的搜索算法,与传统的优化算法相比,具有以下特点:

    1. 以决策变量的编码作为运算对象。

        传统的优化算法往往直接利用决策变量的实际值本身来进行优化计算,但遗传算法是使用决策变量的某种形式的编码作为运算对象。这种对决策变量的编码处理方式,使得我们在优化计算中可借鉴生物学中染色体和基因等概念,可以模仿自然界中生物的遗传和进化激励,也可以很方便地应用遗传操作算子。

    2. 直接以适应度作为搜索信息。

        传统的优化算法不仅需要利用目标函数值,而且搜索过程往往受目标函数的连续性约束,有可能还需要满足“目标函数的导数必须存在”的要求以确定搜索方向。

        遗传算法仅使用由目标函数值变换来的适应度函数值就可确定进一步的搜索范围,无需目标函数的导数值等其他辅助信息。直接利用目标函数值或个体适应度值也可以将搜索范围集中到适应度较高部分的搜索空间中,从而提高搜索效率。

    3. 使用多个点的搜索信息,具有隐含并行性

        传统的优化算法往往是从解空间的一个初始点开始最优解的迭代搜索过程。单个点所提供的搜索信息不多,所以搜索效率不高,还有可能陷入局部最优解而停滞;

        遗传算法从由很多个体组成的初始种群开始最优解的搜索过程,而不是从单个个体开始搜索。对初始群体进行的、选择、交叉、变异等运算,产生出新一代群体,其中包括了许多群体信息。这些信息可以避免搜索一些不必要的点,从而避免陷入局部最优,逐步逼近全局最优解。

    4. 使用概率搜索而非确定性规则。

       传统的优化算法往往使用确定性的搜索方法,一个搜索点到另一个搜索点的转移有确定的转移方向和转移关系,这种确定性可能使得搜索达不到最优店,限制了算法的应用范围。

       遗传算法是一种自适应搜索技术,其选择、交叉、变异等运算都是以一种概率方式进行的,增加了搜索过程的灵活性,而且能以较大概率收敛于最优解,具有较好的全局优化求解能力。但,交叉概率、变异概率等参数也会影响算法的搜索结果和搜索效率,所以如何选择遗传算法的参数在其应用中是一个比较重要的问题

    综上,由于遗传算法的整体搜索策略和优化搜索方式在计算时不依赖于梯度信息或其他辅助知识,只需要求解影响搜索方向的目标函数和相应的适应度函数,所以遗传算法提供了一种求解复杂系统问题的通用框架。它不依赖于问题的具体领域,对问题的种类有很强的鲁棒性,所以广泛应用于各种领域,包括:

    • 函数优化
    • 组合优化生产调度问题
    • 自动控制
    • 机器人学
    • 图像处理(图像恢复、图像边缘特征提取......)
    • 人工生命
    • 遗传编程
    • 机器学习

    三、遗传算法的基本流程及实现技术

       基本遗传算法(Simple Genetic Algorithms,SGA)只使用选择算子、交叉算子和变异算子这三种遗传算子,进化过程简单,是其他遗传算法的基础。

    3.1 遗传算法的基本流程

    1.  通过随机方式产生若干由确定长度(长度与待求解问题的精度有关)编码的初始群体;
    2. 通过适应度函数对每个个体进行评价,选择适应度值高的个体参与遗传操作,适应度低的个体被淘汰;
    3. 经遗传操作(复制、交叉、变异)的个体集合形成新一代种群,直到满足停止准则(进化代数GEN>=?);
    4. 将后代中变现最好的个体作为遗传算法的执行结果。

                                                       

    其中,GEN是当前代数;M是种群规模,i代表种群数量。

    3.2 遗传算法的实现技术

    基本遗传算法(SGA)由编码、适应度函数、遗传算子(选择、交叉、变异)及运行参数组成。

    1.编码

    (1)二进制编码

    二进制编码的字符串长度与问题所求解的精度有关。需要保证所求解空间内的每一个个体都可以被编码。

    优点:编、解码操作简单,遗传、交叉便于实现

    缺点:长度大

    (2)其他编码方法

    格雷码、浮点数编码、符号编码、多参数编码等

    2.适应度函数

    适应度函数要有效反映每一个染色体与问题的最优解染色体之间的差距。

    3.选择算子

    通过选择算子模拟“优胜劣汰”,适应度高的个体被遗传到下一代的概率较大,适应度低的算子被遗传到下一代的概率较小。

    常用的选择算法:轮盘赌选择法,即令\sum f_i表示群体的适应度函数值的总和,f_i表示群体中第i个染色体的适应度值,则它产生后代的能力刚好为其适应度值所占的份额\frac{f_i}{\sum f_i}

    4.交叉算子

    • 交叉运算是指对两个相互配对的染色体按某种方式相互交换其部分基因,从而形成两个新的个体;
    • 交叉运算是遗传算法区别于其他进化算法的重要特征,是产生新个体的主要方法。

    在交叉之前需要将群体中的个体进行配对,一般采取随机配对原则。

    常用的交叉方式:

    • 单点交叉
    • 双点交叉(多点交叉,交叉点数越多,个体的结构被破坏的可能性越大,一般不采用多点交叉的方式)
    • 均匀交叉
    • 算术交叉

    5.变异算子

    遗传算法中的变异运算是指将个体染色体编码串中的某些基因座上的基因值用该基因座的其他等位基因来替换,从而形成一个新的个体。

    就遗传算法运算过程中产生新个体的能力方面来说,交叉运算是产生新个体的主要方法,它决定了遗传算法的全局搜索能力;而变异运算只是产生新个体的辅助方法,但也是必不可少的一个运算步骤,它决定了遗传算法的局部搜索能力。交叉算子与变异算子的共同配合完成了其对搜索空间的全局搜索和局部搜索,从而使遗传算法能以良好的搜索性能完成最优化问题的寻优过程。

    6.运行参数

    • 编码长度。编码长度取决于问题解的精度,精度越高,编码越长;
    • 种群规模。规模小,收敛快但降低了种群的多样性,N=20-200
    • 交叉概率。较大的交叉概率容易破坏种群中已形成的优良结构,使搜索具有太大随机性;较小的交叉概率发现新个体的速度太慢,一般取值为P_c=0.4-0.99
    • 变异概率。变异概率太小,则变异操作产生新个体的能力和抑制早熟现象的能力会较差;变异概率过高随机性过大,一般建议取值范围为0.005~0.01
    • 终止进化代数。算法运行结束的条件之一,一般取100~1000

    四、遗传算法的基本原理

    4.1 模式定理

    定义1:模式H是由{0,1,*}中的元素组成的一个编码串,其中“*”表示通配符,既能被当作0,也能被当作1。e.g. H=10**1

    定义2:模式的阶,是指模式中所含有0,1的数量,记作O(H)  e.g. O(11*00**)=4

    定义3:模式的矩,即模式的长度,是指模式中从左到右第一个非*位和最后一个非*位之间的距离,记作\delta (H)

              e.g. \delta (01**1)=3;\delta (**0*1)=2;\delta (***1**)=1

    定义4:模式的适应度值,是群体中所包含的全部个体的适应度值的平均值。

    定义5:在选择、交叉、变异遗传算子的作用下,低阶、长度短、超过群体平均适应值的模式的生存数量,将随迭代次数以指数规律增长。

    模式定理不仅说明基因块的样本呈指数增长,也说明用遗传算法寻求最优样本的可能性,但它并未指出遗传算法一定能够寻求到最优解,积木块假设说明了遗传算法的寻找最优解的能力。

    4.2 积木块假设

    具有低阶、定义长度短,且适应度值高于群体平均适应度值的模式称为基因块或积木块。

    积木块假设:个体的基因块通过选择、交叉、变异等遗传算子的作用,能够相互拼接在一起,形成适应度更高的个体编码串。

    积木块假设说明了用遗传算法求解各类问题的基本思想,即通过积木块直接相互拼接在一起能够产生更好的解。

    五、遗传算法编程实例(MATLAB)

    https://github.com/strawberry-magic-pocket/Genetic-Algorithm.git

     

    展开全文
  • LDPC编解码初探

    万次阅读 多人点赞 2017-12-26 10:03:08
    在SSD内部的LDPC解码过程中,主要包括了两方面内容: 硬解码(Hard Decode) 和 软解码(Soft Decode) . LDPC解码的方法就是收到码字之后,与校验矩阵H相乘,如果是0矩阵,则说明收到的是正确码字。反之,则正确码字...
  • 哈夫曼编码及其解码全过程

    万次阅读 2018-07-20 10:59:29
    今年的小学期我选了做哈夫曼编码,老师的要求是这样的: 编—译码系统的设计   内容: (1) 读入待编码的文字,统计各字符出现的频率 (2) 构造哈夫曼树 (3) 得到各字符的哈夫曼编码 (4) 对原文...
  • 遗传算法

    万次阅读 多人点赞 2019-04-06 21:41:47
    使用遗传算法求解多峰函数的最大值,是我的一项课程作业,做完之后,顺便把文档整理出来做个记录。全部内容如下: 1、问题描述 编程实现遗传算法,并...遗传算法是受达尔文的进化论的启发,借鉴生物进化过程而提出...
  •   软件的生命周期是指从软件产品的设想开始到软件在使用而结束的时间。   软件的生命周期分为6个阶段,即需求分析、计划、设计、编码、测试、运行维护。 1. 瀑布模型   瀑布模型是最早出现的软件开发模型,...
  • 你应该了解的安全编码典型问题

    千次阅读 2020-05-14 20:48:23
    对这几年编码过程中,遇到的典型安全编码问题进行归纳总结,以飨诸君。 目录前言问题总览典型问题分析及处理措施1. 缓存区溢出2. 整数溢出或回绕3. 命令注入4. 引用空指针5. 跨站脚本6. 未正确清理特定内容7. 日志...
  • 浅谈浏览器的编码与解码过程

    万次阅读 2017-09-13 11:10:50
    浏览器是如何解码的 无论是作为开发,还是作为黑客,企图从Web 端注入...下面我们要做的,是去了解浏览器到底如何解码,该如何在解码过程中避免漏洞的产生。在此之上,我更愿意揭开整个浏览器的工作流程,了解其本质。
  • AV1编码技术详解

    万次阅读 2020-12-18 20:18:23
    AV1,目前业界最新的开源视频编码格式,对标专利费昂贵的H.265。它由思科、谷歌、网飞、亚马逊、苹果、Facebook、英特尔、微软、Mozilla等组成的开放媒体联盟(Alliance for Open Media,简称AOMedia)开发。而当前...
  • 主数据及编码

    千次阅读 2020-01-26 12:03:40
    早期以 ERP 为代表的制造业集成应用系统的发展过程中,产生了信息孤岛和数据处理危机问题。为了解决这些问题,主数据这个概念随之诞生。 目前,对主数据的定义没有统一,一些 MDM 产品提供商和学者提出了各自对主...
  • 卷积自编码器是自编码器方法的一种延伸,自编码包括编码和解码,通过将输入的图像进行编码,特征映射到隐层空间,然后解码器对隐层空间的特征进行解码(重建的过程)获得输入的重建样本。自编码一般使用NN网络做...
  • 优化算法——遗传算法

    万次阅读 多人点赞 2015-05-10 17:09:28
    遗传算法过程中的具体操作 参数的编码 二进制编码 Gray编码 实数编码 有序编码 初始群体的设定 适应度函数的计算 遗传操作设计 选择selection 交叉crossover 变异mutation 控制参数的设定 求解优化问题的实例 问题...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
  • 关于Jmeter参数化的编码问题

    千次阅读 2018-08-15 11:25:51
    大家用jmeter最常遇到的是请求参数中文乱码问题(至于返回值乱码问题由于处理简单也影响测试,就在这里说了),而对于这个问题,很多人能从根本上去分析和理解,所以就无法从根本上去回避和解决,以下我就通过...
  • 详解自动编码器(AE)

    千次阅读 多人点赞 2019-11-21 11:57:34
    自动编码器(Auto-Encoders,AE) 降噪自编码(Denoising Auto-Encoders, DAE)(2008) 堆叠降燥自动编码器 (Stacked Denoising Auto-Encoders, SAE)(2008) 卷积自动编码器(Convolution Auto-Encoders, CAE)(2011) 变分...
  • 编码的基本原理

    千次阅读 2019-01-08 18:01:05
    编码的基本原理 TD-LTE下行传输采用了MIMO-OFDM的物理层构架,通过最多4个发射天线并行传输...LTE的物理层处理过程中,预编码是其核心功能模块,物理下行共享信道的几种主要传输模式都是通过预编码实现的。  在...
  • 字符编码那些事--彻底理解掌握编码知识

    万次阅读 多人点赞 2020-05-04 16:42:33
    每一个程序员都可避免的遇到字符编码的问题,很多人在字符编码方面同样遇到不少问题,而且一直对各种编码懵懵懂懂、楚。这篇文章就是针对字符编码中的一些问题进行了详细的阐述,能从根本上理解字符编码
  • 编码和可靠性编码

    千次阅读 2019-03-31 20:24:36
    编码和可靠性编码
  • Android 音视频采集与软编码总结

    万次阅读 2017-07-22 21:06:24
    本文总结了笔者在 Android 音视频采集与软编码中的一些经验与技巧,包括移植 FFmpeg、YUV 视频帧处理、最新的 JNI 编写技巧、 ndk 开发技巧等,为了扯太远本文不会对音视频编码的一些原理性东西进行剖析,也...
  • 编码过程中,编码器为当前宏块选择一种编码的模式,该模式决定了宏块中所有的像素采用帧内预测还是帧间预测。根据不同标准的不同,每一个宏块选定了编码模式之后进一步确定如何分割成更小的子块进行编码。一个宏块所...
  • 编码

    千次阅读 多人点赞 2019-07-04 16:49:57
    编码器是一种机电装备, 可以用来测量机械运动或者目标位置。 大多数编码器都使用光学传感器来提供脉冲序列形式的电信号, 这些信号可以依次转换成运动、方向或位置信息。 编码器依运动方式可分为旋转编码器或是线性...
  • EPC 编码

    千次阅读 2018-07-11 11:17:13
    现在世界上的物联网有三大应用架构,分别是基于RFID、传感... 目前,国际上还没有统一的RFID编码规则。为了更好地推动RFID产业的发展,国际标准化组织ISO、以美国为首的EPCglobal、日本UID等标准化组织纷纷制定RFID...
  • 信源编码的三种方式与实现

    万次阅读 多人点赞 2019-01-15 02:01:21
    信源编码的三种方式与实现一、本文概述二、编码原理1. 哈夫曼编码2. 算术编码3. LZ编码三、算法设计思路1. 哈夫曼编码a. 设置功能结构体和函数b. 压缩文件初始化统计表频度读入文件并统计频度对统计表频度排序建立...
  • 3.卷积码编码方法 4.卷积码译码方法 1.卷积码简介 卷积码将k个信息比特编成n个比特,但k和n通常很小,特别适合以串行形式进行传输,时延小。与分组码不同,卷积码编码后的n个码元不仅与当前段的k个信息有关,还与...
  • LDPC编译码

    万次阅读 多人点赞 2018-03-07 19:28:32
    在每次迭代过程中,无论是变量节点传送给校验节点的信息或者校验节点传送给变量节点的信息,都应该包括前次迭代中接收方发送给发送方的信息,这样是为了保证发送的信息与接收节点已得到的信息相互对立。...
  • 信源编码和信道编码

    千次阅读 2018-12-06 15:14:59
    但现代通信应用中常见的信源编码方式有:Huffman编码、算术编码、L-Z编码,这三种都是无损编码,另外还有一些有损的编码方式。信源编码的目标就是使信源减少冗余,更加有效、经济地传输,最常见的应用形式就是压缩。...
  • 计算机编程种常见的几种编码详解

    千次阅读 2019-10-31 21:38:59
    其实计算机编程离编码 但是大多数都能真正全面了解各种编码 今天就来好好和几位编码熟悉熟悉 一、字符、字符集和字符编码方式 字符:字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且...
  • 预测性编码(Predictive Coding)简介

    千次阅读 2019-02-27 10:59:10
    预测性编码(Predictive Coding)简介 Yanping Huang and Rajesh P. N. Rao 摘要 预测性编码(Predictive Coding)是在神经系统中对认知冗余进行缩减(understanding redundancy reduction)并且进行高效编码的统一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 498,495
精华内容 199,398
关键字:

属于编码的过程不包括