利用MATLAB设计一个(2,1,7)卷积码编译码器

1、条件:

输入数字信号,可以随机产生,也可手动输入

2、要求:    

(1)能显示编码树、网格图或状态转移图三者之一;

(2)根据输入数字信号编码生成卷积码并显示;

(3)在信号传输加引入误码;

(4)在纠错范围内能进行纠错译码并显示比较。

 

编码原理

将卷积码记作(n,k,N)。一般来说,卷积码的k和n是比较小的整数。

  • 码率仍定义为k/n。
  • 卷积码是一种非分组码(分组码经过编码生成的码组可以分为信息位和校验位,卷积码编码生成的码整体看作校验码或者说监督码)。另外,分组码的k和n均代表码元个数,每个码元可能有m个比特的信息;而卷积码的n和k均指比特(分组码可以看作帧/矢量编码,卷积码可以看作数据流编码)。
  • 卷积码是将k个比特的信息段编成n个比特的码组,其编码生成的监督码元不止和k个比特的信息段有关,还和前面的m=(N-1)个信息段有关。可知,一个监督码元同时和前m个比特以及当前输入的一个比特信息有关,即监督着N=m+1个比特,我们将N成为约束度,所有监督码元的长度nN称为约束长度。

综上,k即为卷积码的输入路数(多路输入要进行串并转换),n为输出比特个数,m为移位寄存器的位数(用于保存所需的前几个比特),N=m+1。

 

译码原理

将卷积码记作(n,k,N)。一般来说,卷积码的k和n是比较小的整数。u

  • 码率仍定义为k/n。
  • 卷积码是一种非分组码(分组码经过编码生成的码组可以分为信息位和校验位,卷积码编码生成的码整体看作校验码或者说监督码)。另外,分组码的k和n均代表码元个数,每个码元可能有m个比特的信息;而卷积码的n和k均指比特(分组码可以看作帧/矢量编码,卷积码可以看作数据流编码)。
  • 卷积码是将k个比特的信息段编成n个比特的码组,其编码生成的监督码元不止和k个比特的信息段有关,还和前面的m=(N-1)个信息段有关。可知,一个监督码元同时和前m个比特以及当前输入的一个比特信息有关,即监督着N=m+1个比特,我们将N成为约束度,所有监督码元的长度nN称为约束长度。

综上,k即为卷积码的输入路数(多路输入要进行串并转换),n为输出比特个数,m为移位寄存器的位数(用于保存所需的前几个比特),N=m+1。

设计方案 

PPT图源:刘银杰

 

运行结果

图源:刘银杰

 

图源:刘银杰
转移图
误码纠错

完整代码 

%王科文/姚双/刘银杰/杨昊  重庆工商大学
function main3
% LabName:             卷积编解码实验
% Task:                生成数据长度为10的比特数据源
%                       约束长度为7,生成多项式进行1/2卷积编码
%                       解码可用Matlab自带函数vitdec进行译码
%                       统计译码比特和数据源的误码数
close all
% 创建主窗口
fig = figure('Name', '卷积编解码实验', 'NumberTitle', 'off', 'Position', [50, 380, 700, 400]);
% 设置采样率和码元速率
fs = 30720000; % 采样率
Rb = 153600;   % 码元速率

% 生成数据源
dataBit = [];
code_data_s = [];
decode_data_s = [];
errorNum = [];
zhuangtai=[];
% 创建按钮和文本框
uicontrol("Style",'text','Position',[10,350,330,30],'String','①(指定错误)输入引入错误的位置','FontSize',14)
uicontrol("Style",'text','Position',[340,350,330,30],'String','②(随机错误)输入随机错误的个数','FontSize',14)
uicontrol("Style",'text','Position',[230,260,200,30],'String','随机10位数据源显示:','FontSize',14)
uicontrol("Style",'text','Position',[230,200,200,30],'String','手动10位数据源输入:','FontSize',14)
uicontrol("Style",'text','Position',[230,140,200,30],'String','10位卷积码译码显示:','FontSize',14)
uicontrol("Style",'text','Position',[20,50,180,30],'String','对应32位编码显示:','FontSize',14)
uicontrol("Style",'text','Position',[230,90,200,30],'String','纠错位置显示:','FontSize',14)
%dataBit11=uicontrol('Style', 'edit', 'String', '', 'Position', [400, 160, 200, 30]);%随机显示文本框
d=uicontrol('Style', 'edit', 'String', '', 'Position', [450, 140, 200, 30]);
e=uicontrol('Style', 'edit', 'String', '', 'Position', [450, 90, 200, 30]);
a=uicontrol('Style', 'edit', 'String', '', 'Position', [450, 200, 200, 90], 'Callback', @(src, event) updateManualInput(src, event));%手动输入文本框
b=uicontrol('Style', 'edit', 'String', '2(输入格式)', 'Position', [400, 320, 200, 30],'Callback', @(src, event) updateManualInput2(src, event));%输入错误个数文本框
c=uicontrol('Style', 'edit', 'String', '1 2 5(输入格式·)', 'Position', [60, 320, 200, 30],'Callback',@(src, event) updateManualInput1(src, event));%输入错误位置文本框
code=uicontrol('Style', 'edit', 'String', '', 'Position', [200, 50, 450, 30]);%编码显示文本框
uicontrol('Style', 'pushbutton', 'String', '随机生成数据源', 'Position', [60, 260, 150, 30], 'Callback', @(src, event) generateRandomData(src, event,a,d,e, code,fs, Rb));
uicontrol('Style', 'pushbutton', 'String', '手动输入数据源', 'Position', [60, 200, 150, 30], 'Callback', @(src, event) manualInputData(src, event,d,e,code, fs, Rb));
uicontrol('Style', 'pushbutton', 'String', '本(2,1,7)卷积码状态转移显示', 'Position', [400, 10, 200, 30], 'Callback', @(src, event) bianma());
set(fig,'UserData',struct('a',a,'b',b,'c',c));

function bianma()
    figure('Name', '卷积编码规则', 'NumberTitle', 'off', 'Position', [750, 100, 800, 580]);
    A1=[0.05,0.7];
    B1=[0.95,0.7];
    annotation("arrow",[A1(1),B1(1)],[A1(2),B1(2)]);
    zhuangtai1=uicontrol('Style', 'edit', 'String', '', 'Position', [180, 515, 200, 35],'Callback', @(src, event) updateManualInput3(src, event));
    uicontrol("Style",'text','Position',[25,350,700,30],'String','输入位A             M1               M2              M3               M4                M5               M6','FontSize',14)
    uicontrol("Style",'text','Position',[20,220,550,30],'String','(2,1,7)卷积码第一位输出编码(A+M1+M2+M3+M6)(模2加)','FontSize',14)
    uicontrol("Style",'text','Position',[20,160,550,30],'String','(2,1,7)卷积码第二位输出编码(A+M2+M3+M5+M6)(模2加)','FontSize',14)
    uicontrol("Style",'text','Position',[10,100,500,30],'String','寄存器(M1 M2 M3 M4 M5 M6)目前状态为:','FontSize',14)
    uicontrol("Style",'text','Position',[10,40,500,30],'String','寄存器(M1 M2 M3 M4 M5 M6)下一状态为:','FontSize',14)
    shuru=uicontrol('Style', 'edit', 'String', '0', 'Position', [60, 300, 50, 30]);
    M1=uicontrol('Style', 'edit', 'String', '0', 'Position', [160, 300, 50, 30]);
    M2=uicontrol('Style', 'edit', 'String', '0', 'Position', [260, 300, 50, 30]);
    M3=uicontrol('Style', 'edit', 'String', '0', 'Position', [360, 300, 50, 30]);
    M4=uicontrol('Style', 'edit', 'String', '0', 'Position', [460, 300, 50, 30]);
    M5=uicontrol('Style', 'edit', 'String', '0', 'Position', [560, 300, 50, 30]);
    M6=uicontrol('Style', 'edit', 'String', '0', 'Position', [660, 300, 50, 30]);
    now1=uicontrol('Style', 'edit', 'String', '0', 'Position', [450, 100, 200, 30]);
    next1=uicontrol('Style', 'edit', 'String', '0', 'Position', [450, 40, 200, 30]);
    bianma1=uicontrol('Style', 'edit', 'String', '', 'Position', [600, 220, 50, 40]);
    bianma2=uicontrol('Style', 'edit', 'String', '', 'Position', [600, 160, 50, 40]);
    uicontrol('Style', 'pushbutton', 'String', '填入状态', 'Position', [50, 515, 100, 35], 'Callback', {@subButtonCallback, zhuangtai1,shuru, ...
                                                                                     M1,M2,M3,M4,M5,M6,now1,bianma1,bianma2,next1});
    uicontrol('Style', 'pushbutton', 'String', '输入1', 'Position', [50, 450, 100, 30], 'Callback', {@shu1, shuru,M1,M2,M3,M4,M5,M6,now1,bianma1,bianma2,next1})
    uicontrol('Style', 'pushbutton', 'String', '输入0', 'Position', [210, 450, 100, 30], 'Callback', {@shu0, shuru,M1,M2,M3,M4,M5,M6,now1,bianma1,bianma2,next1})
end
function shu1(~,~,shuru,M1,M2,M3,M4,M5,M6,now1,bianma1,bianma2,next1)
    M61=get(M5,'String');
    M51=get(M4,'String');
    M41=get(M3,'String');
    M31=get(M2,'String');
    M21=get(M1,'String');
    M11=get(shuru,'String');
    now=[M11,M21,M31 ,M41,M51,M61];
    set(now1,'String',now)
    set(shuru,'String',num2str(1))
    set(M1,'String',num2str(M11))
    set(M2,'String',num2str(M21))
    set(M3,'String',num2str(M31))
    set(M4,'String',num2str(M41))
    set(M5,'String',num2str(M51))
    set(M6,'String',num2str(M61))
    f1=xor(1,xor(str2num(M11),xor(str2num(M21),xor(str2num(M31),str2num(M61)))));
    f2=xor(1,xor(str2num(M21),xor(str2num(M31),xor(str2num(M51),str2num(M61)))));
    set(bianma1,'String',num2str(f1))
    set(bianma2,'String',num2str(f2))
    M611=get(M5,'String');
    M511=get(M4,'String');
    M411=get(M3,'String');
    M311=get(M2,'String');
    M211=get(M1,'String');
    M111=get(shuru,'String');
    next=[M111,M211,M311 ,M411,M511,M611];
    set(next1,'String',next)
end
function shu0(~,~,shuru,M1,M2,M3,M4,M5,M6,now1,bianma1,bianma2,next1)
    M61=get(M5,'String');
    M51=get(M4,'String');
    M41=get(M3,'String');
    M31=get(M2,'String');
    M21=get(M1,'String');
    M11=get(shuru,'String');
    now=[M11,M21,M31 ,M41,M51,M61];
    set(now1,'String',now)
    set(shuru,'String',num2str(0))
    set(M1,'String',num2str(M11))
    set(M2,'String',num2str(M21))
    set(M3,'String',num2str(M31))
    set(M4,'String',num2str(M41))
    set(M5,'String',num2str(M51))
    set(M6,'String',num2str(M61))
    f1=xor(0,xor(str2num(M11),xor(str2num(M21),xor(str2num(M31),str2num(M61)))));
    f2=xor(0,xor(str2num(M21),xor(str2num(M31),xor(str2num(M51),str2num(M61)))));
    set(bianma1,'String',num2str(f1))
    set(bianma2,'String',num2str(f2))
    M611=get(M5,'String');
    M511=get(M4,'String');
    M411=get(M3,'String');
    M311=get(M2,'String');
    M211=get(M1,'String');
    M111=get(shuru,'String');
    next=[M111,M211,M311,M411,M511,M611];
    set(next1,'String',next)
end
function subButtonCallback(~, ~, zhuangtai1,shuru,M1,M2,M3,M4,M5,M6,now1,bianma1,bianma2,next1)
    % 读取子窗口文本框的内容
    zhuangtai=get(zhuangtai1,'String');
    f1=xor(str2num(zhuangtai(1)),xor(str2num(zhuangtai(3)),xor(str2num(zhuangtai(5)),xor(str2num(zhuangtai(7)),str2num(zhuangtai(13))))));
    f2=xor(str2num(zhuangtai(1)),xor(str2num(zhuangtai(5)),xor(str2num(zhuangtai(7)),xor(str2num(zhuangtai(11)),str2num(zhuangtai(13))))));
    set(bianma1,'String',num2str(f1))
    set(bianma2,'String',num2str(f2))
    % 将内容填充到另一个文本框中
    set(shuru,'String',num2str(zhuangtai(1)))
    set(M1,'String',num2str(zhuangtai(3)))
    set(M2,'String',num2str(zhuangtai(5)))
    set(M3,'String',num2str(zhuangtai(7)))
    set(M4,'String',num2str(zhuangtai(9)))
    set(M5,'String',num2str(zhuangtai(11)))
    set(M6,'String',num2str(zhuangtai(13)))
    now=[zhuangtai(3),zhuangtai(5),zhuangtai(7),zhuangtai(9),zhuangtai(11),zhuangtai(13)];
    set(now1,'String',now)
    next=[zhuangtai(1),zhuangtai(3),zhuangtai(5),zhuangtai(7),zhuangtai(9),zhuangtai(11)];
    set(next1,'String',next)
end
% 回调函数:随机生成数据源、编码和解码
function generateRandomData(~, ~,a,d,e,code,fs, Rb)
    data=get(gcf,'UserData');
    inputString1 = get(data.b, 'String');
    errors=str2num(inputString1);
    inputString2 = get(data.c, 'String');
    errors11=str2num(inputString2);
    len_in = 10; % 数据源长度
    dataBit = randi([0,1], 1, len_in);
    set(a,'String',num2str(dataBit))
    processData(dataBit,code,d,e,errors,errors11,fs, Rb);
end
% 回调函数:手动输入数据源
function manualInputData(~, ~,d,e, code,fs, Rb)
    data=get(gcf,'UserData');
    inputString = get(data.a, 'String');
    dataBit = str2num(inputString);
    if isempty(dataBit) || ~all(ismember(dataBit, [0, 1]))||length(inputString)~=19
        % 非法输入,清空文本框
        msgbox('请输入有效的10位二进制数据(0和1),每个数据用一个空格隔开', '错误', 'error');
    end
    inputString1 = get(data.b, 'String');
    errors=str2num(inputString1); %#ok<*ST2NM> 
    inputString2 = get(data.c, 'String');
    errors11=str2num(inputString2);
    processData(dataBit, code,d,e,errors,errors11,fs, Rb);
end
% 更新手动输入文本框数据源
function updateManualInput(src, ~)
    inputString = get(src, 'String');
    inputArray = str2num(inputString);
    if isempty(inputArray) || ~all(ismember(inputArray, [0, 1]))||length(inputString)~=19
        % 非法输入,清空文本框
        set(src, 'String', '');
    end
end
%引入错误位置
function updateManualInput1(src, ~)
    inputString = get(src, 'String');
    inputArray = str2num(inputString);
    shun=0:32;
    if ~all(ismember(inputArray, shun))
        % 非法输入,清空文本框
        msgbox('请输入元素为0到32的数组,每个数据用一个空格隔开', '错误', 'error');
        set(src, 'String', '');
    end
end
%输入错误个数
function updateManualInput2(src, ~)
    inputString = get(src, 'String');
    inputArray = str2num(inputString);
    shun=0:32;
    if ~all(ismember(inputArray, shun))||length(inputArray)~=1
        % 非法输入,清空文本框
        msgbox('请输入一个0到32的数', '错误', 'error');
        set(src, 'String', '');
    end
end
% 处理数据
function updateManualInput3(src, ~)
    inputString = get(src, 'String');
    inputArray = str2num(inputString);
   if isempty(inputArray) || ~all(ismember(inputArray, [0, 1]))||length(inputString)~=13
        % 非法输入,清空文本框
        msgbox('请输入有效的7位二进制数据(0和1),每个数据用一个空格隔开', '错误', 'error');
        set(src, 'String', '');
   end
end
function processData(dataBit, code,d,e,errors,errors11,fs, Rb)
    K = 7; % 约束度
    CodeGenerator = [171, 133]; % 171 为8进制,对应为1 1 1 1 0 0 1 ,133为1 0 1 1 0 1 1
    
    len_in = length(dataBit);
    len_out = (len_in + K - 1) * 2;
    sample_num = fs / Rb; % 1个码元采样点数
    N = len_in * sample_num; % 总样点数

    dt = 1 / fs;
    t = 0:dt:(N - 1) * dt;
    N1 = len_out * sample_num;
    t1 = 0:dt:(N1 - 1) * dt;

    % 数据源进行卷积编码
    reg = zeros(1, 6);
    sourceBit = [dataBit, zeros(1, 6)];% 加6个尾比特
    len = length(sourceBit);
    first = zeros(1, len);
    second = zeros(1, len);
    code_data = zeros(1, 2 * len); %#ok<*PREALL> 
    for n = 1:len
        first(n) = xor(xor(xor(xor(sourceBit(n), reg(1)), reg(2)), reg(3)), reg(6));
        second(n) = xor(xor(xor(xor(sourceBit(n), reg(2)), reg(3)), reg(5)), reg(6));
        reg(6) = reg(5);
        reg(5) = reg(4);
        reg(4) = reg(3);
        reg(3) = reg(2);
        reg(2) = reg(1);
        reg(1) = sourceBit(n);
        code_data1(1, (n - 1) * 2 + 1 : 2 * n) = [first(n), second(n)];
    end
    code_data1(1,(n-1)*2+1:2*n)=[first(n),second(n)];
    set(code,'String',num2str(code_data1))
    code_data=code_data1;
    if errors~=0
        errors1=randperm(32);
        worrys=[];
        for n=1:errors
            worry=errors1(n);
            worrys(n)=worry;
            code_data1(1,worry)=~code_data1(1,worry);
        end
    else
        worrys=[];
        for n=1:length(errors11)
            worry=errors11(n);
            worrys(n)=worry;
            code_data1(1,worry)=~code_data1(1,worry);
        end
    end
    Tch_co_data=code_data1;
    
    %% 卷积解码
    len1=length(Tch_co_data);
    trellis = poly2trellis(K, CodeGenerator);
    decode_data = vitdec(Tch_co_data, trellis, len1/2,'trunc','hard');%维特比译码
    decodeBit=decode_data(1,1:length(decode_data)-6);
    set(d,'String',num2str(decodeBit))
    %% 统计误码数
    errorNum=sum(xor(dataBit,decodeBit));
    i=1;
    box=[];
    if errorNum==0
        for n=1:32
            different=xor(code_data(1,n),code_data1(1,n));
            if different==1
                box(i)=n;
                i=i+1;
            end
        end
        if length(box)~=0
            msgbox(['检查出第',num2str(box),'位出现错误,并成功纠错']);
            set(e,'String',num2str(box))
        else
            set(e,'String','未引入错误')
        end
    else
        msgbox('纠错失败,可能是错误位数过多或出错位置过于密集,请重试','警告')
        set(e,'String','纠错失败')
    end
    
    %% 过采样
     source_data_s=zeros(1,len_in*sample_num);
     code_data_s=zeros(1,len_out*sample_num);
     code_data_s1=zeros(1,len_out*sample_num);
     decode_data_s=zeros(1,len_in*sample_num);
     for n=1:len_in
          source_data_s(1,(n-1)*sample_num+1:n*sample_num)=dataBit(1,n);
          decode_data_s(1,(n-1)*sample_num+1:n*sample_num)=decodeBit(1,n);
     end
     for n=1:len_out
          code_data_s(1,(n-1)*sample_num+1:n*sample_num)=code_data(1,n);%正常编码
          code_data_s1(1,(n-1)*sample_num+1:n*sample_num)=code_data1(1,n);%错误编码
     end
    
    %% 打印波形
    figure("Name",'2','NumberTitle', 'off', 'Position', [50, 40, 700, 350])
    subplot(411)
    plot(t,source_data_s);
    xlabel('时间(s)');ylabel('幅值(v)');ylim([-1,2]);
    title('数据源')
    subplot(412)
    plot(t1,code_data_s);
    xlabel('时间(s)');ylabel('幅值(v)');ylim([-0.2,1.2]);
    title('卷积码编码后数据')
    subplot(413)
    plot(t1,code_data_s1);
    xlabel('时间(s)');ylabel('幅值(v)');ylim([-0.2,1.2]);
    title('卷积码编码出错数据')
    subplot(414)
    plot(t,decode_data_s);
    xlabel('时间(s)');ylabel('幅值(v)');ylim([-1,2]);
    title('卷积码解码数据')
end
end

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/271409.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何进行块存储管理

目录 块存储概念 块存储&#xff08;云盘&#xff09;扩容 方式一&#xff1a;直接扩容现有云盘 方式二&#xff1a;创建一块新数据盘 方式三&#xff1a;在更换操作系统时&#xff0c;同时更换系统盘 块存储&#xff08;云盘&#xff09;变配 云盘变配操作步骤 块存储概…

索引进阶 | 再谈 MySQL 的慢 SQL 优化

索引可以提高数据检索的效率&#xff0c;降低数据库的IO成本。 MySQL在300万条记录左右性能开始逐渐下降&#xff0c;虽然官方文档说500~800w记录&#xff0c;所以大数据量建立索引是非常有必要的。 MySQL提供了Explain&#xff0c;用于显示SQL执行的详细信息&#xff0c;可以…

质量免费吗?

本文首发于个人网站「BY林子」&#xff0c;转载请参考版权声明。 两个场景 场景一&#xff1a;有限经费与质量改进 “要写自动化的单元测试、E2E测试&#xff0c;就会需要更多的钱&#xff0c;可是我们经费有限暂时做不了。” “CI上配置SonarQube扫描&#xff0c;对于扫描出来…

godot 报错Unable to initialize Vulkan video driver解决

版本 godot 4.2.1 现象 godot4.2.1 默认使用vulkan驱动&#xff0c;如果再不支持vulkan驱动的主机上&#xff0c;进入引擎编辑器将报错如下 解决 启动参数添加 –rendering-driver opengl3 即可进入引擎编辑器 此时运行项目仍然会报错无法初始化驱动 在项目设置中配置编…

Vue-Pinina基本教程

前言 官网地址&#xff1a;Pinia | The intuitive store for Vue.js (vuejs.org) 看以下内容&#xff0c;需要有vuex的基础&#xff0c;下面很多概念会直接省略&#xff0c;比如state、actions、getters用处含义等 1、什么是Pinina Pinia 是 Vue 的存储库&#xff0c;它允许您跨…

储能:东风已至,破浪在即——安科瑞 顾烊宇

今年的各省政府工作报告已经陆续发布&#xff0c;新能源是各省能源工作的重点&#xff0c;从目前31个省&#xff08;区、市&#xff09;相继公布的2022年经济增长数据来看&#xff0c;一些提前布局新能源产业的省市纷纷交出不错的成绩单&#xff0c;新能源成为当地GDP增速的重要…

饥荒Mod 开发(二三):显示物品栏详细信息

饥荒Mod 开发(二二)&#xff1a;显示物品信息 源码 前一篇介绍了如何获取 鼠标悬浮物品的信息&#xff0c;这一片介绍如何获取 物品栏的详细信息。 拦截 inventorybar 和 itemtile等设置字符串方法 在modmain.lua 文件中放入下面代码即可实现鼠标悬浮到 物品栏显示物品详细信…

微信小程序云开发-下载云存储中的文件

一、前言 很多时候我们需要实现用户在客户端下载服务端的文件&#xff08;图片、视频、pdf等&#xff09;到用户本地并保存起来&#xff0c;小程序也经常需要实现这样的需求。 在传统服务器开发下网上已经有很多关于小程序下载服务端文件的资料了&#xff0c;但是基于云开发的…

苹果怎么备份QQ的聊天记录?这3招教你快速备份!

QQ聊天记录是我们与好友之间的重要互动和沟通记录。但是&#xff0c;有时可能会由于各种原因&#xff0c;比如系统崩溃、更换手机、自身误操作、QQ闪退等&#xff0c;可能会导致聊天记录丢失。 因此&#xff0c;备份QQ聊天记录显得尤为重要。那么&#xff0c;苹果手机怎么备份…

SAP CO系统配置-与PS集成相关配置(机器人制造项目实例)

维护分配结构 配置路径 IMG菜单路径:控制>内部订单>实际过帐>结算>维护分配结构 事务代码 OKO6 维护结算参数文件 定义利润分析码

ZED-Mini 标定完全指南(应该是最详细的吧)

标定 ZED-Mini 相机主要为了跑 VINS-Fusion 以及后期的联合标定相关事宜 双目相机标定 出厂标定数据 关于ZED相机的内参&#xff0c;使用出厂标定的数据就好了&#xff0c;如果安装ZED的SDK时使用的是默认的安装路径&#xff0c;可以在/usr/local/zed/settings下面找到一个SN…

漏洞处理-未设置X-Frame-Options

漏洞名称&#xff1a;iFrame注入 风险描述&#xff1a;系统未设置x-frame-options头 风险等级&#xff1a;低 整改建议&#xff1a;为系统添加x-frame-options头 知识 X-Frame-Options 响应头 X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在 <fram…

通过 Bytebase API 做数据库 Schema 变更

Bytebase 是一款数据库 DevOps 和 CI/CD 工具&#xff0c;适用于开发人员、DBA 和平台工程团队。 它提供了一个直观的图形用户界面来管理数据库 Schema 变更。另一方面&#xff0c;一些团队可能希望将 Bytebase 集成到现有的内部 DevOps 研发平台中。这需要调用 Bytebase API。…

搭建Nginx文件下载站点

一、下载Nginx 首先&#xff0c;确保你的服务器上已经安装了Nginx&#xff0c;使用编译安装&#xff0c;下载最新版Nginx。 wget https://nginx.org/download/nginx-1.25.3.tar.gz tar -xf nginx-1.25.3.tar.gz二、安装Fancyindex和Nginx-Fancyindex-Theme模块 # 下载Fancyin…

外贸中的很多跟想的不一样的事情

说说最近遇到的几个客户情况&#xff0c;以及对一些事情刷新的认知。 第一个客户姑且称为A吧&#xff0c;这个客户在询价的时候&#xff0c;产品的名称以及数量以还有走货的方式写的很清楚&#xff0c;客户A要的产品不是很多&#xff0c; 顶多算是个样品单。 一般情况下&…

腾讯云2核4G服务器CVM标准型S5实例5年优惠价格表

腾讯云服务器续费贵所以一次性买3年或5年&#xff0c;腾讯云轻量应用服务器3年价格有优惠&#xff0c;CVM云服务器5年有特价&#xff0c;腾讯云3年轻量和5年云服务器CVM优惠活动入口&#xff0c;3年轻量应用服务器配置可选2核2G4M和2核4G5M带宽&#xff0c;5年CVM云服务器可以选…

学习笔记11——Spring的XML配置

学习笔记系列开头惯例发布一些寻亲消息 链接&#xff1a;https://www.baobeihuijia.com/bbhj/contents/3/192584.html SSM框架——IOC基础【BeanSetter注入加载xml】 框架总览 Spring Framework 谈谈我对Spring的理解 - 知乎 (zhihu.com)java - 【架构视角】一篇文章带你彻底…

2023年12月25日学习总结——MLP

&#x1f4a1;我准备每一天都写一个学习总结&#xff0c;周末再把每日的学习总结汇总成专门的文章 &#x1f506;我的学习总结主要是为了自己的个人学习&#xff0c;没有商业用途&#xff0c;侵删 okkk开始今日学习 目录 1、今日计划学习内容2、今日学习内容深入学习MLP&#…

AI赋能金融创新:ChatGPT引领量化交易新时代

文章目录 一、引言二、ChatGPT与量化交易的融合三、实践应用&#xff1a;ChatGPT在量化交易中的成功案例四、挑战与前景五、结论《AI时代Python量化交易实战&#xff1a;ChatGPT让量化交易插上翅膀》&#x1f4da;→ [当当](http://product.dangdang.com/29658180.html) | [京东…

Android/iOS APP备案流程指南

Android/iOS APP备案流程指南 摘要 本文通过详细介绍了工信部对移动互联网应用程序&#xff08;APP&#xff09;备案的要求&#xff0c;解释了APP备案的定义、时间节点、办理流程以及腾讯云、阿里云的备案流程&#xff0c;最后提供了常见问题的解答。 引言 随着移动互联网的…