主要内容

dsp。FrequencyDomainAdaptiveFilter

使用频域CIR自适应滤波器计算输出,错误和系数

描述

dsp。FrequencyDomainAdaptiveFilter系统对象™使用快速块最小均方(LMS)算法在频域中实现自适应有限脉冲响应(FIR)滤波器。这长度BlockLength属性指定滤波器长度和块长度值算法使用。这Fftcoeffients.属性包含当前滤波器系数的离散傅立叶变换。该对象提供具有分区和非分区模式的算法的受约束和无约束版本。有关详细信息,请参阅算法

使用频率域FIR自适应滤波器过滤信号:

  1. 创建dsp。FrequencyDomainAdaptiveFilter对象,并设置其属性。

  2. 使用参数调用对象,就像调用函数一样。

要了解有关系统对象如何工作的更多信息,请参阅什么是系统对象?

创建

描述

例子

FDAF.= dsp。FrequencyDomainAdaptiveFilter返回频域FIR自适应滤波器系统对象,FDAF..该系统对象用于计算给定输入和期望信号的滤波输出和滤波误差。

例子

FDAF.= dsp。FrequencyDomainAdaptiveFilter (len返回频域CIR自适应过滤器对象长度物业设为len

例子

FDAF.= dsp。FrequencyDomainAdaptiveFilter (___名称,价值返回一个频率域FIR自适应滤波器对象,每个指定的属性设置为指定的值。将每个属性名用引号括起来。您可以将此语法与之前的任何输入参数组合一起使用。

例子:fdaf = dsp.FrequencyDomainAdaptiveFilter(“长度”,32岁的“StepSize”,0.1)模拟频域自适应滤波器,长度为32个抽头,台阶尺寸为0.1。

属性

全部展开

除非另有说明,属性是nontunable,这意味着您不能在调用对象之后更改它们的值。对象在调用时锁定,而发布函数打开它们。

如果一个属性是可调,您可以随时更改其值。

有关更改属性值的更多信息,请参见MATLAB使用系统对象的系统设计

用于计算滤波器系数的方法,指定为:

  • '受限fdaf'对过滤器抽头权重施加一个梯度约束。

  • “无约束FDAF”- 过滤器抽头重量不施加梯度约束。

  • “分区限制FDAF”- 分区过滤器的脉冲响应以减少延迟。

  • '分区不受约束FDAF'- 分区过滤器的脉冲响应以减少延迟。在滤波器抽头重量上没有施加梯度约束。

有关详细信息,请参见算法

FIR滤波器系数向量的长度,指定为一个正的整值标量。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

系数更新的块长度,指定为正整数值的标量。自适应滤波器将输入数据和所需信号处理为由该属性设置的长度样本块。有关过滤器处理此数据的详细信息,请参阅算法.输入载体的长度必须可被划分BlockLength属性值。的默认值BlockLength属性的值长度财产。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

自适应步长因子,指定为(0,1)范围内的实标量。使用较小的步长可以确保较小的稳态误差。然而,小步长会降低自适应滤波器的收敛速度。增大步长可以提高收敛速度,但代价是稳态均方误差增大。当步长值为1,该算法在收敛速度和稳态均方误差之间进行了最优权衡。

可调:是的

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64|逻辑

实现泄漏自适应滤波器时使用的泄漏因子指定为范围的标量数值[0,1]。当值小于1时,系统对象实现泄漏的自适应算法。当值为1时,对象在适应方法中不提供泄漏。

可调:是的

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64|逻辑

用于计算用于系数更新的指数窗口的FFT输入信号功率的平均因子,指定为范围(0,1]的实际标量。

可调:是的

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64|逻辑

在系数更新中偏移归一化术语,指定为非负实际标量值。如果任何FFT输入信号功率变得非常小,则使用该属性值以避免零或分割非常小的数字。

可调:是的

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

所有FFT输入信号功率的初始公共值,指定为一个正数值标量。

如果在锁定对象后修改该值,则需要重置对象后才会生效。

可调:是的

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

自适应滤波器的初始时域系数,指定为长度等于的标量或向量长度属性值。自适应滤波器对象使用这些系数来计算初始频域滤波器系数。

如果在锁定对象后修改该值,则需要重置对象后才会生效。

可调:是的

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

系数更新的锁定状态,具体为:

  • 错误的- 该对象不断更新滤波器系数。

  • 真的过滤系数不会被更新,它们的值保持在当前值。

可调:是的

数据类型:逻辑

此属性是只读的。

滤波器系数的电流离散傅里叶变换,作为行向量返回。为了'受限fdaf'“无约束FDAF”算法,该矢量的长度等于长度价值和BlockLength价值。属性的FFT值初始化initialcoeffients.财产。要得到滤波器系数的离散傅里叶变换,调用对象,并访问Fftcoeffients.物品的财产。

数据类型:|
复数支持:金宝app是的

用法

描述

[y] = FDAF(X,D)过滤输入信号,X,使用D.作为所需信号,并返回滤波后的输出y和过滤器错误.System对象估计所需的滤波器权重,以最小化输出信号和期望信号之间的误差。这些滤波器权重的FFT可以通过访问Fftcoeffients.属性在调用对象算法之后。

输入参数

全部展开

通过频域FIR自适应滤波器过滤信号。输入,X,以及所需的信号,D.,必须具有相同的大小和数据类型。输入载体的长度必须可被划分BlockLength属性值。

输入,X,只要帧长度是帧的倍数,就可以是可变尺寸的信号BlockLength.即使当对象被锁定,您也可以更改列向量中的元素数。当您调用对象以运行其算法时,系统对象锁定。

数据类型:|
复数支持:金宝app是的

频域自适应滤波器通过调整滤波权值来减小误差,,并收敛输入信号,X,转换为所需的信号,D.,越近越好。

输入信号和所需信号必须具有相同的大小和数据类型。所要求的信号向量的长度必须能被BlockLength属性值。

只要帧长度是帧的倍数,输入信号就可以是可变尺寸的信号BlockLength.即使当对象被锁定,您也可以更改列向量中的元素数。当您调用对象以运行其算法时,系统对象锁定。

数据类型:|
复数支持:金宝app是的

输出参数

全部展开

过滤的输出,作为列向量返回。对象调整其滤波器权值以收敛输入信号,X,以匹配所需的信号,D..过滤器输出融合信号。

数据类型:|
复数支持:金宝app是的

输出信号与期望信号之间的差值,以列向量的形式返回。自适应滤波器的目标是使这个误差最小化。该对象调整其权值,使其收敛于最优滤波器权值,从而产生尽可能与期望信号匹配的输出信号。了解更多细节计算,看到[2]

数据类型:|
复数支持:金宝app是的

对象功能

要使用对象函数,请将System对象指定为第一个输入参数。例如,要发布命名的系统对象的系统资源obj.,使用此语法:

释放(obj)

全部展开

一步 运行系统对象算法
发布 释放资源并允许更改系统对象属性值和输入特性
重置 重置内部状态系统对象

例子

全部收缩

传输正交相移键控(QPSK)信号通过一个噪声传输信道。使用频域自适应滤波器最小化接收信号中的噪声。

笔记:如果您使用的是R2016A或早期版本,请使用等效步骤语法替换对对象的每个调用。例如,obj (x)成为步骤(obj, x)

QPSK信号,年代,在嘈杂的频道上传输。通道的分子和分母系数包含在向量中B.一种, 分别。收到的信号,r,传输信道末端得到的包含传输的QPSK信号和添加到信道的噪声,N.自适应滤波器用于从接收的嘈杂输入中提取QPSK信号。所需的信号,D,是QPSK信号的延迟版本。

d = 16;b = exp(1i * pi / 4)* [ -  0.7 1];a = [1 -0.7];ntr = 1024;s = sign(randn(1,ntr + d))+ 1i * sign(randn(1,ntr + d));n = 0.1 *(Randn(1,NTR + D)+ 1I * RANDN(1,NTR + D));r =滤波器(b,a,s)+ n;X = R(1 + D:NTR + D);d = s(1:ntr);

创建一个dsp。FrequencyDomainAdaptiveFilter对象建模一个频域自适应滤波器的长度为32点,步长为0.1。自适应滤波器接受接收信号的延迟版本和期望的信号作为输入。自适应滤波器的输出与期望的信号进行比较。两个信号之间的误差表示添加到传输信道的噪声。自适应滤波器更新它的系数,直到这个误差变得最小。要得到滤波器系数的离散傅里叶变换,记作FDAF.对象,并访问该对象的FFTCoefficients属性。

mu = 0.1;fdaf = dsp.frequencyDomainAdaptiveFilter(“长度”32岁的“StepSize”,亩);[y,e] = fdaf(x,d);fftcoeffs = fdaf.fftcoefficents
fftcoeffs =1×64复合物0.6802  -  0.6847I -0.2485  -  0.9427I -0.9675  -  0.2123I -0.5605 + 0.8002i 0.5748 + 0.7593I 0.8541  -  0.3917I -0.2526  -  0.9022I -0.9298 + 0.1255I 0.0181 + 0.05111 0.9207 + 0.0511I 0.1063  -0.。8919 - 0.1829i -0.2668 + 0.9113i 0.9215 + 0.3186i 0.3417 - 0.8859i -0.8285 - 0.3760i -0.4317 + 0.8200i 0.8741 + 0.4765i 0.4874 - 0.9075i -0.8517 - 0.4774i -0.4709 + 0.7632i 0.7468 + 0.4833i 0.5193 - 0.7995i -0.8218 - 0.5649i -0.5908 + 0.7768i 0.7316 + 0.5866i 0.5806 - 0.7270i -0.7148 - 0.5998i -0.6287 + 0.6702i 0.6575 + 0.6379i 0.6332 - 0.7153i -0.7659 - 0.6424i -0.6678 + 0.7294i 0.6536 + 0.6891i 0.7006 - 0.6333i -0.6594 - 0.7117i -0.7207 + 0.6517i 0.6031 + 0.7239i 0.7362 - 0.5776i -0.5869 - 0.7682i -0.7975 + 0.5789i 0.5449 + 0.7992i 0.7909 - 0.5343i -0.5512 - 0.8070i -0.8392 + 0.5338i 0.4605 + 0.8493i 0.8358 - 0.3921i -0.3751 - 0.8388i -0.8739 + 0.3785i 0.3625 + 0.9048i

绘制所需输出和误差信号的同相分量和正交分量。

图(1:NTR,Real([D; Y; ​​e]))传奇('想要''输出''错误')标题('同步组​​件')包含(“时间指数”);ylabel ('信号值'

图(1:NTR,IMAG([D; Y; ​​E]))传奇('想要''输出''错误')标题('正交组件')包含(“时间指数”) ylabel ('信号值'

创建接收信号的散点图和所需信号。

绘图(x(NTR-100:NTR),'。')轴([-3 3 -3])标题('接收信号散射图')轴(“广场”)包含('真的[x]') ylabel (图像放大[x]”网格)

绘图(D(NTR-100:NTR),'。')轴([-3 3 -3])标题('所需的信号散点图')轴(“广场”)包含('真的[Y]') ylabel ('Imag [Y]'网格)

自适应滤波器均衡接收信号以消除噪声。绘制均衡信号的散点图。

绘图(y(ntr-100:ntr),'。')轴([-3 3 -3])标题('均等的信号散射图')轴(“广场”)包含('真的[Y]') ylabel ('Imag [Y]'网格)

使用频域自适应滤波器来估计长源滤波器的系数。FIR滤波器模拟房间的脉冲响应。使用频域自适应滤波器中的分区模式以降低过滤延迟。

注意:此示例仅在R2018A或更高版本中运行。

初始化

生成一个8192个样本的长FIR脉冲响应,并将脉冲响应赋给adsp。FIRFilter对象,房间.该对象模拟了房间的脉冲响应。创建一个dsp。FrequencyDomainAdaptiveFilter过滤器,lmsfilt,分区约束模式。将过滤器的长度设置为房间脉冲响应长度的四分之一。设置过滤器的块长度为128个样本。将步长设置为0.025,初始功率设置为0.01,平均因子设置为0.98,偏移量设置为1,泄漏因子设置为1。初始化A.dsp.arrayplot.对象以查看滤波器系数。初始化A.Timescope.对象显示滤波器输出和所需信号之间的平均平均误差。

fs = 16e3;m = 8192;[B,A] = Cheby2(4,20,[0.1 0.7]);脉冲响应天才= dsp.iirfilter(...'分子',[零(1,6)b],...“分母”, 一种);roomimpulseresponse =阻止响应atchentenerator(...(日志兰德(1米)+(0.99 * 0.01)。*标志(randn(1米)。* exp (-0.002 * (1: m))) ');roomImpulseResponse = roomImpulseResponse /规范(roomImpulseResponse);房间= dsp。FIRFilter ('分子',roomimpulseresponse');lmsfilt = dsp.frequencydomainAdaptiveFilter(...“方法”“分区限制FDAF”...“长度”米/ 4...'blockLength',128,...“StepSize”, 0.025,...“InitialPower”, 0.01,...“AveragingFactor”,0.98,...“抵消”, 1...'泄漏就能'1);FrameSize = lmsfilt.BlockLength;硝石= 2000;美联社= dsp。ArrayPlot ('ylimits',[ -  0.2 .2],'陈旧',真的,...'位置',[0 560 420],'ChannelNames'...{“实际系数”'估计系数'});TS = timescope (“SampleRate”,fs,'timespansource''财产'...“时间间隔”,框架* niter / fs,...“TimeUnits”'秒'...'ylimits',[ -  50 0],'标题''学习曲线'...“YLabel”“数据库”...'bufferLength',框架* niter,...'showgrid',真的);signalmean = dsp.movi​​ngaverage('specifywindowlength'、假);

流媒体

使用该方法生成随机输入信号randn功能。输入的帧大小与自适应滤波器的块长度匹配。所需信号是FIR滤波器(室)的输出和白色高斯噪声信号的总和。将输入信号和所需信号传递给自适应滤波器。计算自适应滤波器输出和输出和所需信号之间的误差。

对所返回的频域系数向量取IFFT,估计自适应滤波器的时域系数lmsfilt。Fftcoeffients.财产。将估计系数与分配给FIR滤波器的实际系数进行比较(房间)。一旦自适应滤波器的输出收敛到期望的信号,并使误差信号最小化,估计的系数就与实际系数紧密匹配。这意味着自适应滤波器成功地适应了FIR滤波器(室)的脉冲响应模型。

为了k = 1:NIter x = randn(FrameSize,1); / /d = room(x) + 0.01*randn(FrameSize,1);[y, e] = lmsfilt (x, d);FFTCoeffs = lmsfilt.FFTCoefficients;w =传输线(FFTCoeffs, [], 2,“对称”);w = w(:,1:FrameSize) + w(:,FrameSize+1:end);w =重塑(w。',1 m / 4);美联社([roomImpulseResponse (1: m / 4)、w。');TS (10 * log10 (signalmean (abs (e) ^ 2)));结尾

由于滤波器适应时间,您可以看到,在时间范围内,均方误差变得最小。同时,在阵列图中,估计的系数与实际系数吻合较好。

算法

全部展开

频域自适应过滤由三个步骤 - 过滤,误差估计和抽头重量自适应组成。此算法使用重叠保存或重叠添加方法在频域中实现FIR滤波。有关这两种方法的更多实施细节,请参阅算法部分的dsp。FrequencyDomainFIRFilter对象页面。使用快速块LMS算法(FBLM)来实现误差估计和抽头权重自适应。

参考

[1] Shynk, J.J.频域和多速率自适应滤波。IEEE信号处理杂志。第9卷,第1期,1992年,14-37页。

[2] Farhang-Boroujeny, B。,自适应过滤器:理论和应用,奇斯特,英国,Wiley,1998。

小t·G·斯托克汉姆“高速卷积和相关。”1966年春季联合计算机会议论文集,卷。28,1966,第229-233页。

扩展功能

介绍在R2013B.