【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-Turbo编码原理

news2024/11/18 0:24:47

目录

Turbo码:无线通信中的革命性技术

引言

一、Turbo码的基本原理

1.1 卷积码基础:

1.2 Turbo码的构造:

1.2.1 分量编码器

1.2.2 随机交织器

1.2.3 穿刺和复接单元

1.3 编码器结构的重要性和影响

1.4 迭代解码:

1.4.1 迭代思想

1.4.2 BCJR算法流程

二、Turbo码的应用场景

2.1 无线通信

2.2 卫星通信

2.3 深空通信

三、Turbo码的优缺点分析

3.1 优点:

3.2 缺点:

四、Turbo码与其他译码技术的比较

4.1 性能比较

4.2 复杂度和实现难度比较

4.3 应用场景比较

五 Matlab实现

结语


Turbo码:无线通信中的革命性技术

引言

Turbo码是一种在通信领域具有里程碑意义的纠错编码技术,以其优异的性能在现代无线通信中占据了重要地位。本文将介绍Turbo码的基本原理、应用场景、优缺点分析,并与其他译码技术进行比较,旨在帮助读者更好地理解Turbo码及其在通信技术中的作用。

一、Turbo码的基本原理

1.1 卷积码基础

首先回顾卷积码的基本概念和工作原理,作为Turbo码的基础。

【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-卷积码原理

【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-Viterbi译码原理

1.2 Turbo码的构造

Turbo码的译码器有两个分量码译码器,译码在两个分量译码器之间进行迭代译码,因整个译码过程类似涡轮turbo工作,共称为Turbo码。

Turbo码编码器结构如下图所示:

图一、Turbo码编码器结构框图

Turbo码的核心在于其编码器结构,这种结构由两个或多个分量编码器(卷积编码器)并行组合而成。每个分量编码器都是传统的卷积码编码器,能够独立地对输入数据进行编码,生成具有一定冗余度的编码数据。

1.2.1 分量编码器

在Turbo码中,原始数据先经过一个卷积编码器(通常称为分量编码器1),然后再经过一个随机交织器进行数据的重新排列。这个交织后的数据再进入第二个卷积编码器(分量编码器2)进行编码。通过这样的方式,原始数据被两次编码,每次编码都增加了不同的冗余信息。

通过并行组合,Turbo码能够在不同的时间和频率上提供冗余,使得在传输过程中即使某一部分数据丢失或受到干扰,也能通过解码过程中的迭代算法来恢复这部分数据。这种冗余的增加显著提高了Turbo码的纠错能力。

1.2.2 随机交织器

随机交织器是Turbo码中的另一个关键组件,它在编码过程中起着至关重要的作用。

交织器的定义:交织器是一个将原始数据重新排列的装置。它并不改变数据的内容,只是按照某种规则重新排列数据的顺序。

交织器的目的:交织器的目的是使两个卷积编码器之间的数据相互独立。这是因为在实际的通信过程中,数据在传输时可能会受到连续的错误干扰。如果没有交织器,这些连续的错误可能会同时影响两个卷积编码器,导致无法恢复原始数据。而通过交织器的重新排列,连续的错误被分散开,降低了对两个编码器同时产生影响的可能性。

交织器的实现:交织器的实现通常采用一个固定的伪随机序列,这个序列决定了原始数据如何被重新排列。在解码过程中,接收端会使用相同的伪随机序列对接收到的数据进行逆交织,以恢复出原始的数据顺序。

1.2.3 穿刺和复接单元

穿刺单元在Turbo编码中的主要作用是减少编码后的冗余信息,以提高编码效率。由于Turbo码在编码过程中会引入大量的冗余比特,这些冗余比特虽然能够提高解码时的可靠性,但也会占用更多的带宽。穿刺单元的目标就是在保持一定纠错能力的同时,尽可能地减少这些冗余比特。穿刺单元按照一定的模式或算法,从编码后的比特流中选择性地删除一部分比特。这个过程是可控的,即可以通过调整穿刺率来控制保留和删除的比特数量。穿刺率定义为被删除的比特数与原始编码比特数的比例。例如,如果穿刺率为1/2,则意味着每两个编码比特中就有一个被删除。穿刺模式的选择对Turbo码的性能至关重要。一个好的穿刺模式应该能够在减少冗余的同时,保持足够的纠错能力。在实际应用中,通常会通过仿真或实验来确定最佳的穿刺模式。

复接单元的主要作用是将多个编码器的输出合并成一个单一的比特流,以便在信道中传输。在Turbo编码中,由于存在多个并行工作的卷积编码器,它们的输出需要通过复接单元进行合并。
复接单元按照预定的顺序或模式,将不同编码器的输出比特交织在一起。这个过程需要确保每个编码器的输出比特在最终的比特流中都有合适的位置,以便在解码时能够正确地分离和识别。复接单元还需要处理由于穿刺而产生的空位。当某些比特被穿刺单元删除后,复接单元需要相应地调整其余比特的位置,以确保输出的比特流在长度和格式上都是正确的。

1.3 编码器结构的重要性和影响

Turbo码的编码器结构是其卓越性能的关键所在。这种结构通过并行组合和随机交织,实现了强大的纠错能力和对连续错误的抵抗能力。在实际应用中,即使在复杂的通信环境下,如低信噪比、高干扰或高速数据传输等情况下,Turbo码也能保持较高的数据传输可靠性和效率。

1.4 迭代解码

Turbo码的解码过程是其编码过程的一个逆向操作,但这个过程远比编码复杂。解码的核心在于迭代解码算法,其中最著名的就是BCJR算法(Bahl-Cocke-Jelinek-Raviv算法)。这种算法通过迭代的方式,逐步逼近最佳的解码结果。

1.4.1 迭代思想

迭代解码的基本思想是利用软输入软输出(Soft-Input Soft-Output, SISO)解码器进行多次迭代,每次迭代都会更新对每个比特的可靠性估计。在Turbo码的解码过程中,每个分量编码器(卷积编码器)的输出都被视为一个独立的信道,而迭代解码就是在这些信道之间传递和更新信息。

每次迭代,解码器都会根据当前的信息(包括接收到的信号和其他解码器提供的信息)对每个比特做出最佳的判断。然后,这个判断会以概率的形式(即软输出)传递给下一个解码器。下一个解码器会利用这个信息,结合自己的判断,再次更新对每个比特的可靠性估计。这个过程会一直重复,直到达到预设的迭代次数或满足一定的收敛条件。

1.4.2 BCJR算法流程

BCJR算法是Turbo码解码中最常用的算法之一。它是一种最大后验概率(Maximum A Posteriori, MAP)算法,旨在找到最可能的原始信息序列。BCJR算法的基本流程如下:

  1. 初始化:设置迭代次数、初始状态概率等参数。对于每个比特,初始化其前向和后向状态概率。
  2. 前向递归:从时间0开始,逐步计算每个时间点上所有可能状态的前向概率。前向概率表示在给定接收序列的条件下,到达某个状态的概率。
  3. 后向递归:从最后一个时间点开始,逐步计算每个时间点上所有可能状态的后向概率。后向概率表示在给定接收序列和某个状态的条件下,后续序列的概率。
  4. 计算比特概率:结合前向和后向概率,计算每个比特为0或1的概率。这些概率就是软输出,将作为下一次迭代的输入。
  5. 迭代更新:将计算得到的比特概率传递给下一个解码器,并重复步骤2-4。每次迭代后,都会更新对每个比特的可靠性估计。
  6. 判决和输出:达到预设的迭代次数或满足收敛条件后,根据最后的比特概率做出硬判决(即确定每个比特是0还是1),并输出解码结果。

BCJR算法通过充分利用Turbo码的结构特点和迭代解码的思想,实现了优异的纠错性能。然而,它也存在计算复杂度高、实现难度大等问题。因此,在实际应用中,通常会采用一些简化的算法或优化方法来降低复杂度和提高解码效率。

二、Turbo码的应用场景

Turbo码作为一种高效的纠错编码技术,已经在多种通信系统中得到了广泛的应用。以下是对Turbo码在不同通信系统中的应用场景及其具体使用案例的详细解释。

2.1 无线通信

在无线通信系统中,由于信号传输过程中会受到多种干扰和衰减,因此需要采用纠错编码技术来提高通信的可靠性。Turbo码凭借其接近香农限的性能和灵活的编码结构,在无线通信中得到了广泛应用。

使用案例:在第三代移动通信系统(3G)和第四代移动通信系统(4G)中,Turbo码被用作数据传输的纠错编码方案。例如,在WCDMA(宽带码分多址)和LTE(长期演进)等标准中,Turbo码被广泛用于语音、数据和多媒体业务的传输。通过采用Turbo码,这些系统能够在较低的信噪比下实现可靠的通信,从而提高用户体验和数据传输效率。

2.2 卫星通信

卫星通信是一种重要的远程通信方式,但由于信号在传播过程中需要经过大气层和空间衰减,因此通信质量容易受到影响。Turbo码的高编码增益和接近香农限的性能使其成为卫星通信中的理想选择。

使用案例:在卫星数字视频广播(DVB-S2)标准中,Turbo码被用作主要的纠错编码方案。DVB-S2标准是为了满足高清电视和多媒体业务的高数据传输需求而制定的。通过使用Turbo码,DVB-S2能够在有限的带宽和信噪比条件下提供高质量的视频和数据传输服务,使得卫星通信在广播、数据传输和互联网接入等领域得到了广泛应用。

2.3 深空通信

深空通信是指地球与太空中其他天体(如月球、火星等)之间的通信。由于深空通信距离远、信号衰减大,因此需要采用高效的纠错编码技术来保证通信的可靠性。Turbo码以其出色的性能和灵活性,在深空通信中发挥着重要作用。

使用案例:在国际空间站(ISS)与地球之间的通信中,Turbo码被广泛用于数据传输和语音通信。通过采用Turbo码,这些通信能够在极端恶劣的信道条件下实现可靠的传输,从而确保航天员与地面控制中心之间的顺畅沟通以及科学实验数据的准确传输。

除了上述场景外,Turbo码还在许多其他通信系统中得到了应用,如光纤通信、移动通信网络中的中继传输等。随着通信技术的不断发展,Turbo码在未来仍然具有广阔的应用前景和重要的研究价值。

三、Turbo码的优缺点分析

Turbo码是一种高效的纠错编码技术,它在无线通信领域有着广泛的应用。以下是对Turbo码的优缺点进行的详细分析:

3.1 优点

  1. 高编码增益:Turbo码通过采用迭代解码和软输入软输出(SISO)技术,能够在较低的信噪比(SNR)下实现可靠的通信,提供显著的编码增益。这意味着在相同的传输条件下,Turbo码可以比其他编码方案传输更多的信息或者提供更高的通信质量。

  2. 接近香农限的性能:Turbo码的纠错性能非常接近理论上的香农限。香农限是信息论中描述在给定噪声和带宽条件下,可靠通信所能达到的最大信息速率的理论极限。Turbo码的性能逼近这个极限,使得它在许多高要求的应用中成为首选的编码方案。

  3. 灵活的编码结构:Turbo码由多个分量编码器(通常是卷积编码器)和随机交织器组成,这种结构提供了灵活性和可配置性。编码器的参数(如码率、块大小等)可以根据特定的应用需求进行调整。

  4. 适用于多种场景:Turbo码最初是为无线通信设计的,但由于其出色的性能,它也被应用于其他领域,如深空通信、数据存储和光纤通信等。在这些场景中,Turbo码能够提供必要的纠错能力以确保数据的可靠传输。

  5. 与调制技术兼容:Turbo码可以与多种调制技术(如QPSK、QAM等)结合使用,实现高效的数字通信。这种兼容性使得Turbo码在各种通信系统中都有广泛的应用前景。

3.2 缺点

  1. 高解码复杂度:Turbo码的迭代解码过程涉及大量的计算,尤其是在处理长码块时。这增加了接收机的复杂性和功耗,可能不适用于资源受限的设备或需要低延迟的应用。

  2. 解码延迟:由于Turbo码需要迭代解码以达到最佳性能,这通常会导致一定的解码延迟。对于实时性要求较高的应用(如语音通信或实时视频流),这种延迟可能是不可接受的。

  3. 对信道条件敏感:虽然Turbo码在多种信道条件下都能表现出良好的性能,但在某些极端条件下(如深衰落或高干扰环境),其性能可能会受到严重影响。在这些情况下,可能需要采取额外的措施来提高通信的可靠性。

  4. 交织器设计挑战:Turbo码中的随机交织器对于其性能至关重要。设计一个适用于特定应用场景且性能优良的交织器是一个具有挑战性的问题。不当的交织器设计可能会导致性能下降或甚至无法正常工作。

  5. 专利和许可问题:Turbo码作为一项重要的通信技术,可能受到专利和许可的限制。这可能会增加使用Turbo码的成本和复杂性,尤其是在商业应用中。

综上所述,Turbo码以其卓越的纠错性能和接近香农限的表现而著称,在无线通信和其他领域都有广泛的应用。然而,其高解码复杂度、解码延迟以及对特定信道条件的敏感性等问题也需要在实际应用中予以考虑和权衡。

四、Turbo码与其他译码技术的比较

在数字通信系统中,译码技术的选择对系统的整体性能有着至关重要的影响。Turbo码、低密度奇偶校验码(LDPC)和卷积码是三种常见的译码技术,它们各自在不同的应用场景中具有独特的优势和劣势。本报告将对这三种译码技术在性能、复杂度、实现难度和应用场景等方面进行深入的比较分析。

4.1 性能比较

  1. Turbo码:Turbo码以其接近香农限的性能而著称,它通过迭代解码和软输入软输出(SISO)技术实现了高编码增益。在信噪比(SNR)较低的情况下,Turbo码仍能保持可靠的通信质量。

  2. LDPC码:LDPC码是一种具有稀疏校验矩阵的线性分组码,其性能也非常接近香农限。LDPC码通过稀疏的校验矩阵和高效的迭代解码算法实现了优异的纠错性能。与Turbo码相比,LDPC码在长码长和低信噪比条件下具有更好的性能。

  3. 卷积码:卷积码是一种具有记忆性的纠错码,它通过卷积运算将输入信息序列编码为输出序列。与Turbo码和LDPC码相比,卷积码的性能较差,尤其是在高数据传输速率和低信噪比条件下。然而,卷积码具有较低的解码复杂度和延迟,因此在一些对实时性要求较高的应用中仍有使用。

4.2 复杂度和实现难度比较

  1. Turbo码:Turbo码的编码过程相对简单,但解码过程涉及迭代解码和大量的计算,因此具有较高的解码复杂度。此外,Turbo码的性能对交织器的设计非常敏感,设计一个性能优良的交织器是一个具有挑战性的问题。

  2. LDPC码:LDPC码的编码过程需要构建稀疏校验矩阵,这可能需要一定的计算资源和存储空间。然而,LDPC码的解码过程相对简单且高效,尤其是当采用硬件实现时。因此,LDPC码在实现难度和复杂度上相对较为平衡。

  3. 卷积码:卷积码的编码和解码过程都相对简单且易于实现。卷积码的性能虽然不如Turbo码和LDPC码,但其低复杂度和低延迟的特点使得它在一些特定应用中具有优势。

4.3 应用场景比较

  1. Turbo码:Turbo码广泛应用于无线通信系统,如3G、4G和某些5G场景中。由于其出色的纠错性能和灵活性,Turbo码也适用于卫星通信和深空通信等远距离通信场景。

  2. LDPC码:LDPC码在无线通信、数据存储和光纤通信等领域都有广泛的应用。特别是在需要长码长和高数据传输速率的场景中,如高清视频传输和大规模数据存储,LDPC码表现出色。

  3. 卷积码:卷积码主要用于语音通信、实时视频流等对实时性要求较高的应用。此外,在一些资源受限的设备或低复杂度要求的场景中,卷积码也是一个合适的选择。

五 Matlab实现

你是一位Matlab编程专家,任务是编写一段Matlab程序,用于实现Turbo码的编码过程。该程序需要包含必要的输入参数,如输入数据、编码速率等,并能够输出编码后的结果。在编写程序时,请注意保持程序结构的清晰性,添加详尽的注释,以确保程序易于理解和修改。

function encodedBits = turboEncode(inputBits, codeRate)  
    % turboEncode - Turbo码编码函数  
    %  
    % 输入参数:  
    %   - inputBits: 输入数据比特流,应为二进制0和1的向量  
    %   - codeRate: 编码速率,例如1/3, 1/2等  
    %  
    % 输出参数:  
    %   - encodedBits: 编码后的比特流  
  
    % 参数检查  
    if codeRate <= 0 || codeRate >= 1  
        error('Invalid encoding rate. It should be a fraction like 1/3, 1/2, etc.');  
    end  
  
    % 定义分量编码器的生成多项式(以八进制表示)  
    g1 = [1 3 1]; % 对应于 (1+D^2+D^3)  
    g2 = [1 5 1]; % 对应于 (1+D+D^3)  
  
    % 创建分量编码器  
    trellis1 = poly2trellis(g1);  
    trellis2 = poly2trellis(g2);  
  
    % 创建交织器(行列置换交织器)  
    N = length(inputBits);  
    blockSize = ceil(sqrt(N)); % 假设交织块大小接近sqrt(N)  
    interleaver = reshape(1:N, blockSize, [])'; % 行列置换交织矩阵  
    interleavedBits = inputBits(interleaver); % 执行交织  
  
    % 分量编码  
    encodedBits1 = convenc(inputBits, trellis1);  
    encodedBits2 = convenc(interleavedBits, trellis2);  
  
    % 穿刺(删除一些编码比特以达到所需的码率)  
    puncturePattern = [1; 1; 0]; % 简单的穿刺模式,每3个比特删除1个  
    puncturedBits1 = puncture(encodedBits1, puncturePattern);  
    puncturedBits2 = puncture(encodedBits2, puncturePattern);  
  
    % 复接器(将两个分量编码器的输出合并)  
    encodedBits = [puncturedBits1; puncturedBits2];  
  
    % 由于交织和穿刺,最终编码长度可能与输入长度不匹配  
    % 这里简单地对编码后的比特进行截断或填充以达到期望长度  
    expectedLength = ceil(length(inputBits) / codeRate);  
    if length(encodedBits) > expectedLength  
        encodedBits = encodedBits(1:expectedLength);  
    elseif length(encodedBits) < expectedLength  
        encodedBits = [encodedBits; zeros(expectedLength - length(encodedBits), 1)];  
    end  
end  
  
function encodedBits = convenc(inputBits, trellis)  
    % convenc - 卷积编码函数  
    %  
    % 输入参数:  
    %   - inputBits: 输入数据比特流  
    %   - trellis: 卷积码的trellis结构  
    %  
    % 输出参数:  
    %   - encodedBits: 卷积编码后的比特流  
  
    convEncoder = comm.ConvEncoder('TrellisStructure', trellis, ...  
        'TerminationMethod', 'Truncated', 'InitialConditions', 0);  
    encodedBits = step(convEncoder, inputBits);  
end  
  
function puncturedBits = puncture(encodedBits, puncturePattern)  
    % puncture - 穿刺函数  
    %  
    % 输入参数:  
    %   - encodedBits: 编码后的比特流  
    %   - puncturePattern: 穿刺模式,1表示保留,0表示删除  
    %  
    % 输出参数:  
    %   - puncturedBits: 穿刺后的比特流  
  
    N = length(encodedBits);  
    punctureLength = length(puncturePattern);  
    puncturedBits = zeros(ceil(N / sum(puncturePattern)), 1);  
    idx = 1;  
    for i = 1:punctureLength:N  
        for j = 1:punctureLength  
            if puncturePattern(j)  
                puncturedBits(idx) = encodedBits(i + j - 1);  
                idx = idx + 1;  
            end  
        end  
    end  
end

请注意,这个程序是一个简化的Turbo编码示例,它没有考虑一些实际应用中可能需要的特性,如动态调整编码速率、更复杂的交织和穿刺策略、迭代解码等。此外,convencpuncture函数是辅助函数,用于执行卷积编码和穿刺操作。

在实际应用中,你可能需要使用Matlab的Communications Toolbox中的更高级的函数来实现Turbo编码,这些函数提供了更多的配置选项和更高的性能。

使用这个程序之前,请确保你了解Turbo码的基本原理,并根据你的具体需求对程序进行修改和优化。

结语

综上所述,Turbo码、LDPC码和卷积码各有其优势和劣势。Turbo码以接近香农限的性能著称,适用于无线通信和远距离通信等场景;LDPC码在长码长和高数据传输速率条件下表现出色,广泛应用于无线通信、数据存储和光纤通信等领域;而卷积码则以其低复杂度和低延迟的特点在某些特定应用中具有优势。在实际应用中,应根据具体的需求和场景选择合适的译码技术。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HiveQL——不借助任何外表,产生连续数值

注&#xff1a;参考文章&#xff1a; HiveSql一天一个小技巧&#xff1a;如何不借助其他任何外表&#xff0c;产生连续数值_hive生成连续数字-CSDN博客文章浏览阅读1.3k次。0 需求描述输出结果如下所示&#xff1a;12345...1001 问题分析方法一&#xff1a;起始值&#xff08;…

C++模版(初阶)

&#x1f308;函数复用的两种不恰当方式 ☀️1.函数重载 以Swap函数为例&#xff0c;有多少种参数类型组合&#xff0c;就要重载多少个函数&#xff1a; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left,…

[职场] 俄语业务员是做什么的 #职场发展#媒体

俄语业务员是做什么的 俄语业务员作为我国企业开展对俄贸易的重要人才&#xff0c;他们需要不断提高自身的专业技能和综合素质&#xff0c;以适应不断变化的市场环境和企业发展需求&#xff0c;为中俄两国经贸合作做出更大的贡献。 一、俄语业务员是什么 俄语业务员是指以俄语…

SpringBoot全局异常捕获处理实现方案

在Spring Boot中实现全局异常处理可以通过以下方式&#xff1a; 使用ControllerAdvice注释创建一个全局异常处理类&#xff0c;并使用ExceptionHandler注释来定义具体异常的处理方法。 import your.package.IllegalNumberException; import org.springframework.http.HttpSta…

【数据结构】链表OJ面试题5(题库+解析)

1.前言 前五题在这http://t.csdnimg.cn/UeggB 后三题在这http://t.csdnimg.cn/gbohQ 给定一个链表&#xff0c;判断链表中是否有环。http://t.csdnimg.cn/Rcdyc 给定一个链表&#xff0c;返回链表开始入环的第一个结点。 如果链表无环&#xff0c;则返回 NULLhttp://t.cs…

c++之说_11|自定义类型 enum(枚举)与enumclass (c11新枚举)

至于枚举 会用就行 至少目前我感觉没什么太多问题 enum 被称为无作用域枚举 &#xff0c; enumclass / enumstruct 被称为有作用域枚举 看到了吧 语法规则 和 struct 差不多 只不过枚举成员 只是一个标志 它本质是数值 从上到下 下面的数根据上面的数 加 1 也可以直接…

3D裸眼技术行业研究:2026年市场投资规模为10.78亿元

3D裸眼技术大多处于研发阶段&#xff0c;它的研发分两个方向&#xff0c;一是硬件设备的研发&#xff0c;二为显示内容的处理研发。第二种已经开始小范围的商业运用。大众消费者接触的不多。从技术上来看&#xff0c;3D裸眼可分为光屏障式(Barrier)、柱状透镜(Lenticular Lens)…

4核8g服务器能支持多少人访问?- 腾讯云

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线&#xff1f;通用型-4核8G-180G-2000G&#xff0c;2000GB月流量&#xff0c;系统盘为180GB SSD盘&#xff0c;12M公网带宽&#xff0c;下载速度峰值为1536KB/s&#xff0c;即1.5M/秒&#xff0c;假设网站内页平均大小为60KB…

多源异构数据融合是为了解决什么问题?

多源异构数据融合为了解决在数据处理和分析过程中&#xff0c;由于数据来源的多样性和数据结构的差异性所带来的问题。具体来说&#xff0c;多源异构数据主要解决以下几个方面的问题&#xff1a; 数据来源多样性&#xff1a;在实际应用中&#xff0c;数据可能来自不同的来源&am…

Linux操作系统基础(八):Linux的vi/vim编辑器

文章目录 Linux的vi/vim编辑器 一、vi/vim编辑器介绍 二、打开文件 三、VIM编辑器的三种模式(重点) 四、命令模式相关命令 五、底行模式相关命令 Linux的vi/vim编辑器 一、vi/vim编辑器介绍 vi是visual interface的简称, 是Linux中最经典的文本编辑器 vi的核心设计思想…

全局唯一id生成器 各种实现记录

全局唯一id生成器 Redis 生成 前提知识~~ 时间戳 时间戳这个东西我们老是听到,却可能不是特别了解 首先,时间戳是从1970年1月1号0点0分开始的秒数,我查了蛮多资料,理论上来说,时间戳是没有上限的,而我们一般用位数来限制这里的上限,比如32位 我们来实际计算一下 32位的二进…

Leecode之分割链表

一.题目及剖析 https://leetcode.cn/problems/partition-list-lcci/description/ 二.思路引入 就是将其分成大小两个链表,以x为分界线进行分堆,最后再将两链表合并 三.代码引入 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct Lis…

陪护系统|陪护小程序提升长者护理服务质量的关键

在如今逐渐老龄化的社会中&#xff0c;老年人对更好的护理服务需求不断增加。科技的进步使得陪护小程序系统源码成为提供优质服务的重要途径之一。本文将从运营角度探讨如何优化陪护小程序系统源码&#xff0c;提升长者护理服务的质量。 首先&#xff0c;我们需要对软件的设计和…

CAN通讯协议详解

阅读引言&#xff1a; 本篇博文想给需要的人介绍一下CAN总线&#xff0c; 这个也算是我从B站学习记得笔记分享吧也算是。简单的介绍了CAN总线的大致内容&#xff0c; 简述支持CAN功能的STM32的简单使用例程。本视频的中的图片内容均来自B站爱上半导体博主的内容。 CAN高质量教学…

AI嵌入式K210项目(28)-在线模型训练

文章目录 前言一、平台介绍二、创建项目三、上传数据集图像分类图像检测图片上传压缩包上传 四、新建任务总结 前言 前面我们使用已经训练好的模型在K210开发板上进行了人脸识别&#xff0c;口罩识别&#xff0c;手写数字识别等实验&#xff0c;那么模型除了使用已经训练好的&…

【Make编译控制 01】程序编译与执行

目录 一、编译原理概述 二、编译过程分析 三、编译动静态库 四、执行过程分析 一、编译原理概述 make&#xff1a; 一个GCC工具程序&#xff0c;它会读 makefile 脚本来确定程序中的哪个部分需要编译和连接&#xff0c;然后发布必要的命令。它读出的脚本&#xff08;叫做 …

机器学习2--逻辑回归(案列)

糖尿病数据线性回归预测 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_diabetes diabetesload_diabetes() datadiabetes[data] targetdiabetes[target] feature_namesdiabetes[feature_names] data.shape df …

【数据结构】双向链表(链表实现+测试+原码)

前言 在双向链表之前&#xff0c;如果需要查看单链表来复习一下&#xff0c;链接在这里&#xff1a; http://t.csdnimg.cn/Ib5qS 1.双向链表 1.1 链表的分类 实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 1.1.1 单向或者双向 1.1.2 …

leetcode——滑动窗口题目汇总

本章总结一下滑动窗口的解题思路&#xff1a; 在字符串中使用双指针 left 和 right 围成的一个左闭右开的区域作为一个窗口。不断将 right 向右滑动&#xff0c;直到窗口中的字符串符合条件。此时将 left 向右滑动&#xff0c;直到窗口中的字符串不符合条件&#xff0c;期间需…

PyTorch 2.2 中文官方教程(三)

使用 PyTorch 构建模型 原文&#xff1a;pytorch.org/tutorials/beginner/introyt/modelsyt_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 注意 点击这里下载完整示例代码 介绍 || 张量 || 自动微分 || 构建模型 || TensorBoard 支持 || 训练模型 ||…