主要内容

dsp。FrequencyDomainAdaptiveFilter

使用频域FIR自适应滤波器计算输出、误差和系数

描述

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

使用频域FIR自适应滤波器对信号进行滤波:

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

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

有关系统对象如何工作的详细信息,请参见什么是系统对象?

创建

描述

例子

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

例子

fdaf= dsp。FrequencyDomainAdaptiveFilter (len返回一个频域FIR自适应滤波器对象长度属性设置为len

例子

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

例子:fdaf = dsp.FrequencyDomainAdaptiveFilter('Length',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时,System对象实现泄漏自适应算法。当该值为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值初始化为InitialCoefficients财产。为了得到滤波器系数的离散傅里叶变换,调用对象,并访问FFTCoefficients对象的属性。

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

使用

描述

y犯错= fdaf(x,d)对输入信号进行滤波,x,使用d作为所需的信号,并返回过滤后的输出y并且过滤器错误犯错.System对象估计所需的滤波器权重,以最小化输出信号和所需信号之间的误差。这些滤波器权重的FFT可以通过访问FFTCoefficients属性。

输入参数

全部展开

被频域FIR自适应滤波器滤波的信号。输入,x,和期望信号,d,必须具有相同的大小和数据类型。输入向量的长度必须能被BlockLength属性值。

输入,x,可以是可变大小的信号,只要帧长是的倍数BlockLength.即使对象被锁定,您也可以更改列向量中的元素数量。当您调用该对象以运行其算法时,System对象将锁定。

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

频域自适应滤波器调整其滤波器权值以使误差最小化,犯错,对输入信号进行收敛,x,到所需信号,d,尽可能地接近。

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

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

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

输出参数

全部展开

过滤后的输出,作为列向量返回。对象调整它的滤波器权重来收敛输入信号,x,以匹配所需的信号,d.滤波器输出收敛信号。

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

输出信号与所需信号之间的差值,作为列向量返回。自适应滤波器的目标是使这种误差最小化。该对象调整其权重以收敛于最优滤波器权重,从而产生与所需信号尽可能匹配的输出信号。有关如何操作的详细信息犯错的计算,请参见[2]

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

对象的功能

要使用对象函数,请将System对象指定为第一个输入参数。例如,释放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 =符号(randn(1,正常+ D)关系)+ 1我*签署(randn(1,正常+ D)关系);n = 0.1*(randn(1,ntr+D) + 1i*randn(1,ntr+D));R = filter(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。FFTCoefficients
fftCoeffs =1×64复杂我0.6802 - 0.6847 -0.2485 - 0.9427 -0.9675 - 0.2123 0.5748我-0.5605 + 0.8002 + 0.7593我0.8541 - 0.3917 -0.2526 - 0.9022 -0.9298 0.0181 + 0.9366 + 0.1255我0.9207 + 0.0511我0.1063 - 0.8972 -0.8919 - 0.1829 -0.2668 + 0.9113我0.9215 + 0.3186 0.3417 - 0.8859 -0.8285 - 0.3760 0.8741我-0.4317 + 0.8200 + 0.4765我0.4874 - 0.9075 -0.8517 - 0.4774 0.7632 -0.4709 + 0.7468 + 0.4833我0.5193 - 0.7995 -0.8218 - 0.5649 -0.5908 0.7316 + 0.5866 + 0.7768我0.5806 - 0.7270我-0.6287 + -0.7148 - 0.59980.6702i 0.6575 + 0.6379i 0.6332 - 0.7153i -0.7659 - 0.6424i -0.6678 + 0.7294i 0.6536 + 0.6891i 0.7006 - 0.63333 i -0.6594 + 0.6517i 0.6031 + 0.7239i 0.7362 - 0.5776i -0.5869 - 0.7682i -0.7975 + 0.5776i 0.5449 + 0.7992i 0.7909 - 0.5343i -0.8392 + 0.5338i 0.605 + 0.8493i 0.8358 - 0.3921i -0.8739 + 0.3785i 0.3625 + 0.9048i

绘制期望信号、输出信号和误差信号的同相分量和正交分量。

阴谋(1:正常,关系真实([d; y; e]))传说(“想要的”“输出”“错误”)标题(同相分量的)包含(“时间指数”);ylabel (的信号值

图中包含一个轴对象。标题为In-Phase Components的axes对象包含3个类型为line的对象。这些对象表示期望、输出、错误。

阴谋(1:正常,关系图像放大([d; y; e]))传说(“想要的”“输出”“错误”)标题(“正交组件”)包含(“时间指数”) ylabel (的信号值

图中包含一个轴对象。标题为Quadrature Components的axes对象包含3个类型为line的对象。这些对象表示期望、输出、错误。

创建接收信号和期望信号的散点图。

情节(x(正常- 100:关系正常)的关系,“。”轴([-3 3 -3 3])“接收信号散点图”)轴(“广场”)包含(“真正的[x]”) ylabel (图像放大[x]”网格)

图中包含一个轴对象。标题为“接收信号散点图”的axis对象包含一个类型为line的对象。

情节(d(正常- 100:关系正常)的关系,“。”轴([-3 3 -3 3])“期望信号散点图”)轴(“广场”)包含(“真正的[y]”) ylabel (图像放大[y]”网格)

图中包含一个轴对象。标题为“期望信号散点图”的axis对象包含一个类型为line的对象。

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

情节(y(正常- 100:关系正常)的关系,“。”轴([-3 3 -3 3])“均衡信号散点图”)轴(“广场”)包含(“真正的[y]”) ylabel (图像放大[y]”网格)

图中包含一个轴对象。标题为“均衡信号散点图”的axis对象包含一个类型为line的对象。

利用频域自适应滤波器估计长FIR滤波器的系数。FIR滤波器模拟房间的脉冲响应。在频域自适应滤波器中采用分区方式,减少滤波器延迟。

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

初始化

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

Fs = 16e3;M = 8192;[b,a] = cheby2(4,20,[0.1 0.7]);impulse esponsegenerator = dsp。IIRFilter (...“分子”, [0 (1,6) b],...“分母”,);roomimpulse esponsegenerator (...(日志兰德(1米)+(0.99 * 0.01)。*标志(randn(1米)。* exp (-0.002 * (1: m))) ');roomimpulse esponse = roomimpulse esponse/norm(roomimpulse esponse);房间= dsp。FIRFilter (“分子”roomImpulseResponse ');Lmsfilt = dsp。FrequencyDomainAdaptiveFilter (...“方法”“分区约束FDAF”...“长度”米/ 4...“BlockLength”, 128,...“StepSize”, 0.025,...“InitialPower”, 0.01,...“AveragingFactor”, 0.98,...“抵消”, 1...“LeakageFactor”1);FrameSize = lmsfilt.BlockLength;镍= 2000;AP = dsp。ArrayPlot (“YLimits”(-0.2。2),“ShowLegend”,真的,...“位置”,[0 0 560 420],“ChannelNames”...“实际系数”“估计系数”});时间计(“SampleRate”fs,“TimeSpanSource”“属性”...“时间间隔”FrameSize *硝石/ fs,...“TimeUnits”“秒”...“YLimits”(-50 0),“标题”“学习曲线”...“YLabel”“数据库”...“BufferLength”, FrameSize *硝石,...“ShowGrid”,真正的);Signalmean = dsp。MovingAverage (“SpecifyWindowLength”、假);

流媒体

函数生成一个随机输入信号randn函数。输入的帧大小与自适应滤波器的块长度相匹配。所期望的信号是FIR滤波器(房间)输出和高斯白噪声信号的和。将输入信号和所需信号传递给自适应滤波器。计算自适应滤波器输出和输出与所需信号之间的误差。

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

k = 1:NIter x = randn(FrameSize,1);d =房间(x) + 0.01*randn(FrameSize,1);[y,e] = lmsfilt(x,d);FFTCoeffs = lmsfilt.FFTCoefficients;w = ifft(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算法(FBLMS)实现了误差估计和轻敲权重自适应。

参考文献

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

Farhang-Boroujeny, B,自适应滤波器:理论与应用,英国奇切斯特,Wiley, 1998年。

[3]小t.g.斯托克汉姆《高速卷积与相关》1966年春季联合计算机会议论文集Vol. 28, 1966, pp. 229-233。

扩展功能

在R2013b中引入