matlab实现二元码编码(单极性非归零码、双极性非归零码,单极性归零码、双极性归零码、传号差分码、空号差分码、数字双相码、密勒码、传号反转码)

这篇具有很好参考价值的文章主要介绍了matlab实现二元码编码(单极性非归零码、双极性非归零码,单极性归零码、双极性归零码、传号差分码、空号差分码、数字双相码、密勒码、传号反转码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       

目录

1、单极性非归零码(NRZ码)

2、双极性非归零码

 3、单极性归零码(RZ)

4、双极性归零码

5、传号差分码

6、空号差分码

8、数字双向码

9、密勒码

10、传号反转码(CMI)

11、完整代码


        二元码基带信号的波形为矩形波,幅度取值只有两种电平,分别对应与二进制码1和0。接下来将介绍常用的二元码的编码方式以及对应的matlab代码。
        进行编码之前要先对要编码的二进制码进行定义:

% 定义二进制信码
code = [1 1 1 0 1 0 0 0 1 1 0 0 1 0];
% 创建时间轴数据
t = 0:0.5:(length(code)*100-1)*0.5;

length_t = length(t);
%查看t的长度
disp(length_t);

        其中,时间轴数据可以任意创建,但是要保证后期绘图时plot函数的前两个参数长度相等。

1、单极性非归零码(NRZ码)

        最简单最常用的码型,用高电平和低电平(常为零电平)两种取值表示二进制码1和0。即用高电平表示1,用低电平表示0。

% 单极性非归零码
NRZ = [];%存储单极性非归零码
for i = 1:length(code)
    if code(i) == 1
        %使用方括号拼接两个向量[]
        NRZ = [NRZ ones(1, 100)];%为了和t长度一样,一次的跨度也要为100
    else
        NRZ = [NRZ zeros(1, 100)];
    end
end

matlab实现二元密勒码,信号处理,matlab

2、双极性非归零码

        用正电平和负电平分别表示1和0。与单极性归零码相比只是将0修改成-1.

% 双极性非归零码
polar_NRZ = [];
for i = 1:length(code)
    if code(i) == 1
        polar_NRZ = [polar_NRZ ones(1, 100)];
    else
        polar_NRZ = [polar_NRZ -1*ones(1, 100)];
    end
end

matlab实现二元密勒码,信号处理,matlab

 3、单极性归零码(RZ)

        在发送1时,在整个码元期间。高电平只持续一段时间,其余时间归零,即返回到零电平,高电平与整个码元周期的比值叫做占空比。发送0时,则用零电平表示。
        假设占空比为50%

% 单极性归零码:1的时候分一半为0(归零),0的时候为0
RZ = [];
for i = 1:length(code)
    if code(i) == 1
        RZ = [RZ ones(1, 50) zeros(1, 50)];%从高电平到低电平过渡
    else
        RZ = [RZ zeros(1, 100)];
    end
end

matlab实现二元密勒码,信号处理,matlab

4、双极性归零码

        用正极性的归零码和负极性的归零码分别用1和0表示。简单来说,1用10表示,0用-10表示。

% 双极性归零:在双极性非归零码的基础上,给1和-1均加入过渡值,即一半归零
polar_RZ = [];
for i = 1:length(code)
    if code(i) == 1
        polar_RZ = [polar_RZ ones(1, 50) zeros(1, 50)];
    else
        polar_RZ = [polar_RZ -1*ones(1, 50) zeros(1, 50)];
    end
end

matlab实现二元密勒码,信号处理,matlab

5、传号差分码

        电平发生跳变用1表示,故需要定义前一个二元码的值才好进行比较

%传号差分码:波形跳变取值为1
NRZ_M = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i = 1:length(code)
    if code(i) == 1
        bit_value = xor(previous_bit, 1); % 当前位与前一位异或运算,相同为0,不同为1
    else
        bit_value = previous_bit;
    end
    NRZ_M = [NRZ_M ones(1, 100)*bit_value];
    
    previous_bit = bit_value; % 更新前一位比特的数值
end

matlab实现二元密勒码,信号处理,matlab

6、空号差分码

        电平发生跳变用0表示,与传号差分码只有细微差别

% 空号差分码:波形跳变取值为0
NRZ_S = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i = 1:length(code)
    if code(i) == 1
        bit_value = previous_bit;
    else   
        bit_value = xor(previous_bit, 1); % 当前位与前一位异或运算
    end
    NRZ_S = [NRZ_S ones(1, 100)*bit_value];
    
    previous_bit = bit_value; % 更新前一位比特的数值
end

matlab实现二元密勒码,信号处理,matlab

8、数字双向码

        用两位码表示想象中的一位码。一种规定是用10表示0,用01表示1

%数字双向码
manchester_code  = [];
for i = 1:length(code)
    if code(i) == 1
        manchester_code = [manchester_code -1*ones(1,50) ones(1,50)];
    else
        manchester_code = [manchester_code ones(1,50) -1*ones(1,50)];
    end
end

matlab实现二元密勒码,信号处理,matlab

9、密勒码

        1用10和01交替表示。0有两种情况:单0时在码元间隔内不出现电平跃变,而且在与相邻码元的边界处也无跃变;出现连0时,在两个0的边界处出现电平跃变,即00与11交替。

        所以需要一个flag实现10和01交替表示,用计数变量count存储连0出现的次数,判断是否出现连0的情况。(在代码中,负电平表示0)

%密勒码
miler_code = [];
flag = 1;
count_0 = 0;%存储连0的个数
for i=1:length(code)
    if code(i) == 1
        count_0 = 0;%清空连0个数
        miler_code = [miler_code -1*flag*ones(1,50) flag*ones(1,50)]
        if flag == 1
            flag = -1;
        else
            flag = 1;
        end
    else  %等于0
        count_0 = count_0+1;
        if(count_0 < 2)%不连零的情况
            miler_code = [miler_code -flag*ones(1,100)]
        else%连零
            miler_code = [miler_code flag*ones(1,100)]
            flag = -flag;
        end
    end
end

matlab实现二元密勒码,信号处理,matlab

10、传号反转码(CMI)

        1交替的用00和11表示,0固定的用01表示

%传号反转码
CMI=[];
flag = 1; % 初始极性为正
for i = 1:length(code)
    if code(i) == 1
        CMI = [CMI ones(1, 100)*flag];
       if flag==1
           flag=-1;
       else
           flag=1;
       end
    else
        CMI = [CMI ones(1, 50)*-1 ones(1, 50)]; % 0:交替极性
    end
end

matlab实现二元密勒码,信号处理,matlab

11、完整代码

% 定义二进制信码
code = [1 1 1 0 1 0 0 0 1 1 0 0 1 0];
% 创建时间轴数据
t = 0:0.5:(length(code)*100-1)*0.5;

length_t = length(t);
%查看t的长度
disp(length_t);

% 单极性非归零码:1的时候为1,0的时候为0
NRZ = [];%存储单极性非归零码
for i = 1:length(code)
    if code(i) == 1
        %使用方括号拼接两个向量[]
        NRZ = [NRZ ones(1, 100)];%为了和t长度一样,一次的跨度也要为100
    else
        NRZ = [NRZ zeros(1, 100)];
    end
end

% 双极性非归零码:1的时候为1,0的时候为-1
polar_NRZ = [];
for i = 1:length(code)
    if code(i) == 1
        polar_NRZ = [polar_NRZ ones(1, 100)];
    else
        polar_NRZ = [polar_NRZ -1*ones(1, 100)];
    end
end

% 单极性归零码:1的时候分一半为0(归零),0的时候为0
RZ = [];
for i = 1:length(code)
    if code(i) == 1
        RZ = [RZ ones(1, 50) zeros(1, 50)];%从高电平到低电平过渡
    else
        RZ = [RZ zeros(1, 100)];
    end
end

% 双极性归零:在双极性非归零码的基础上,给1和-1均加入过渡值,即一半归零
polar_RZ = [];
for i = 1:length(code)
    if code(i) == 1
        polar_RZ = [polar_RZ ones(1, 50) zeros(1, 50)];
    else
        polar_RZ = [polar_RZ -1*ones(1, 50) zeros(1, 50)];
    end
end

%传号差分码:波形跳变取值为1
NRZ_M = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i = 1:length(code)
    if code(i) == 1
        bit_value = xor(previous_bit, 1); % 当前位与前一位异或运算,相同为0,不同为1
    else
        bit_value = previous_bit;
    end
    NRZ_M = [NRZ_M ones(1, 100)*bit_value];
    
    previous_bit = bit_value; % 更新前一位比特的数值
end


% 空号差分码:波形跳变取值为0
NRZ_S = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i = 1:length(code)
    if code(i) == 1
        bit_value = previous_bit;
    else   
        bit_value = xor(previous_bit, 1); % 当前位与前一位异或运算
    end
    NRZ_S = [NRZ_S ones(1, 100)*bit_value];
    
    previous_bit = bit_value; % 更新前一位比特的数值
end

%数字双向码
%0:用10表示;1:用01表示
manchester_code  = [];
for i = 1:length(code)
    if code(i) == 1
        manchester_code = [manchester_code -1*ones(1,50) ones(1,50)];
    else
        manchester_code = [manchester_code ones(1,50) -1*ones(1,50)];
    end
end


%密勒码
miler_code = [];
flag = 1;
count_0 = 0;%存储连0的个数
for i=1:length(code)
    if code(i) == 1
        count_0 = 0;%清空连0个数
        miler_code = [miler_code -1*flag*ones(1,50) flag*ones(1,50)]
        if flag == 1
            flag = -1;
        else
            flag = 1;
        end
    else  %等于0
        count_0 = count_0+1;
        if(count_0 < 2)%不连零的情况
            miler_code = [miler_code -flag*ones(1,100)]
        else%连零
            miler_code = [miler_code flag*ones(1,100)]
            flag = -flag;
        end
    end
end
            

%传号反转码
%1交替的用00和11表示,0固定用01表示
CMI=[];
flag = 1; % 初始极性为正
for i = 1:length(code)
    if code(i) == 1
        CMI = [CMI ones(1, 100)*flag];
       if flag==1
           flag=-1;
       else
           flag=1;
       end
    else
        CMI = [CMI ones(1, 50)*-1 ones(1, 50)]; % 0:交替极性
    end
end

figure(1)
subplot(9,1,1)
plot(t, NRZ, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -0.5 1.5])
title('单极性非归零码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,2)
plot(t, polar_NRZ, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1.5 1.5])
title('双极性非归零码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,3)
plot(t, RZ, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -0.5 1.5])
title('单极性归零码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,4)
plot(t, polar_RZ, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1.5 1.5])
title('双极性归零码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,5)
plot(t, NRZ_M, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -0.5 1.5])
title('传号差分码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,6)
plot(t, NRZ_S, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('空号差分码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,7)
plot(t, manchester_code, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('数字双相码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,8)
plot(t, miler_code, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('密勒码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,9)
plot(t, CMI, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('传号反转码')
xlabel('时间')
ylabel('幅度')
grid on;

具体实现:

matlab实现二元密勒码,信号处理,matlab文章来源地址https://www.toymoban.com/news/detail-762490.html

到了这里,关于matlab实现二元码编码(单极性非归零码、双极性非归零码,单极性归零码、双极性归零码、传号差分码、空号差分码、数字双相码、密勒码、传号反转码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • BCH编码与译码(MATLAB实现)

    BCH码是由Bose、Chandhari 和 Hocquenhem 分别独立提出的一种能够纠正多个随机错误的循环码。 BCH 码的定义:给定任一有限域 GF(q)及其扩域 GF(q m )(其中 q 为素数或素数幂),m 为某一正整数,若码元取自 GF(q) 循环码的生成多项式 g(x) 的根集合 R 中有 σ-1 个连续根 α m0 , α m0+1 ,

    2024年01月20日
    浏览(41)
  • 遗传算法的编码方式以及MATLAB实现

    遗传算法原理以及matlab代码_matlab遗传算法代码_电气不会转控制的博客-CSDN博客 目录 前言 一、编码是什么? 二、二进制编码 1.整数区间 2.实数区间 3.多变量 4.运算操作(交叉,变异) 三、实数编码 1.实数编码的交叉操作 2.实数编码的变异操作  四、MATLAB代码实现 总结 提示

    2024年02月04日
    浏览(40)
  • 如和使用matlab实现香农编码和解码

    在网上看了好多 , 都是对香农进行编码的案例 , 却没有 进行解码的操作 , 今天就来补齐这个欠缺 定义一个字符串类型的变量text,其值为’你好’。 调用函数shannonCoding对文本信息进行编码,并将编码、解码、平均码长和编码效率作为四个返回值保存到变量encoded, decoded, avgC

    2024年02月08日
    浏览(43)
  • 线性分组码编码与译码(MATLAB实现)

    分组码是对信息序列分段编码。若对包含 k 个信息元的信息组 M : 按照一定的编码规则产生包括 n 个码元的码组 C : 编码规则定义为: 如果 f i (·),i = 0,1,…,n-1 均为线性函数,则称 C 为线性分组码。线性分组码一般用 (n,k,d)码表示,其中 n 为码长, k 为信息组长度,

    2024年01月15日
    浏览(30)
  • 利用是stm32cubemx实现双极性spwm调制 基于stm32f407vet6

    【双极性SPWM调制讲解以及基于stm32的代码生成-哔哩哔哩】 https://b23.tv/ytFxdkL 双极性spwm调制虽然没有单极性好用,但比单极性要简单易懂一些,以下教程是如何利用stm32实现双极性spwm调制.   •T1,T2不能同时导通,T3,T4也不能同时导通,否则短路烧管子。 •解决方法:T1与T2用高

    2024年02月15日
    浏览(47)
  • 【C语言】51单片机四线双极性步进电机启动、停机、正反转、加减速(中断实现)数码管显示速度

      一、设计目标     设计程序实现按键控制步进电机启动、停机、正反转、加减速、转速及转向显示。 二、主要功能     功能1:步进电机的启动、重启、停机;     功能2:步进电机正反装;     功能3:静态数码管显示速度等级;     功能4:步进电机的加减速; 三、硬

    2024年02月01日
    浏览(40)
  • 【附报告及视频】51单片机四线双极性步进电机启动、停机、正反转、加减速(中断实现)数码管显示速度

      一、设计目标     设计程序实现按键控制步进电机启动、停机、正反转、加减速、转速及转向显示。 二、主要功能     功能1:步进电机的启动、重启、停机;     功能2:步进电机正反装;     功能3:静态数码管显示速度等级;     功能4:步进电机的加减速; 三、硬

    2024年02月10日
    浏览(39)
  • 差分码、相对码、绝对码、空号差分码、传号差分码

    差分码元利用的是相邻码元波形(或电平)是否跳变来传递信息,与码元本身电平或极性无关 差分码=相对码 单极性或双极性码称为绝对码; 单比特码元的差分编码通常就是相对码与绝对码之间的转换 如:给定相对码初始码元为1(绝对码是1,相对码就变化,否则就不变)(

    2024年02月11日
    浏览(31)
  • Fil真的要归零了吗?

    最近听见有人说有fil的内部消息,意思就是fil要清零了,关于这个消息今天就大家好好聊一聊fil到底会不会归零。 首先市场上面没有这种确定性的说法,一定会到多少多少,我也不知道你们是从哪里听来的消息,如果这个市场有确定性,那你在得到这个内部消息之后,完全可

    2024年02月13日
    浏览(60)
  • matlab编码乱码

    最近需要转战matlab,使用别人之前的demo注释比较多,使用matlab打开之后乱码,这是编码方式选择的问题。 先在matlab命令行使用slCharacterEncoding命令,检查自己目前的编码方式,我的是GBK; 然后找到lcdata_utf8.xml文件,该文件和matlab.exe在同一级目录下; 注释掉 在UTF-8如下第二行

    2024年04月28日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包