深入理解 LMS 算法:自适应滤波与回声消除

深入理解 LMS 算法:自适应滤波与回声消除

在信号处理领域,自适应滤波是一种重要的技术,广泛应用于噪声消除、回声消除和信号恢复等任务。LMS(Least Mean Squares)算法是实现自适应滤波的经典方法之一。本文将详细介绍 LMS 算法的原理,包括公式推导,并通过 Python 代码示例展示其在回声消除中的应用。我们还将介绍一些替代算法,比较它们的收敛效果。

收敛效果对比

注:本文参数没有详细调优,效果仅供参考
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1. LMS 算法介绍

1.1 算法原理

LMS 算法的目标是通过最小化输出信号与目标信号之间的均方误差(Mean Squared Error, MSE)来调整滤波器的系数。我们可以定义以下信号:

  • 参考信号 x(n):这是我们希望消除的回声信号(例如,来自扬声器的原始信号)。
  • 经过系统的信号 d(n):这是通过扬声器和麦克风系统接收到的信号,通常包含了回声和噪声。
  • 估计信号 y(n):这是自适应滤波器的输出信号,用于估计回声。
  • 残余回声 e(n):这是输出信号与目标信号之间的误差,表示未能消除的回声部分。

1.2 公式推导

LMS 算法的目标是最小化以下均方误差:

E = E { [ d ( n ) − y ( n ) ] 2 } E = \mathbb{E}\{[d(n) - y(n)]^2\} E=E{[d(n)y(n)]2}

其中,( y(n) ) 是由自适应滤波器生成的输出信号,可以表示为:

y ( n ) = w T ( n ) ⋅ x ( n ) y(n) = w^T(n) \cdot x(n) y(n)=wT(n)x(n)

这里 ( w(n) ) 是滤波器的系数向量。

在每次迭代中,LMS 算法执行以下步骤:

  1. 计算输出

y ( n ) = w T ( n − 1 ) ⋅ x ( n − 1 ) y(n) = w^T(n-1) \cdot x(n-1) y(n)=wT(n1)x(n1)

  1. 计算误差

e ( n ) = d ( n ) − y ( n ) e(n) = d(n) - y(n) e(n)=d(n)y(n)

  1. 更新滤波器系数

w ( n ) = w ( n − 1 ) + μ ⋅ e ( n ) ⋅ x ( n − 1 ) w(n) = w(n-1) + \mu \cdot e(n) \cdot x(n-1) w(n)=w(n1)+μe(n)x(n1)

其中, μ \mu μ 是学习率,控制每次更新的幅度。

1.3 优缺点

优点

  • 简单易实现,适合实时应用。
  • 能够在线学习,适应信号的变化。
  • 计算复杂度低,适合资源受限的环境。

缺点

  • 收敛速度可能较慢,尤其在高噪声环境下。
  • 学习率选择不当可能导致不稳定。
  • 可能收敛到局部最优解,而非全局最优解。

1.4. LMS代码介绍

下面是使用 LMS 算法的 Python 示例,展示了如何通过输入信号和目标信号进行自适应滤波。

import numpy as np
import matplotlib.pyplot as plt

# 参数设置
mu = 0.06  # 学习率
N = 300  # 迭代次数
f1 = 0.1  # 正弦波频率1
f2 = 0.07  # 正弦波频率2
np.random.seed(0)  # 设置随机种子以便重现

# 生成原始参考信号(复杂信号)
n = np.arange(N)
x = 0.5 * np.sin(2 * np.pi * f1 * n) + 0.5 * np.sin(2 * np.pi * f2 * n)  # 复杂信号

# 定义传递函数的参数
a = 1.0  # 基础传递函数增益
variation = 0.2  # 传递函数的微小变动范围

# 生成经过传递函数的信号,添加随机变化
transfer_function = a + np.random.uniform(-variation, variation, N)  # 随机变化
d = x * transfer_function  # 目标信号

# 初始化滤波器系数
order = 10  # 滤波器阶数
w = np.zeros(order)  # 初始化权重为零
y = np.zeros(N)  # 输出信号
e = np.zeros(N)  # 误差信号

# LMS算法迭代
for i in range(order, N):  # 从 order 开始迭代
    # 获取最近的 order 个输入样本
    input_samples = x[i-order:i]  # 当前输入样本

    # 计算输出
    y[i] = np.dot(w, input_samples)  # 使用权重和输入样本计算输出

    # 计算误差
    e[i] = d[i] - y[i]  # 计算误差信号

    # 更新滤波器系数
    w += mu * e[i] * input_samples  # 更新公式

# 创建子图
fig, axs = plt.subplots(2, 1, figsize=(12, 10))

# 绘制目标信号、原始信号和输出信号
axs[0].plot(d, label='Received Signal (d)', color='blue', linestyle='-', alpha=0.5)  # 目标信号
axs[0].plot(x, label='Original Signal (x)', color='green', linestyle='--', alpha=0.5)  # 原始信号
axs[0].plot(y, label='Estimated Signal (y)', color='red', linestyle='-')  # 输出信号
axs[0].set_title('LMS Algorithm with Transfer Function Example (Order 8)')
axs[0].set_xlabel('Sample Index')
axs[0].set_ylabel('Amplitude')
axs[0].legend()
axs[0].grid()

# 绘制误差信号
axs[1].plot(e * e, label='Error Signal rms(e)', color='orange', linestyle='-', alpha=0.7)  # 误差信号
axs[1].set_title('Error Signal After Echo Cancellation')
axs[1].set_xlabel('Sample Index')
axs[1].set_ylabel('Amplitude')
axs[1].legend()
axs[1].grid()

# 调整布局
plt.tight_layout()
plt.show()

2. 更好的替代算法

除了 LMS 算法,还有许多其他自适应滤波算法,它们在某些情况下可能表现得更好。以下是一些常见的替代算法及其特点。
是的,除了 LMS(Least Mean Squares)算法,还有许多其他自适应滤波算法,它们在某些情况下可能表现得更好。以下是一些常见的替代算法及其特点:

2.1. NLMS(Normalized Least Mean Squares)算法

  • 概述:NLMS 是 LMS 的一种改进版本,通过归一化输入信号的能量来调整学习率。这有助于提高算法的稳定性和收敛速度。
  • 优点
    • 更加稳定,尤其是在输入信号能量变化较大的情况下。
    • 收敛速度通常比 LMS 更快。
  • 公式
    w ( n + 1 ) = w ( n ) + μ ∥ x ( n ) ∥ 2 e ( n ) x ( n ) w(n+1) = w(n) + \frac{\mu}{\|x(n)\|^2} e(n) x(n) w(n+1)=w(n)+x(n)2μe(n)x(n)

2.2. RLS(Recursive Least Squares)算法

  • 概述:RLS 是一种基于最小二乘原理的自适应滤波算法,通过递归更新滤波器系数来最小化误差平方和。
  • 优点
    • 收敛速度快,通常优于 LMS 和 NLMS。
    • 能够处理非平稳信号,适应性强。
  • 缺点
    • 计算复杂度较高,尤其是在滤波器阶数较大时。
    • 需要更多的内存和计算资源。
  • 公式
    • 更新公式较为复杂,涉及协方差矩阵的计算。

2.3. Affined LMS(A-LMS)算法

  • 概述:A-LMS 是对 LMS 的一种变体,结合了线性预测和自适应滤波的思想。
  • 优点
    • 可以更好地处理噪声和信号相位的变化。
    • 在某些应用中表现出更好的性能。

2.4. Sign LMS(S-LMS)算法

  • 概述:S-LMS 是 LMS 的一种简化版本,它只使用符号信息(正负)来更新权重。
  • 优点
    • 计算复杂度低,适合实时应用。
    • 在某些情况下,能够提供与 LMS 相似的性能。
  • 缺点
    • 收敛速度较慢,且对噪声的鲁棒性较差。

2.5. Adaptive Filter with Kalman Filter

  • 概述:卡尔曼滤波器是一种基于状态空间模型的滤波方法,适用于动态系统的状态估计。
  • 优点
    • 能够处理动态变化的系统,适应性强。
    • 提供最优估计,尤其是在高噪声环境下表现良好。
  • 缺点
    • 数学推导复杂,计算资源消耗大。

2.6. 代码实现

1. NLMS(Normalized Least Mean Squares)

import numpy as np
import matplotlib.pyplot as plt

# 参数设置
initial_mu = 0.06  # 初始学习率
N = 300  # 迭代次数
f1 = 0.1  # 正弦波频率1
f2 = 0.07  # 正弦波频率2
np.random.seed(0)  # 设置随机种子以便重现

# 生成原始参考信号(复杂信号)
n = np.arange(N)
x = 0.5 * np.sin(2 * np.pi * f1 * n) + 0.5 * np.sin(2 * np.pi * f2 * n)  # 复杂信号

# 定义传递函数的参数
a = 1.0  # 基础传递函数增益
variation = 0.2  # 传递函数的微小变动范围

# 生成经过传递函数的信号,添加随机变化
transfer_function = a + np.random.uniform(-variation, variation, N)  # 随机变化
d = x * transfer_function  # 目标信号

# 初始化滤波器系数
order = 10  # 滤波器阶数
w = np.zeros(order)  # 初始化权重为零
y = np.zeros(N)  # 输出信号
e = np.zeros(N)  # 误差信号

# NLMS算法迭代
for i in range(order, N):  # 从 order 开始迭代
    # 获取最近的 order 个输入样本
    input_samples = x[i-order:i]  # 当前输入样本

    # 计算输出
    y[i] = np.dot(w, input_samples)  # 使用权重和输入样本计算输出

    # 计算误差
    e[i] = d[i] - y[i]  # 计算误差信号

    # 动态学习率
    mu = initial_mu / (1 + 0.01 * np.dot(input_samples, input_samples))  # 归一化学习率

    # 更新滤波器系数
    w += mu * e[i] * input_samples  # 更新公式

# 创建子图
fig, axs = plt.subplots(2, 1, figsize=(12, 10))

# 绘制目标信号、原始信号和输出信号
axs[0].plot(d, label='Received Signal (d)', color='blue', linestyle='-', alpha=0.5)  # 目标信号
axs[0].plot(x, label='Original Signal (x)', color='green', linestyle='--', alpha=0.5)  # 原始信号
axs[0].plot(y, label='Estimated Signal (y)', color='red', linestyle='-')  # 输出信号
axs[0].set_title('NLMS Algorithm with Transfer Function Example (Order 10)')
axs[0].set_xlabel('Sample Index')
axs[0].set_ylabel('Amplitude')
axs[0].legend()
axs[0].grid()

# 绘制误差信号
axs[1].plot(e**2, label='Error Signal (rms[e])', color='orange', linestyle='-', alpha=0.7)  # 误差信号
axs[1].set_title('Error Signal After Echo Cancellation (NLMS)')
axs[1].set_xlabel('Sample Index')
axs[1].set_ylabel('Amplitude')
axs[1].legend()
axs[1].grid()

# 调整布局
plt.tight_layout()
plt.show()

2. RLS(Recursive Least Squares)

# RLS算法实现
import numpy as np
import matplotlib.pyplot as plt

# 参数设置
N = 300  # 迭代次数
f1 = 0.1  # 正弦波频率1
f2 = 0.07  # 正弦波频率2
np.random.seed(0)  # 设置随机种子以便重现

# 生成原始参考信号(复杂信号)
n = np.arange(N)
x = 0.5 * np.sin(2 * np.pi * f1 * n) + 0.5 * np.sin(2 * np.pi * f2 * n)  # 复杂信号

# 定义传递函数的参数
a = 1.0  # 基础传递函数增益
variation = 0.2  # 传递函数的微小变动范围

# 生成经过传递函数的信号,添加随机变化
transfer_function = a + np.random.uniform(-variation, variation, N)  # 随机变化
d = x * transfer_function  # 目标信号

# 初始化滤波器系数
M = 10 # 滤波器阶数
w = np.zeros(M)  # # 初始化权重为零
y = np.zeros(N)  # 输出信号
e = np.zeros(N)  # 误差信号
P = np.eye(M) * 1000  # 初始协方差矩阵

# RLS算法迭代
for i in range(M, N):
    x_vec = x[i-M:i][::-1]  # 获取当前输入信号的向量
    y[i] = np.dot(w, x_vec)  # 计算输出信号
    e[i] = d[i] - y[i]  # 计算误差信号
    k = P @ x_vec / (1 + np.dot(x_vec.T, P @ x_vec))  # 计算增益
    w += k * e[i]  # 更新权重
    P = (P - np.outer(k, k.T) * (1 + np.dot(x_vec.T, k)))  # 更新协方差矩阵

# 创建子图
fig, axs = plt.subplots(2, 1, figsize=(12, 10))

# 绘制目标信号、原始信号和输出信号
axs[0].plot(d, label='Received Signal (d)', color='blue', linestyle='-', alpha=0.5)  # 目标信号
axs[0].plot(x, label='Original Signal (x)', color='green', linestyle='--', alpha=0.5)  # 原始信号
axs[0].plot(y, label='Estimated Signal (y)', color='red', linestyle='-')  # 输出信号
axs[0].set_title('RLS Algorithm with Transfer Function Example')
axs[0].set_xlabel('Sample Index')
axs[0].set_ylabel('Amplitude')
axs[0].legend()
axs[0].grid()

# 绘制误差信号
axs[1].plot(e**2, label='Error Signal (rms[e])', color='orange', linestyle='-', alpha=0.7)  # 误差信号
axs[1].set_title('Error Signal After Echo Cancellation (RLS)')
axs[1].set_xlabel('Sample Index')
axs[1].set_ylabel('Amplitude')
axs[1].legend()
axs[1].grid()

# 调整布局
plt.tight_layout()
plt.show()

3. Affined LMS

import numpy as np
import matplotlib.pyplot as plt

# 参数设置
initial_mu = 0.06  # 初始学习率
N = 300  # 迭代次数
f1 = 0.1  # 正弦波频率1
f2 = 0.07  # 正弦波频率2
np.random.seed(0)  # 设置随机种子以便重现

# 生成原始参考信号(复杂信号)
n = np.arange(N)
x = 0.5 * np.sin(2 * np.pi * f1 * n) + 0.5 * np.sin(2 * np.pi * f2 * n)  # 复杂信号

# 定义传递函数的参数
a = 1.0  # 基础传递函数增益
variation = 0.2  # 传递函数的微小变动范围

# 生成经过传递函数的信号,添加随机变化
transfer_function = a + np.random.uniform(-variation, variation, N)  # 随机变化
d = x * transfer_function  # 目标信号

# 初始化滤波器系数
order = 10  # 滤波器阶数
w = np.zeros(order)  # 初始化权重为零
y = np.zeros(N)  # 输出信号
e = np.zeros(N)  # 误差信号

# Affined LMS算法迭代
for i in range(order, N):  # 从 order 开始迭代
    # 获取最近的 order 个输入样本
    input_samples = x[i-order:i]  # 当前输入样本

    # 计算输出,增加偏置项
    y[i] = np.dot(w, input_samples) + 0.5 * input_samples[-1]  # 使用权重和输入样本计算输出,增加偏置

    # 计算误差
    e[i] = d[i] - y[i]  # 计算误差信号

    # 更新滤波器系数
    w += initial_mu * e[i] * input_samples  # 更新公式

# 创建子图
fig, axs = plt.subplots(2, 1, figsize=(12, 10))

# 绘制目标信号、原始信号和输出信号
axs[0].plot(d, label='Received Signal (d)', color='blue', linestyle='-', alpha=0.5)  # 目标信号
axs[0].plot(x, label='Original Signal (x)', color='green', linestyle='--', alpha=0.5)  # 原始信号
axs[0].plot(y, label='Estimated Signal (y)', color='red', linestyle='-')  # 输出信号
axs[0].set_title('Affined LMS Algorithm with Transfer Function Example (Order 10)')
axs[0].set_xlabel('Sample Index')
axs[0].set_ylabel('Amplitude')
axs[0].legend()
axs[0].grid()

# 绘制误差信号
axs[1].plot(e**2, label='Error Signal (rms[e])', color='orange', linestyle='-', alpha=0.7)  # 误差信号
axs[1].set_title('Error Signal After Echo Cancellation (Affined LMS)')
axs[1].set_xlabel('Sample Index')
axs[1].set_ylabel('Amplitude')
axs[1].legend()
axs[1].grid()

# 调整布局
plt.tight_layout()
plt.show()

4. Sign LMS(S-LMS)

import numpy as np
import matplotlib.pyplot as plt

# 参数设置
initial_mu = 0.06  # 初始学习率
N = 300  # 迭代次数
f1 = 0.1  # 正弦波频率1
f2 = 0.07  # 正弦波频率2
np.random.seed(0)  # 设置随机种子以便重现

# 生成原始参考信号(复杂信号)
n = np.arange(N)
x = 0.5 * np.sin(2 * np.pi * f1 * n) + 0.5 * np.sin(2 * np.pi * f2 * n)  # 复杂信号

# 定义传递函数的参数
a = 1.0  # 基础传递函数增益
variation = 0.2  # 传递函数的微小变动范围

# 生成经过传递函数的信号,添加随机变化
transfer_function = a + np.random.uniform(-variation, variation, N)  # 随机变化
d = x * transfer_function  # 目标信号

# 初始化滤波器系数
order = 10  # 滤波器阶数
w = np.zeros(order)  # 初始化权重为零
y = np.zeros(N)  # 输出信号
e = np.zeros(N)  # 误差信号

# Sign LMS算法迭代
for i in range(order, N):  # 从 order 开始迭代
    # 获取最近的 order 个输入样本
    input_samples = x[i-order:i]  # 当前输入样本

    # 计算输出
    y[i] = np.dot(w, input_samples)  # 使用权重和输入样本计算输出

    # 计算误差
    e[i] = d[i] - y[i]  # 计算误差信号

    # 更新滤波器系数(只使用符号信息)
    w += initial_mu * np.sign(e[i]) * input_samples  # 更新公式

# 创建子图
fig, axs = plt.subplots(2, 1, figsize=(12, 10))

# 绘制目标信号、原始信号和输出信号
axs[0].plot(d, label='Received Signal (d)', color='blue', linestyle='-', alpha=0.5)  # 目标信号
axs[0].plot(x, label='Original Signal (x)', color='green', linestyle='--', alpha=0.5)  # 原始信号
axs[0].plot(y, label='Estimated Signal (y)', color='red', linestyle='-')  # 输出信号
axs[0].set_title('Sign LMS Algorithm with Transfer Function Example (Order 10)')
axs[0].set_xlabel('Sample Index')
axs[0].set_ylabel('Amplitude')
axs[0].legend()
axs[0].grid()

# 绘制误差信号
axs[1].plot(e**2, label='Error Signal (rms[e])', color='orange', linestyle='-', alpha=0.7)  # 误差信号
axs[1].set_title('Error Signal After Echo Cancellation (Sign LMS)')
axs[1].set_xlabel('Sample Index')
axs[1].set_ylabel('Amplitude')
axs[1].legend()
axs[1].grid()

# 调整布局
plt.tight_layout()
plt.show()

5. 卡尔曼滤波器

import numpy as np
import matplotlib.pyplot as plt

# 参数设置
N = 300  # 迭代次数
f1 = 0.1  # 正弦波频率1
f2 = 0.07  # 正弦波频率2
np.random.seed(0)  # 设置随机种子以便重现

# 生成原始参考信号(复杂信号)
n = np.arange(N)
x = 0.5 * np.sin(2 * np.pi * f1 * n) + 0.5 * np.sin(2 * np.pi * f2 * n)  # 复杂信号

# 定义传递函数的参数
a = 1.0  # 基础传递函数增益
variation = 0.2  # 传递函数的微小变动范围

# 生成经过传递函数的信号,添加随机变化
transfer_function = a + np.random.uniform(-variation, variation, N)  # 随机变化
d = x * transfer_function  # 目标信号

# 初始化卡尔曼滤波器参数
Q = 1e-6  # 过程噪声协方差
R = 0.2   # 测量噪声协方差
P = 0.2  # 估计误差协方差
M = 10  # 滤波器阶数
w = np.zeros(M)  # 初始化权重为零
y = np.zeros(N)  # 输出信号
e = np.zeros(N)  # 误差信号

# 卡尔曼滤波器迭代
for i in range(M, N):  # 从 M 开始迭代
    # 获取最近的 M 个输入样本
    x_vec = x[i-M:i]  # 当前输入样本

    # 预测更新
    y[i] = np.dot(w, x_vec)  # 预测输出

    # 更新卡尔曼增益
    K = P / (P + R)  # 卡尔曼增益

    # 计算误差
    e[i] = d[i] - y[i]  # 计算误差信号

    # 更新估计
    w += K * e[i] * x_vec  # 更新权重

    # 更新估计误差协方差
    P = (1 - K) * P + Q  # 更新协方差

# 创建子图
fig, axs = plt.subplots(2, 1, figsize=(12, 10))

# 绘制目标信号、原始信号和输出信号
axs[0].plot(d, label='Received Signal (d)', color='blue', linestyle='-', alpha=0.5)  # 目标信号
axs[0].plot(x, label='Original Signal (x)', color='green', linestyle='--', alpha=0.5)  # 原始信号
axs[0].plot(y, label='Estimated Signal (y)', color='red', linestyle='-')  # 输出信号
axs[0].set_title('Kalman Filter Algorithm with Transfer Function Example (Order 10)')
axs[0].set_xlabel('Sample Index')
axs[0].set_ylabel('Amplitude')
axs[0].legend()
axs[0].grid()

# 绘制误差信号
axs[1].plot(e**2, label='Error Signal (rms[e])', color='orange', linestyle='-', alpha=0.7)  # 误差信号
axs[1].set_title('Error Signal After Echo Cancellation (Kalman Filter)')
axs[1].set_xlabel('Sample Index')
axs[1].set_ylabel('Amplitude')
axs[1].legend()
axs[1].grid()

# 调整布局
plt.tight_layout()
plt.show()

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

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

相关文章

如何在分布式环境中实现高可靠性分布式锁

目录 一、简单了解分布式锁 (一)分布式锁:应对分布式环境的同步挑战 (二)分布式锁的实现方式 (三)分布式锁的使用场景 (四)分布式锁需满足的特点 二、Redis 实现分…

socket连接封装

效果: class websocketMessage {constructor(params) {this.params params; // 传入的参数this.socket null;this.lockReconnect false; // 重连的锁this.socketTimer null; // 心跳this.lockTimer null; // 重连this.timeout 3000; // 发送消息this.callbac…

基于RM开发板32学习日记

环境配置 芯片选型 STM32F407IGH6 配置时钟 12 168 模块 Led 引脚选择 比对原理图 可查看 设置为Out_Put输出 三色同时点亮 合为白色光 HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOH, GPIO_PIN_10, GPIO_PIN_SET);GPIOH->ODR…

MacOS下的Opencv3.4.16的编译

前言 MacOS下编译opencv还是有点麻烦的。 1、Opencv3.4.16的下载 注意,我们使用的是Mac,所以ios pack并不能使用。 如何嫌官网上下载比较慢的话,可以考虑在csdn网站上下载,应该也是可以找到的。 2、cmake的下载 官网的链接&…

刷题笔记15

问题描述 小M和小F在玩飞行棋。游戏结束后,他们需要将桌上的飞行棋棋子分组整理好。现在有 N 个棋子,每个棋子上有一个数字序号。小M的目标是将这些棋子分成 M 组,每组恰好5个,并且组内棋子的序号相同。小M希望知道是否可以按照这…

stm32 指定变量存储地址

uint8_t array[10] attribute((at(0x20000000))) 当你使用 attribute((at(地址))) 强制将变量放置在特定地址时,编译器和链接器通常不会自动调整其他变量的地址以避免冲突。这意味着,如果指定的地址已经被其他变量占用,就会发生冲突。 如果…

性能超越Spark 13.3 倍,比某MPP整体快数十秒 | 多项性能指标数倍于主流开源引擎 | 云器科技发布性能测试报告

云器Lakehouse正式发布性能测试报告 🏅离线批处理:在复杂批处理任务中,云器Lakehouse相较Spark表现出13.31倍性能提升。 🏅即席查询:在交互式分析场景下,云器Lakehouse相较Trino表现出9.84倍性能提升。 &am…

NIST 发布后量子密码学转型战略草案

美国国家标准与技术研究所 (NIST) 发布了其初步战略草案,即内部报告 (IR) 8547,标题为“向后量子密码标准过渡”。 该草案概述了 NIST 从当前易受量子计算攻击的加密算法迁移到抗量子替代算法的战略。该草案于 2024 年 11 月 12 日发布,开放…

论文阅读——Performance Evaluation of Passive Tag to Tag Communications(一)

文章目录 摘要一、互耦对监听器标签输入阻抗的影响A. 无限细偶极子互阻抗的理论研究B. 电细偶极子的情况:理论与模拟C. 印刷偶极子的情况:电磁模拟与测量 二、T2T 通信系统的性能评估总结 论文来源:https://ieeexplore.ieee.org/document/970…

IT人员面试重点底层逻辑概念

arrayList的底层原理 ArrayList是个动态数组,实现List接口,主要用来存储数据,如果存储基本类型的数据,如int,long,boolean,short,byte,那只存储它们对应的包装类。 它的…

PyTorch 分布式并行计算

0. Abstract 使用 PyTorch 进行多卡训练, 最简单的是 DataParallel, 仅仅添加一两行代码就可以使模型在多张 GPU 上并行地计算. 但它是比较老的方法, 官方推荐使用新的 Distributed Data Parallel, 更加灵活与强大: 1. Distributed Data Parallel (DDP) 从一个简单的非分布…

基于MATLAB的超宽带(UWB)信号的仿真和测试系统

基于MATLAB的超宽带(UWB)信号的仿真和测试系统 引言 随着无线通信技术的发展,超宽带(Ultra-Wideband, UWB)技术因其高数据传输速率、低功耗、抗多径衰落等优点而受到广泛关注。UWB技术适用于短距离高速数据传输,如个人区域网络、…

美团面试:有哪些情况会产生死锁

前言 我们首先需要知道,死锁一定发生在并发场景中。为了保证线程安全,有时会给程序使用各种能保证并发安全的工具,尤其是锁,但是如果在加解锁过程中处理不恰当,就有可能适得其反,导致程序出现死锁的情况。…

如何在Linux上安装Canal同步工具

1. 下载安装包 所用到的安装包 canal.admin-1.1.4.tar.gz 链接:https://pan.baidu.com/s/1B1LxZUZsKVaHvoSx6VV3sA 提取码:v7ta canal.deployer-1.1.4.tar.gz 链接:https://pan.baidu.com/s/13RSqPinzgaaYQUyo9D8ZCQ 提取码:…

百度主动推送可以提升抓取,它能提升索引量吗?

站长在建站SEO的时候,需要用到百度站长平台(资源平台)的工具,在站长工具中【普通收录】-【资源提交】-【API提交】这个功能,对网站的抓取进行一个提交。 这里估计很多站长就有疑问,如果我主动推送&#xf…

如何将Latex的文章内容快速用word+Endnote排版

1 第一步 Endnote文件是无法直接导入bib文件的。需要将reference.bib的参考文献内容,通过JabRef软件打开并另存为refefence.ris文件 下载JabRef软件:https://www.jabref.org/#download 导出为ris格式文件 2 第二步 通过Endnote导入ris文件&#xff0…

Telegram bot Mini-App开发实践---Telegram简单介绍与初始化小程序获取window.Telegram.WebApp对象并解析

➡️【好看的灵魂千篇一律,有趣的鲲志一百六七!】- 欢迎认识我~~ 作者:鲲志说 (公众号、B站同名,视频号:鲲志说996) 科技博主:极星会 星辉大使 后端研发:java、go、python、TS,前电商、现web3 主理人:COC杭州开发者社区主理人 、周周黑客松杭州主理人、 AI爱好…

Hadoop 系列 MapReduce:Map、Shuffle、Reduce

文章目录 前言MapReduce 基本流程概述MapReduce 三个核心阶段详解Map 阶段工作原理 Shuffle 阶段具体步骤分区(Partition)排序(Sort)分组(Combine 和 Grouping) Reduce 阶段工作原理 MapReduce 应用场景Map…

英文版本-带EXCEL函数的数据分析

一、问题: 二、表格内容 三、分析结果 四、具体的操作步骤: 销售工作表公式设计与数据验证 类别(Category)列公式: 在Category列(假设为D列),根据ProductCode在Catalogue工作表中查找…

Jmeter数据库压测之达梦数据库的配置方法

目录 1、概述 2、测试环境 3、数据库压测配置 3.1 安装jmeter 3.2 选择语言 3.3 新建测试计划 3.4 配置JDBC连接池 3.5 配置线程组 3.6 配置测试报告 3.7 执行测试 1、概述 Jmeter是Apache组织开发的基于Java的压力测试工具,用于对软件做压力测试。 它最…