webrtc AEC 线性滤波 PBFDAF(均匀分块频域自适应滤波)介绍

2023-11-25 13:45

本文主要是介绍webrtc AEC 线性滤波 PBFDAF(均匀分块频域自适应滤波)介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

计算一个脉冲响应和输入信号的卷积,除了使用原始的时域卷积以外,还有如下方法:

  1. FFT卷积的方法:对输入信号(长度M)和脉冲响应(长度N)分别补零到K(K>M+N-1),然后分别计算FFT,然后相乘,最后反FFT,取前M+N-1个元素作为最终的卷积结果
  2. 输入信号很长时,将输入信号分成一帧一帧,使用overlap-add或者overlap-save的方法
  3. 当脉冲信号和输入信号都很长时,可使用均匀分块卷积

均匀分块卷积

        均匀分块卷积与频域自适应滤波(FDAF)结合,就是WebRTC AEC中线性滤波处理中的算法核心。

在介绍PBFDAF之前,我们来看一下均匀分块卷积的计算流程图:

我们分几个部分讲解上图的计算流程:

1、脉冲响应分块

        如上图红色矩形部分,将脉冲响应分成P个等长的不重叠的小块,每小块的长度为B,我们把这些小块叫做子滤波器(filter part 1,2...P),将每个小块后面补B个零,分别构成2B长度的序列,然后进行实数FFT。我们知道实数序列的FFT结果具有对称性,因此实数FFT返回B+1个点(类似numpy的rfft.fft)

2、将输入信号分块

        如上图红色线框内的部分,将输入信号分成不重叠的等长的分块(帧),分块长度为B,通过一个buffer构造重叠长度为B,这样输入buffer的长度为2B,将输入buffer进行实数FFT,得到B+1个复数结果。然后将fft结果存入一个长度为P的队列,队列进口处存储最新的输入buffer fft结果,旧的输入buffer的fft结果从队列的出口扔掉。这个队列有个名字叫Frequency-domain delay line。

3、频域相乘相加和反变换

        第三部分如上图红色矩形内,将第一部分准备的P个分块脉冲响应的FFT结果分别与第二部分形成的输入buffer fft结果的队列分别相乘,然后沿着P的方向求和。得到B+1长度的FFT结果,然后在进行复数到实数的IFFT(如numpy.rfft.ifft),输出是2B个实数序列,取后B个元素作为输入block对于的输出。

WebRTC AEC中的分块卷积

    % FD block method% ----------------------   Organize dataxk = rrin(pos:pos+N-1);dk = ssin(pos:pos+N-1);xx = [xo;xk];xo = xk;tmp = fft(xx); XX = tmp(1:N+1);% ----------------------   Filtering   XFm(:,1) = XX;for mm=0:(M-1)m=mm+1;  YFb(:,m) = XFm(:,m) .* WFb(:,m);endyfk = sum(YFb,2);tmp = [yfk ; flipud(conj(yfk(2:N)))];ykt = real(ifft(tmp));ykfb = ykt(end-N+1:end); 

xk是近端麦克风输入信号,要对近端信号进行线性滤波,得到估计的回声信号。

xx就是输入buffer,xk是输入的N个样本点,xo是上一次的输入N个样本点。对输入buffer进行傅里叶变换的到XX,将XX存入XFm,XFm就是频域的那个队列

然后将队列中各个输入buffer的fft结果与WFb进行相乘相加。WFb就是存放脉冲响应分块傅里叶变换的结果,因为这是自适应滤波,所以WFb矩阵的初始值的元素全部是0。M与上文中的P对应,N与上文中的B对应

WebRTC AEC中的PBFDAF

% Partitioned block frequency domain adaptive filtering NLMS and 
% standard time-domain sample-based NLMS 
%fid=fopen('aecFar-samsung.pcm', 'rb'); % Load far end
fid=fopen('aecFar.pcm', 'rb'); % Load far end
%fid=fopen(farFile, 'rb'); % Load far end
rrin=fread(fid,inf,'int16');
fclose(fid); 
%rrin=loadsl('data/far_me2.pcm'); % Load far end
%fid=fopen('aecNear-samsung.pcm', 'rb'); % Load near end
fid=fopen('aecNear.pcm', 'rb'); % Load near end
%fid=fopen(nearFile, 'rb'); % Load near end
ssin=fread(fid,inf,'int16');
%ssin = [zeros(1024,1) ; ssin(1:end-1024)];
fclose(fid);
rand('state',13);
fs=16000;
mult=fs/8000;
%rrin=rrin(fs*0+1:round(fs*120));
%ssin=ssin(fs*0+1:round(fs*120));% Flags
NLPon=0;  % NLP
CNon=0; % Comfort noise
PLTon=1;  % Plotting
M = 16; % Number of partitions
N = 64; % Partition length
L = M*N; % Filter length 
if fs == 8000mufb = 0.6;
elsemufb = 0.5;  
end
%mufb=1;  alp = 0.1; % Power estimation factor alc = 0.1; % Coherence estimation factorlen=length(ssin);
w=zeros(L,1); % Sample-based TD NLMS 
WFb=zeros(N+1,M); % Block-based FD NLMS
WFbOld=zeros(N+1,M); % Block-based FD NLMS
YFb=zeros(N+1,M);
erfb=zeros(len,1);zm=zeros(N,1);
XFm=zeros(N+1,M);pn0=10*ones(N+1,1);
pn=zeros(N+1,1);
NN=len;
Nb=floor(NN/N)-M;start=1;
xo=zeros(N,1);
do=xo;
eo=xo;for kk=1:Nbpos = N * (kk-1) + start;% FD block method% ----------------------   Organize dataxk = rrin(pos:pos+N-1);dk = ssin(pos:pos+N-1);xx = [xo;xk];xo = xk;tmp = fft(xx); XX = tmp(1:N+1);% ------------------------  Power estimationpn0 = (1 - alp) * pn0 + alp * real(XX.* conj(XX));pn = pn0;%pn = (1 - alp) * pn + alp * M * pn0;% ----------------------   Filtering   XFm(:,1) = XX;for mm=0:(M-1)m=mm+1;  YFb(:,m) = XFm(:,m) .* WFb(:,m);endyfk = sum(YFb,2);tmp = [yfk ; flipud(conj(yfk(2:N)))];ykt = real(ifft(tmp));ykfb = ykt(end-N+1:end); % ----------------------   Error estimation ekfb = dk - ykfb; erfb(pos:pos+N-1) = ekfb; tmp = fft([zm;ekfb]);      % FD version for cancelling part (overlap-save)Ek = tmp(1:N+1);% ------------------------  Adaptation  Ek2 = Ek ./(M*pn + 0.001); % Normalized errorabsEf = max(abs(Ek2), threshold);absEf = ones(N+1,1)*threshold./absEf;Ek2 = Ek2.*absEf; % 让EK2限定到thresholdmEk = mufb.*Ek2;PP = conj(XFm).*(ones(M,1) * mEk')';  %计算线性相关tmp = [PP ; flipud(conj(PP(2:N,:)))];IFPP = real(ifft(tmp));PH = IFPP(1:N,:);tmp = fft([PH;zeros(N,M)]);FPH = tmp(1:N+1,:);WFb = WFb + FPH;XFm(:,2:end) = XFm(:,1:end-1);endaudiowrite('aec_out.wav', erfb/32768, fs);

这篇关于webrtc AEC 线性滤波 PBFDAF(均匀分块频域自适应滤波)介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/423918

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Open3D 基于法线的双边滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 输入参数: 输出参数: 参数影响: 2.2完整代码 三、实现效果 3.1原始点云 3.2滤波后点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述         基于法线的双边

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

6.4双边滤波

目录 实验原理 示例代码1 运行结果1 实验代码2 运行结果2 实验原理 双边滤波(Bilateral Filtering)是一种非线性滤波技术,用于图像处理中去除噪声,同时保留边缘和细节。这种滤波器结合了空间邻近性和像素值相似性的双重加权,从而能够在去噪(平滑图像)的同时保留图像的边缘细节。双边滤波器能够在的同时,保持边缘清晰,因此非常适合用于去除噪声和保持图像特征。在Op

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系