Matlab:使用 Filtered-x LMS FIR 自适应滤波器实现有源噪声控制

2023-05-16

Matlab:使用 Filtered-x LMS FIR 自适应滤波器实现有源噪声控制

      • 一、有源噪声控制 (Active Noise Control)
      • 二、次级传播路径的实现代码 (Secondary Propagation Path)
      • 三、次级通道 (Secondary Path) 传播路径的估计
      • 四、基于NLMS自适应滤波器的次级通道估计
      • 五、基于NLMS的次级通道估计的准确性
      • 六、主传播通道(Primary Propagation Path)
      • 七、有源噪声控制(ANC, Active Noise Control)
        • 7.1 有源噪声的初始化
        • 7.2 基于Filtered-X LMS算法的有源噪声的仿真

  • 🏠 Matlab 官方手册: Active Noise Control Using a Filtered-X LMS FIR Adaptive Filter - MATLAB & Simulink - MathWorks 中国。

一、有源噪声控制 (Active Noise Control)

  • 有源噪声控制通过电声系统,使用监测传感器(比如麦克风)与输出制动器(比如扬声器)来减少不希望的噪声音量在空气中传播。有源噪声控制系统的目的是生成一种“抗噪声”,使用自适应滤波器在期望的安静区域中衰减不需要的噪声,原理图如下所示:

二、次级传播路径的实现代码 (Secondary Propagation Path)

🚀 该问题与传统自适应噪声消除不同之处在于:
我们无法直接测量期望的响应信号,只有噪声源信号可以被监测到。有源噪声控制系统在自适应过程中必须考虑次级通道(Secondary Path)中的传播。

次级传播路径是抗噪声从输出扬声器到安静区内的误差麦克风的路径。下面的Matlab指令可以生成一个扬声器到误差麦克风的脉冲响应,即次级通道的脉冲响应。其带宽限制在160-2000Hz的范围内,且滤波器长度为0.1秒,另外,采样频率为8000Hz。

🦄 通过Matlab生成一个固定频带宽度的次级通道的具体步骤如下所示:

  • 1、首先设置次级通道相关超参数: 采样频率(Fs)、滤波器长度(N)、频率上 / 下边沿(Fhigh / Flow)、信号传播延迟(delayS)、阻带衰减(Ast)、滤波器阶数(Nfilt);
  • 2、然后根据次级通道相关超参数设计带通滤波器, 主要包括次级通道带通滤波器设计次级通道脉冲响应获取两个流程:
    • (1)次级通道带通滤波器设计: 将滤波器阶数(Nfilt)、频率上 / 下边沿(Fhigh / Flow)、阻带衰减(Ast)、采样频率(Fs)输入Matlab带通滤波器设计类方法fdesign.bandpass,得到次级通道的带通滤波器模板filtSpecs;使用design类方法将滤波器模板filtSpecs设计成一个具体的次级通道带通滤波器bandpass。其中bandpass的设计方法为Chebyshev II(cheby2)型滤波器,滤波器结构为直接II型 SOS 二阶块(df2tsos, Transposed Direct From II, Second-Order Secitons)。
    • (2)次级通道脉冲响应获取: 构造输入次级通道的参考信号,将其输入次级通道带通滤波器得到次级通道的脉冲响应,并进行正则化处理。
%%%%%%%%%%%%%%%% 生成并绘制第二通道的脉冲响应 %%%%%%%%%%%%%%%%

% 超参数设置
Fs       = 8e3;     % 采样频率为 8kHz
N         = 800;    % 采样点为800个,对应于时域中的 0.1s
Flow    = 160;    	% 频带下边沿160Hz
Fhigh  = 2000;  	% 频带上边沿2000Hz
delayS = 7;
Ast      = 20;      % 阻带衰减 (Stopband Attenuation)20dB
Nfilt     = 8;      % 滤波器阶数

% 使用带通滤波器方法生成具有固定带宽次级通道的脉冲响应
% 得到次级通道的带通滤波器bandpass
filtSpecs = fdesign.bandpass('N,Fst1,Fst2,Ast',Nfilt,Flow,Fhigh,Ast,Fs);
bandpass = design(filtSpecs,'cheby2','FilterStructure','df2tsos', ...
    'SystemObject',true);

% 将参考信号输入带通滤波器得到次级通道的脉冲响应secondaryPathCoeffsActual
secondaryPathCoeffsActual = bandpass([zeros(delayS,1); ...
                       log(0.99*rand(N-delayS,1)+0.01).* ...
                       sign(randn(N-delayS,1)).*exp(-0.01*(1:N-delayS)')]);
secondaryPathCoeffsActual = ...
    secondaryPathCoeffsActual/norm(secondaryPathCoeffsActual);

% 绘图
t = (1:N)/Fs;
plot(t, secondaryPathCoeffsActual, ...      % 需要绘制的x,y数据
    'Color', [0.4940 0.1840 0.5560], ...    % 线条颜色
    'LineStyle', '--', ...     % 线条类型
    'LineWidth', 2, ...        % 线条宽度
    'Marker', 'square', ...    % 数据点形状
    'MarkerIndices', 1:3:length(secondaryPathCoeffsActual), ...  % 每隔3个点绘制一个数据点
    'MarkerEdgeColor', [0.1, 0.1, 0.1], ...    % 数据点边缘颜色
    'MarkerFaceColor', [0.8, 0.8, 0.8], ...    % 数据点面颜色
    'MarkerSize', 5, ...      % 数据点大小
    'LineJoin', 'round')      % 线条转折点的形状
    
xlabel('Time [sec]', ...
    'FontSize', 16, ...
    'FontWeight', 'bold');
ylabel('Coefficient value', ...
    'FontSize', 16, ...
    'FontWeight','bold');
title('True Secondary Path Impulse Response', ...
    'FontSize', 18, ...
    'FontWeight', 'bold');

set(gca,'FontSize',14);     % 设置坐标刻度字体大小

三、次级通道 (Secondary Path) 传播路径的估计

🚀 有源噪声控制的第一任务:估计次级传播路径的脉冲响应
对次级通道传播路径的脉冲响应通常是在噪声达到误差麦克风之前进行的,评估次级通道传播路径脉冲响应的思路为:

  • (1) 通过上面得到的次级通道脉冲响应secondaryPathCoeffsActual作为分子(Numerator),通过dsp.FIRFilter方法得到次级通道信号生成器FIR滤波器secondaryPathGenerator
  • (2) 构造一个长度为30000的随机信号randomSignal。将randomSignal加上麦克风处的随机干扰信号0.01*randn(30000, 1)构成合成信号输入次级通道FIR滤波器secondaryPathGenerator到次,最终得到次级通道的估计输出信号secondaryPathMeasured

下面的代码产生了3.75秒的随机噪声以及误差麦克风的测量信号:

%%%%%%%%%%%%%%%% 次级通道传播的脉冲估计 %%%%%%%%%%%%%%%%

ntrS = 30000;       % 信号长度,由于采样频率为800,所以信号的时间长度3.75s
randomSignal = randn(ntrS, 1);    % 合成的随机信号

% 构造次级通道的滤波器secondaryPathGenerator
secondaryPathGenerator = dsp.FIRFilter('Numerator', secondaryPathCoeffsActual.');
% 将合成信号收入次级通道滤波器secondaryPathGenerator,得到次级通道
% 的估计输出信号secondaryPathMeasured
secondaryPathMeasured = secondaryPathGenerator(randomSignal) + ... % 次级通道中传播的随机噪声
    0.01*randn(ntrS, 1);  % 误差麦克风处监测到的噪声

四、基于NLMS自适应滤波器的次级通道估计

实际情况下,次级通道的滤波器长度可以比实际通过其噪声信号的长度短,并且在通常情况下,并不需要对整个噪声信号进行自适应控制。这里使用250个信号点(taps)长度作为次级通道滤波器的长度,其对应于31ms的脉冲响应长度。

虽然,很多自适应FIR滤波器都可以实现有源噪声控制,但是由于归一化最小均方差(NLMS, Normalized Least Mean Square)算法简单且具有良好的鲁棒性,本文使用NLMS进行有源噪声控制。

自适应滤波器是利用前一时刻滤波器参数,自动调整当前时刻滤波器参数,以适应信号随时间变化的统计特征,从而实现最优滤波,其原理如下图所示:

  • x ( n ) x(n) x(n)输入信号
  • d ( n ) d(n) d(n)期望信号
  • y ( n ) y(n) y(n)为输入信号通过参数可调数字滤波器(自适应滤波器)的输出信号;
  • e ( n ) e(n) e(n)为误差信号。

🚀 基于NLMS自适应滤波器的次级通道估计的具体步骤为

  • (1)通过dsp.LMSFilter方法构造次级通道估计器secondaryPathEstimator
  • (2)输入随机信号randomSignal与次级通道的估计输出信号secondaryPathMeasured输入次级通道估计器secondaryPathEstimator得到期望信号(用于消除噪声的信号)secondaryPathCoeffsEst、NLMS自适应滤波器的输出信号yS与误差信号eS
%%%%%%%%%%%%%%%% 三、基于NLMS的次级通道估计 %%%%%%%%%%%%%%%%

M = 250;      % 滤波器长度
muS = 0.1;   % 步长

% 构造基于NLMS滤波器的次级通道估计器secondaryPathEstimator
secondaryPathEstimator = dsp.LMSFilter('Method', 'Normalized LMS', ...  % 使用NLMS方法
    'StepSize', muS, ...    % 步长
    'Length', M);             % 滤波器长度

% 将输入信号randomSignal与上面得到的次级通道输出secondaryPathMeasured
% 输入NLMS自适应滤波器得到:
%1)secondaryPathCoeffsEst:NLMS自适应滤波器权重系数
%2)yS:输入信号通过NLMS自适应滤波器的次级通道输出
%3)eS:误差麦克风的信号
[yS, eS, SecondaryPathCoeffsEst] = secondaryPathEstimator(randomSignal, secondaryPathMeasured);

% 绘制结果
n = 1:ntrS;
figure, plot(n, secondaryPathMeasured, n, yS, n, eS);
xlabel("Number of iterations", "FontSize", 16, "FontWeight", "bold");
ylabel("Signal value", "FontSize", 16, "FontWeight", "bold");
title("Secondary Identification Using the NLMS Adaptive Filter", "FontSize", 18, "FontWeight", "bold")
set(gca,'FontSize',14);     % 设置坐标刻度字体大小

由上图可以看出,NLMS算法在大约10000次迭代后收敛。

五、基于NLMS的次级通道估计的准确性

下面的代码实现展示次级路径脉冲响应估计的准确度情况。

%%%%%%%%%%%%%%%% 基于NLMS的次级通道估计的准确性 %%%%%%%%%%%%%%%%

figure;
% 次级通道的真实响应
plot(t, secondaryPathCoeffsActual, "LineStyle","--", "LineWidth", 1.5, "Color", "k"), hold on;
% 次级通道的估计响应
plot(t(1:M), SecondaryPathCoeffsEst, "LineStyle","-.", "LineWidth", 1.5), hold on;
% 真实响应与估计响应的误差
plot(t, [secondaryPathCoeffsActual(1:M)-SecondaryPathCoeffsEst(1:M); ...
    secondaryPathCoeffsActual(M+1:N)], "LineStyle","-", "LineWidth", 1.5)

xlabel("Time [sec]", "FontSize", 16, "FontWeight", "bold")
ylabel("Coefficient value", "FontSize", 16, "FontWeight", "bold")
title("Secondary Path Impulse Response Estimation", "FontSize", 18, "FontWeight", "bold")
legend('True', 'Estimated', 'Error');
set(gca,'FontSize',14); 

六、主传播通道(Primary Propagation Path)

将要被消除的噪声在主传播通道中的传播也可以由一个线性滤波器刻画。下面的指令生成一个从输入到误差麦克风的一个频率介于200-800Hz并且滤波器长度为0.1s的脉冲响应。

%%%%%%%%%%%%%%%% 主传播通道 %%%%%%%%%%%%%%%%
delayW = 15;        % 主通道的信号延迟
Flow     = 200;     % 频带下边界
Fhigh   = 800;      % 频带上边界
Ast       = 20;        % 20 dB阻带衰减
Nfilt      = 10;       % 滤波器阶数

% 设计带通滤波器bandpass2,以产生200-800频带内的脉冲响应
filtSpecs2 = fdesign.bandpass('N,Fst1,Fst2,Ast',Nfilt,Flow,Fhigh,Ast,Fs);
bandpass2 = design(filtSpecs2,'cheby2','FilterStructure','df2tsos', ...
    'SystemObject',true);

% 将噪声输入带通滤波器bandpass2以生成脉冲响应
primaryPathCoeffs = bandpass2([zeros(delayW, 1); ...
    log(0.99*rand(N-delayW, 1)+0.01).*sign(randn(N-delayW, 1)).*exp(-0.01*(1:N-delayW)')]);
primaryPathCoeffs = primaryPathCoeffs / norm(primaryPathCoeffs);

% 绘制主通道的脉冲响应
figure, plot(t, primaryPathCoeffs, "Color", 'b', 'LineStyle', '-.', 'LineWidth', 1.5, ...
    'Marker', 'o', 'MarkerIndices', 1:3:length(primaryPathCoeffs), ...
    'MarkerEdgeColor', [0.1, 0.1, 0.1], 'MarkerFaceColor', [0.8, 0.8, 0.8], 'MarkerSize', 5)
    
xlabel('Time [sec]', ...
    'FontSize', 16, ...
    'FontWeight', 'bold');
ylabel('Coefficient value', ...
    'FontSize', 16, ...
    'FontWeight','bold');
title('Primary Path Impulse Response', ...
    'FontSize', 18, ...
    'FontWeight', 'bold');

set(gca,'FontSize',14);     % 设置坐标刻度字体大小

七、有源噪声控制(ANC, Active Noise Control)

7.1 有源噪声的初始化

在有源噪声控制中最流行的自适应算法为filterd-X LMS算法。它使用次级通道的估计结果计算一个输出信号,该输出在误差传感器处与不期望的噪声相互抵消,以达到噪声消除的目的。参考信号(reference signal)是早噪声源附近进行监测得到的。下面的代码使用大约44ms及步长为0.0001的滤波器控制器:

% 根据主通道脉的冲响应结果primaryPathCoeffs,构造FIR滤波器以便构造主通道传播模型(传递函数)
primaryPathGenerator = dsp.FIRFilter('Numerator', primaryPathCoeffs.');

% 使用Filtered-X LMS自适应滤波器对噪声进行控制
L = 350;
muW = 0.0001;
noiseController = dsp.FilteredXLMSFilter('Length',L,'StepSize',muW, ...
    'SecondaryPathCoefficients',SecondaryPathCoeffsEst);

% 构造Sine波形的构造器合成地生成噪声
A  = [.01 .01 .02 .2 .3 .4 .3 .2 .1 .07 .02 .01];
La = length(A);
F0 = 60;
k  = 1:La;
F  = F0*k;
phase = rand(1, La); % 随机初始化相位
sine = audioOscillator('NumTones', La, 'Amplitude',A,'Frequency',F, ...
    'PhaseOffset',phase,'SamplesPerFrame',512,'SampleRate',Fs);

% 使用音频播放器分别播放消去噪声前后的输入噪声信号
player = audioDeviceWriter('SampleRate', Fs);

% 使用频谱分析器展示原始信号与消去噪声的信号
scope = spectrumAnalyzer("SampleRate", Fs, "OverlapPercent", 80, ...
    "PlotAsTwoSidedSpectrum", false, ...
    "ShowLegend", true, ...
    "ChannelNames", {'Original noise signal', 'Attenuated noise'});

7.2 基于Filtered-X LMS算法的有源噪声的仿真

下面进行有源噪声控制系统的设计,为了突出有源噪声控制系统的影响,在开始200步迭代中不使用有源噪声控制,并在消噪之前监听误差麦克风处的信号。

一旦自适应滤波器开始工作,大概经过6-10s的仿真时间算法开始收敛,即噪声被有效消除。通过对比残差信号的频谱,我们可以看到输入噪声在很大程度上得到了衰减。

%%%%%%%%%%%%%%%% 基于Filtered-X LMS算法的有源噪声的仿真 %%%%%%%%%%%%%%%%

for m = 1:400
    % 通过上面的sin()生成带有随机相位的合成噪声
    x = sine();
    d = primaryPathGenerator(x) + ... % 输入噪声在主通道中的传播
        0.1*randn(size(x)); % 添加测量噪声

    % 开始迭代
    if m <= 200
        % 200步迭代之前,不进行有源噪声控制
        e = d;
    else
        % 200步迭代之后,添加有源噪声控制
        xhat = x + 0.1*randn(size(x));
        [y, e] = noiseController(xhat, d);
    end
    
    player(e);      % 播放噪声信号
    scope([d, e])   % 展示原始信号的频率(Channel 1)与衰减的噪声(通道2)
end

release(player);    % 释放播放器对象
release(scope);     % 释放频谱显示对象

代码执行结果如下图所示:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matlab:使用 Filtered-x LMS FIR 自适应滤波器实现有源噪声控制 的相关文章

  • Matlab PARFOR 循环可以通过编程方式打开/关闭吗?

    有一个关于 MATLAB 中 parfor 的简单问题 我想在程序中设置一个标志 以便在 parfor 和常规 for 循环之间进行更改 基本上 我需要此功能 以便我的代码的某些部分可以在 调试 模式下更新图形 然后当关闭该标志时 使用 p
  • 将自动生成的 Matlab 文档导出为 html

    我想为我开发的 Matlab 工具箱生成完整的帮助 我已经看到如何显示自定义文档 http www mathworks fr fr help matlab matlab prog display custom documentation h
  • 扩展 MATLAB 函数名称的最大长度

    我编写了一个 MATLAB 程序 可以动态创建自定义 MATLAB 函数 并使用以下命令在其他 MATLAB 实例中启动它们unix命令 我使用这个程序来自动化 fMRI 神经影像分析 使用 SPM8 for MATLAB 一切正常 但是
  • MATLAB 中最有效的矩阵求逆

    在 MATLAB 中计算某个方阵 A 的逆矩阵时 使用 Ai inv A should be the same as Ai A 1 MATLAB 通常会通知我这不是最有效的求逆方法 那么什么是更有效率的呢 如果我有一个方程系统 可能会使用
  • Simulink 仿真引擎如何工作?

    我想了解 Simulink 仿真引擎的工作原理 它是否使用离散事件模拟机制 那么如何处理连续时间 它是否依赖于基于静态循环的代码生成 或者 在第一个周期之前 它会计算出块的执行顺序 从不需要任何其他块输入的块开始 每个周期 它都会根据输入和
  • 为什么旋转 3D 点云后顶点法线会翻转?

    我有两个人脸 3D 点云样本 蓝色点云表示目标面 红色点云表示模板 下图显示目标面和模板面在不同方向上对齐 目标面大致沿 x 轴 模板面大致沿 y 轴 Figure 1 The region around the nose is displ
  • 如何找到在matlab中重复的矩阵的每一行的索引?

    我想找到矩阵中所有有重复项的行的索引 例如 A 1 2 3 4 1 2 3 4 2 3 4 5 1 2 3 4 6 5 4 3 要返回的向量将是 1 2 4 很多类似的问题建议使用unique函数 我已经尝试过 但我能得到的最接近我想要的功
  • 有没有办法在matlab中进行隐式微分

    我经常使用 matlab 来帮助我解决数学问题 现在我正在寻找一种在 matlab 中进行隐式微分的方法 例如 我想区分y 3 sin x cos y exp x 0关于dy dx 我知道如何使用数学方法通常做到这一点 但我一直在努力寻找使
  • 如何告诉 mex 链接到 /usr/lib 中的 libstdc++.so.6 而不是 MATLAB 目录中的 libstdc++.so.6?

    现在 MATLAB 2012a 中的 mex 仅正式支持 gcc 4 4 6 但我想使用 gcc 4 7 风险自负 现在如果我直接用 mex 编译一些东西 它会抱怨 usr lib gcc i686 linux gnu 4 7 cc1plu
  • matlab中类库的全局变量

    我有一些matlab声明的类 我如何声明所有类中都可见的常量 例如 这些常量可以是在所有类的方法中使用的物理常量 首先想到的是使用全局变量 还有更好的办法吗 最好在单独的文件中声明这些常量 包含常量的类是执行此操作的一种很好的干净方法 请参
  • matlab中的排列函数是如何工作的

    这是一个有点愚蠢的问题 但我似乎无法弄清楚排列在 matlab 中是如何工作的 以文档为例 A 1 2 3 4 permute A 2 1 ans 1 3 2 4 到底是怎么回事 这如何告诉 matlab 3 和 2 需要交换 哇 这是我迄
  • 如何在 matlab 中创建由多个 3d 图像数据数组组成的数组

    我正在阅读 15 张图片imagedata imread imagename jpg 它的大小总是320 by 320 by 3 如何将数据放入数组中 使用 for for 循环 以便在访问新数组的第一个元素时获得输入的第一个图像的 RGB
  • 如何在文本集中创建所有字符组合?

    例如 我有这样的文本集 第 1 栏 a b 第 2 栏 l m n 第 3 栏 v w x y 我想将它们组合起来以获得如下输出 alv alw alx aly amv amw amx amy 这将输出 24 种文本组合 如果我只使用前两列
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • Matlab 的 imresize 函数中用于插值的算法是什么?

    我正在使用 Matlab Octaveimresize 对给定的二维数组重新采样的函数 我想了解如何使用特定的插值算法imresize works 我在Windows上使用八度 e g A 1 2 3 4 是一个二维数组 然后我使用命令 b
  • @(t)在Matlab中是什么意思? [复制]

    这个问题在这里已经有答案了 正如标题所示 考虑到下面的上下文 t 在 Matlab 中到底意味着什么 computeNumericalGradient 是一个函数 cofiCostFunc 也是一个接受一堆参数的函数 问题是 t 对 cof
  • matlab中求和函数句柄

    Hi我试图对两个函数句柄求和 但它不起作用 例如 y1 x x x y2 x x x 3 x y3 y1 y2 我收到的错误是 对于 function handle 类型的输入参数 未定义函数或方法 plus 这只是一个小例子 实际上我实际
  • MATLAB 列含义的内存分析

    我正在使用 MATLAB 配置文件来使用命令观察内存 profile memory on profile clear my code profile report and i got this table 1 我想问一下什么意思 已分配内存
  • 从动态 Java 类路径导入 Java 类时出现 Matlab 编译器 MCC 错误

    我怎样才能得到mcc识别来自用户提供的 Java 库的导入 还是简单地忽略无法解析的导入 我有一个使用 Matlab 编译器构建的 Matlab 代码库 但构建正在中断 因为mcc遇到的时候会报错importMatlab 动态类路径上的 J
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan

随机推荐

  • python字符串和列表的切片

    python字符串和列表的切片 前言1 切片字符串例子2 切片语法说明3 列表切片例子演练总结 前言 对于字符串和列表python提供了以 start end step 直观方式来截取字符串和列表一部分 xff0c 使用起来非常便利和直观
  • Debian安装

    欢迎访问爱招飞网站https www isoface cn获取更多物联网产品技术信息 Debian 是一个自由的操作系统 xff08 OS xff09 xff0c 提供您安装在计算机上使用 操作系统就是能让您的计算机工作的一系列基本程序和实
  • Java读取jar包中的resource资源文件

    目录 1 需求 2 问题 3 IDEA读取resource资源 3 1 方法1 3 2 方法2 4 打成jar包后读取resource资源 4 1 读取jar包中的资源文件 4 2 遍历jar包资源目录 4 2 1 环境判断 4 2 2 复
  • 【Excel】排名之成绩并列排名(sumproduct、countif 函数的组合使用方法)

    目录 一 应用场景 解决成绩并列排名 二 sumproduct countif 函数的官方语法说明 三 组合使用的解释 一 应用场景 解决成绩并列排名 在 Excel 的排名中 xff0c 不免会遇到 并列第一 xff0c 并列第X 的情况
  • Kotlin教程 各种View的声明赋值点击事件详解

    本章节讲述Kotlin中各种View的声明赋值点击事件 xff0c 比如TextView xff0c EditText xff0c ImageView 这些在Java语言中是最最基础的东西 写这篇文章的主要目的就是看一下Kotlin语言中有
  • QT连接MYSQL踩过的坑

    1 QT版本需要与mysql版本一致 xff0c 我测试成功的版本都是64位的情况 2 添加引用和链接 include 34 MainWindow h 34 include 34 ui MainWindow h 34 include inc
  • goodnotes导入文件需要密码,教你一招破解!

    很多用goodnotes或者其他ipad软件学习的小伙伴可能会遇到相同的问题 xff0c 就是有的文件在导入的时候会显示需要密码 我自己也是查了很多资料咨询了很多人 xff0c 百度上说的另存为一下有时候管用有时候不管用 最后总结了一下经验
  • 选择排序过程详解

    选择排序过程详解 1 xff0c 引入 和插入排序的插入一样 xff0c 选择更多的是一种思路 xff0c 使用这种思路排序的算法也有多种 xff1a 这篇文章要梳理的是其中最基础的一种 简单选择排序的确足够简单 xff0c 以至于我写完本
  • 在Termux上安装Kali Linux 完整系统

    安装Kali Linux前准备工作 xff1a 1 安装F Droid 开源软件商店 官网 2 使用F Droid商店安装Termux APK 注 xff1a 当然也是可以在play商店里安装Termux 但是可能会出现pkg 更新和安装错
  • Linux Mint 21 Cinnamon安装RSS阅读器FluentReader(FlatPak版))

    RSS新闻聚合阅读已经渐渐淡出了互联网 xff0c 这种阅读方式的力量如今可算是强弩之末了 xff0c 做为一名老网友 xff0c 笔者还通过更种方式 xff0c 找到一些阅读源 xff0c 然而如何选择阅读器就成了大问题 Google R
  • SSD与MobileNet详解

    1 概述 本文档阐述SSD检测算法原理 xff0c 及以MobileNet为Backbone的网络搭建方式 十里桃园首发 xff0c 转载请注明 Why SSD xff1f 无论是机器学习或是深度学习一般都可分为两个部分 xff1a 特征提
  • iOS XMPP简单聊天的实现

    简书中这位小伙伴写的还是不错滴 http www jianshu com p 8894a5a71b70
  • 如何将物理机Windows10操作系统迁移到VMware虚拟机(图文)

    如何将物理机Windows系统迁移到VMware虚拟机 xff08 图文 xff09 一 迁移物理系统到VMware虚拟机简述二 将物理机的Windows系统迁移到VMware虚拟机的过程步骤1 xff1a 在DiskGenius中打开VM
  • Google Colaboratory:一款用于深度学习的免费GPU使用方法

    Google Colaboratory xff1a 一款用于深度学习的免费GPU使用方法 一 Google Colab介绍二 Google Colab使用方法2 1 登陆Google云盘2 2 创建Google Colab类型文件2 3 C
  • Ubuntu 20.04安装Easyconnect及兼容性问题解决(亲测可用)

    Ubuntu 20 04安装Easyconnect及兼容性问题解决 一 Easyconnect客户端下载与安装1 1 Easyconnect客户端下载1 2 Easyconnect客户端安装 二 Ubuntu 20 04下Easyconne
  • Python实例:根据字典值对字典进行排序的三种方法

    Python实例 xff1a 根据字典值对字典进行排序的三种方法 一 实际场景及解决思路二 字典排序的三种实现方法2 1 使用列表解析方法实现字典排序2 2 使用 96 zip 96 方法实现字典排序2 3 使用传递 96 sorted 9
  • Python实例:含有多种分割符字符串拆分方法的详细解析

    Python实例 xff1a 含有多种分割符字符串拆分方法的详细解析 问题描述一 理解几个重要的内置函数1 1 split函数1 2 extend函数1 3 lambda匿名函数1 4 map函数 二 含有多种分割符字符串拆分方法2 1 直
  • python 刻度线在中间,让柱状图或者格子与刻度线对齐(总结版)

    画图的时候 xff0c 经常遇到刻度线和柱子 格子对不齐的情况 xff0c 看起来很奇怪 看了几篇博客后亲自实践了一下 xff0c 给出总结性的代码 其实就是把刻度线改一下位置 博客是 xff1a 博客1 博客2 下面是我原来的代码 xff
  • Python:自适应滤波器简介及其实现方法

    Python xff1a 自适应滤波器概述及其实现方法 一 自适应滤波器简介1 1 自适应滤波器原理 特点 分类及其作用1 2 自适应滤波器的数学表示方法 2 二 不同类型自适应滤波器的代码实现 3 2 1 时域自适应滤波器算法的实现2 1
  • Matlab:使用 Filtered-x LMS FIR 自适应滤波器实现有源噪声控制

    Matlab xff1a 使用 Filtered x LMS FIR 自适应滤波器实现有源噪声控制 一 有源噪声控制 Active Noise Control 二 次级传播路径的实现代码 Secondary Propagation Path